FastComments.com

L'API di FastComments

FastComments fornisce un'API per interagire con molte risorse. Crea integrazioni con la nostra piattaforma, o persino costruisci i tuoi client!

In questa documentazione troverai tutte le risorse supportate dall'API documentate con i loro tipi di richiesta e risposta.

Per i clienti Enterprise, tutto l'accesso all'API viene registrato nel registro di audit.

SDK generati

FastComments ora genera una Specifiche API dal nostro codice (non è ancora completa, ma include molte API).

Abbiamo inoltre SDK per i linguaggi più diffusi:

Autenticazione

L'API si autentica passando la tua chiave API come intestazione X-API-KEY oppure come parametro di query API_KEY. Avrai anche bisogno del tuo tenantId per effettuare chiamate API. Puoi recuperarlo dalla stessa pagina della tua chiave API.

Nota sulla sicurezza

Questi endpoint sono pensati per essere chiamati da un server. NON CHIAMARLI da un browser. In questo modo esporrai la tua chiave API - ciò concederà accesso completo al tuo account a chiunque possa visualizzare il codice sorgente di una pagina!

Opzione di autenticazione uno - Intestazioni

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

Opzione di autenticazione due - Parametri di query

  • Query Param: API_KEY
  • Query Param: tenantId

Struttura dei log di audit Internal Link


Un AuditLog è un oggetto che rappresenta un evento sottoposto ad audit per i tenant che hanno accesso a questa funzionalità.

La struttura dell'oggetto AuditLog è la seguente:

Struttura di 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

Il registro di audit è immutabile. Inoltre non può essere scritto manualmente. Solo FastComments.com può decidere quando scrivere nel registro di audit. Tuttavia, è possibile leggerlo tramite questa API.

Gli eventi nel registro di audit scadono dopo due anni.


Struttura del commento Internal Link

Un oggetto Comment rappresenta un commento lasciato da un utente.

La relazione tra commenti genitore e figli è definita tramite parentId.

La struttura dell'oggetto Comment è la seguente:

Struttura del Commento
Copy Copy
1
2interface Comment {
3 /** SOLO LETTURA: Impostato su true se il motore antispam ha determinato che il commento era spam. **/
4 aiDeterminedSpam?: boolean
5 /** Indica se il commento è approvato per la visualizzazione. Impostato su true quando si salva il commento, altrimenti sarà nascosto. **/
6 approved?: boolean
7 /** L'avatar dell'utente. **/
8 avatarSrc?: string
9 /** Commenti figli. Non popolato in tutti gli scenari. Usato quando asTree è impostato su true tramite l'API. **/
10 children: Comment[]
11 /** Il commento grezzo dell'utente. **/
12 comment: string
13 /** SOLO LETTURA: Il commento dell'utente parsato in HTML. **/
14 commentHTML?: string
15 /** L'email dell'autore del commento. Richiesta se i commenti anonimi sono disabilitati. **/
16 commenterEmail?: string
17 /** Il link dell'autore del commento (per esempio, il loro blog). **/
18 commenterLink?: string
19 /** Il nome dell'autore del commento. Sempre richiesto. Se non disponibile, impostare qualcosa come "Anonimo". **/
20 commenterName: string
21 /** La data in cui è stato inserito il commento, in epoch UTC. **/
22 date: number
23 /** L'"etichetta di visualizzazione" per il commento - per esempio "Admin", "Moderator", o qualcosa come "VIP User". **/
24 displayLabel?: string
25 /** Il dominio su cui è stato pubblicato il commento. **/
26 domain?: string
27 /** SOLO LETTURA: Il numero di volte in cui il commento è stato segnalato. **/
28 flagCount?: number
29 /** Gli #hashtag scritti nel commento che sono stati correttamente parsati. È anche possibile aggiungere manualmente hashtag per le query, ma non verranno visualizzati automaticamente nel testo del commento. **/
30 hashTags?: CommentHashTag[]
31 /** SOLO LETTURA: Il commento contiene immagini? **/
32 hasImages?: boolean
33 /** SOLO LETTURA: Il commento contiene link? **/
34 hasLinks?: boolean
35 /** SOLO LETTURA: L'id univoco del commento. **/
36 id: string
37 /** Solo alla creazione! Viene hashato per l'archiviazione. **/
38 ip?: string
39 /** SOLO LETTURA: L'utente corrente ha bloccato l'autore di questo commento? **/
40 isBlocked?: boolean
41 /** SOLO LETTURA: Il commento è stato scritto da un admin? Impostato automaticamente in base a userId. **/
42 isByAdmin?: boolean
43 /** SOLO LETTURA: Il commento è stato scritto da un moderatore? Impostato automaticamente in base a userId. **/
44 isByModerator?: boolean
45 /** Impostato su true se il commento è stato eliminato "soft" (è stato lasciato un segnaposto a causa di qualche altra configurazione). **/
46 isDeleted?: boolean
47 /** Impostato su true se l'account dell'utente è stato eliminato e il commento è stato mantenuto. **/
48 isDeletedUser?: boolean
49 /** SOLO LETTURA: È stato segnalato dall'utente attualmente connesso (contextUserId)? **/
50 isFlagged?: boolean
51 /** Il commento è fissato in alto (pinned)? **/
52 isPinned?: boolean
53 /** Il commento è bloccato per nuove risposte (i moderatori possono ancora rispondere)? **/
54 isLocked?: boolean
55 /** Il commento è spam? **/
56 isSpam?: boolean
57 /** SOLO LETTURA: Il commento è stato votato negativamente dall'utente corrente (contextUserId)? **/
58 isVotedDown?: boolean
59 /** SOLO LETTURA: Il commento è stato votato positivamente dall'utente corrente (contextUserId)? **/
60 isVotedUp?: boolean
61 /** La locale del commento. Se non fornita, verrà ricavata dall'header 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 /** SOLO LETTURA: Le @mention scritte nel commento che sono state correttamente analizzate. **/
64 mentions?: CommentUserMention[]
65 /** Metadati opzionali associati al commento. **/
66 meta?: Record<string, string | number | boolean>
67 /** L'elenco opzionale degli id dei gruppi di moderazione associati a questo commento. **/
68 moderationGroupIds?: string[]|null
69 /** SOLO LETTURA: L'id dell'oggetto voto che corrisponde al voto dell'utente corrente (contextUserId) su questo commento. **/
70 myVoteId?: string
71 /** Indica se sono state inviate notifiche per questo commento agli autori. Per evitare l'invio di notifiche durante le importazioni, impostare su true. **/
72 notificationSentForParent?: boolean
73 /** Indica se sono state inviate notifiche per questo commento agli utenti del tenant. Per evitare l'invio di notifiche durante le importazioni, impostare su true. **/
74 notificationSentForParentTenant?: boolean
75 /** Il titolo della pagina su cui era presente questo commento. **/
76 pageTitle?: string
77 /** Se stiamo rispondendo a un commento, questo è l'ID a cui stiamo rispondendo. **/
78 parentId?: string|null
79 /** Indica se il commento è contrassegnato come revisionato. **/
80 reviewed: boolean
81 /** L'id del tenant a cui appartiene il commento. **/
82 tenantId: string
83 /** L'utente che ha scritto il commento. Creato automaticamente quando si salva un commento con nome/email. **/
84 userId?: string|null
85 /** L'URL della posizione in cui questo commento è visibile, come un post del blog. **/
86 url: string
87 /** Una versione "pulita" dello urlId che ci hai fornito. Durante il salvataggio specifichi questo campo, ma quando recuperi il commento questo verrà "pulito" e il valore originale spostato in "urlIdRaw". **/
88 urlId: string
89 /** SOLO LETTURA: Lo urlId originale che ci hai fornito. **/
90 urlIdRaw?: string
91 /** L'utente e questo commento sono verificati? **/
92 verified: boolean
93 /** Numero di voti positivi. **/
94 votesUp?: number
95 /** Numero di voti negativi. **/
96 votesDown?: number
97 /** Il "karma" del commento (= voti positivi - voti negativi). **/
98 votes?: number
99}
100

Alcuni di questi campi sono contrassegnati come READONLY - vengono restituiti dall'API ma non possono essere impostati.

Struttura del Testo del Commento

I commenti sono scritti in una variante di markdown di FastComments, che è semplicemente markdown più i tradizionali tag in stile bbcode per le immagini, ad esempio [img]path[/img].

Il testo è memorizzato in due campi. Il testo inserito dall'utente è memorizzato non modificato nel campo comment. Questo viene renderizzato e memorizzato nel campo commentHTML.

I tag HTML consentiti sono b, u, i, strike, pre, span, code, img, a, strong, ul, ol, li, and br.

Si consiglia di renderizzare l'HTML, dato che è un sottinsieme molto piccolo di HTML: creare un renderer è piuttosto semplice. Esistono diverse librerie per React Native e Flutter, ad esempio, che possono aiutare in questo

È possibile scegliere di renderizzare il valore non normalizzato del campo comment. Un parser di esempio è qui..

Il parser di esempio può anche essere adattato per funzionare con HTML e trasformare i tag HTML negli elementi attesi da renderizzare per la tua piattaforma.

Menzioni

Quando gli utenti vengono taggati in un commento, le informazioni vengono memorizzate in una lista chiamata mentions. Ogni oggetto in quella lista ha la seguente struttura.

Oggetto Mention Utente del Commento
Copy CopyRun External Link
1
2interface CommentUserMention {
3 /** L'id utente. Per gli utenti SSO, questo avrà il prefisso dell'id del tuo tenant. **/
4 id: string
5 /** Il testo finale del tag @mention, incluso il simbolo @. **/
6 tag: string
7 /** Il testo originale del tag @mention, incluso il simbolo @. **/
8 rawTag: string
9 /** Il tipo di utente taggato. user = account FastComments.com. sso = SSOUser. **/
10 type: 'user'|'sso'
11 /** Se l'utente rinuncia alle notifiche, questo sarà comunque impostato su true. **/
12 sent: boolean
13}
14

Hashtag

Quando gli hashtag vengono usati e correttamente parsati, le informazioni sono memorizzate in una lista chiamata hashTags. Ogni oggetto in quella lista ha la seguente struttura. Gli hashtag possono anche essere aggiunti manualmente all'array hashTags del commento per le query, se retain è impostato.

Oggetto Hashtag del Commento
Copy CopyRun External Link
1
2interface CommentHashTag {
3 /** L'id dell'hashtag. **/
4 id: string
5 /** Il testo finale del tag #hashtag, incluso il simbolo #. **/
6 tag: string
7 /** Se l'hashtag è associato a un URL personalizzato, questo sarà definito. **/
8 url?: string
9 /** Se dobbiamo conservare l'hashtag, anche se non esiste nel testo del commento, quando il commento viene aggiornato. Utile per taggare i commenti senza modificare il testo del commento. **/
10 retain?: boolean
11}
12

Struttura del modello email Internal Link

Un oggetto EmailTemplate rappresenta la configurazione per un modello di posta elettronica personalizzato, per un tenant.

Il sistema selezionerà il modello di posta elettronica da utilizzare tramite:

  • Il suo identificatore di tipo, che chiamiamo emailTemplateId. Sono costanti.
  • The domain. Cercheremo prima di trovare un template per il dominio a cui è legato l'oggetto correlato (come un Comment), e se non viene trovata una corrispondenza proveremo a trovare un template in cui domain è null o *.

La struttura per l'oggetto EmailTemplate è la seguente:

Struttura del modello di posta elettronica
Copy Copy
1
2interface EmailTemplate {
3 id: string
4 tenantId: string
5 emailTemplateId: string
6 displayName: string
7 /** SOLO LETTURA **/
8 createdAt: string
9 /** SOLO LETTURA **/
10 updatedAt: string
11 /** SOLO LETTURA **/
12 updatedByUserId: string
13 /** Il dominio a cui il template dovrebbe essere associato. **/
14 domain?: string | '*' | null
15 /** Il contenuto del template email in sintassi EJS. **/
16 ejs: string
17 /** Una mappa delle chiavi di traduzione sovrascritte ai valori, per ogni locale supportato. **/
18 translationOverridesByLocale: Record<string, Record<string, string>>
19 /** Un oggetto che rappresenta il contesto di rendering del template. **/
20 testData: object
21}
22

Note

  • Puoi ottenere i valori validi di emailTemplateId dall'endpoint /definitions.
  • L'endpoint /definitions include anche le traduzioni predefinite e i dati di test.
  • I template non verranno salvati se la struttura o i dati di test non sono validi.

Struttura dell'hashtag Internal Link

Un oggetto HashTag rappresenta un tag che può essere lasciato da un utente. Gli HashTag possono essere usati per collegarsi a un contenuto esterno o per collegare insieme commenti correlati.

La struttura dell'oggetto HashTag è la seguente:

Struttura HashTag
Copy Copy
1
2interface HashTag {
3 /** Dovrebbe iniziare con "#" o con il carattere desiderato. **/
4 tag: string
5 /** Un URL opzionale a cui l'hashtag può puntare. Invece di filtrare i commenti per hashtag, l'interfaccia utente verrà reindirizzata a questo al clic. **/
6 url?: string
7 /** SOLO LETTURA **/
8 createdAt: string
9}
10

Note:

  • In alcuni endpoint API vedrai che l'hashtag viene usato nell'URL. Ricordati di codificare i valori per URI. Per esempio, # dovrebbe invece essere rappresentato come %23.
  • Alcuni di questi campi sono contrassegnati come READONLY - vengono restituiti dall'API ma non possono essere impostati.

Struttura del conteggio notifiche Internal Link

Un oggetto NotificationCount rappresenta il conteggio delle notifiche non lette e i metadati per un utente.

Se non ci sono notifiche non lette, non esisterà alcun NotificationCount per l'utente.

Gli oggetti NotificationCount vengono creati automaticamente e non possono essere creati tramite l'API. Scadono inoltre dopo un anno.

Puoi azzerare il conteggio delle notifiche non lette di un utente eliminando il relativo NotificationCount.

La struttura dell'oggetto NotificationCount è la seguente:

Struttura di NotificationCount
Copy Copy
1
2interface NotificationCount {
3 id: string // id utente
4 count: number
5 createdAt: string // stringa della data
6 expireAt: string // stringa della data
7}
8

Struttura della notifica Internal Link

Un oggetto Notification rappresenta una notifica per un utente.

Gli oggetti Notification vengono creati automaticamente e non possono essere creati tramite l'API. Scadono inoltre dopo un anno. Le notifiche non possono essere eliminate. Possono comunque essere aggiornate impostando viewed su false, e puoi interrogarle tramite viewed.

Un utente può anche rinunciare alle notifiche per un commento specifico impostando optedOut nella notifica su true. Puoi riattivare le notifiche impostandolo su false.

Esistono diversi tipi di notifiche - controlla relatedObjectType e type.

I metodi con cui vengono create le notifiche sono piuttosto flessibili e possono essere attivati da molti scenari (vedi NotificationType).

Al momento, l'esistenza di una Notification non implica necessariamente che una email sia stata o debba essere inviata. Piuttosto, le notifiche sono utilizzate per il feed delle notifiche e le integrazioni correlate.

La struttura dell'oggetto Notification è la seguente:

Struttura dell’oggetto Notification
Copy Copy
1
2enum NotificationObjectType {
3 Comment = 0,
4 Profile = 1,
5 Tenant = 2
6}
7
8enum NotificationType {
9 /** Se qualcuno ti ha risposto. **/
10 RepliedToMe = 0,
11 /** Se qualcuno ha risposto da qualsiasi punto di un thread (anche figli di figli) di un thread su cui hai commentato. **/
12 RepliedTransientChild = 1,
13 /** Se il tuo commento è stato votato positivamente. **/
14 VotedMyComment = 2,
15 /** Se viene lasciato un nuovo commento nella radice di una pagina alla quale sei iscritto. **/
16 SubscriptionReplyRoot = 3,
17 /** Se qualcuno ha commentato il tuo profilo. **/
18 CommentedOnProfile = 4,
19 /** Se hai un messaggio diretto (DM). **/
20 DirectMessage = 5,
21 /** TrialLimits è solo per utenti tenant. **/
22 TrialLimits = 6,
23 /** Se sei stato menzionato con @. **/
24 Mentioned = 7
25}
26
27interface Notification {
28 id: string
29 tenantId: string
30 /** Con SSO, l'id utente ha il formato `<tenant id>:<user id>`. **/
31 userId?: string
32 /** Quando si lavora con SSO, devi preoccuparti solo di `userId`. **/
33 anonUserId?: string
34 /** urlId è quasi sempre definito. È opzionale solo per le notifiche a livello di tenant, che sono poco frequenti. **/
35 urlId?: string
36 /** L'URL è memorizzato nella cache per una navigazione rapida alla fonte della notifica. **/
37 url?: string
38 /** Il titolo della pagina è memorizzato nella cache per una lettura rapida della fonte della notifica. **/
39 pageTitle?: string
40 relatedObjectType: NotificationObjectType
41 /** Ad esempio, l'id del commento. **/
42 relatedObjectId: string
43 viewed: boolean
44 createdAt: string // stringa di data
45 type: NotificationType
46 fromCommentId?: string
47 fromVoteId?: string
48 /** fromUserName e fromUserAvatarSrc sono memorizzati qui per la visualizzazione rapida della notifica. Vengono aggiornati quando l'utente viene aggiornato. **/
49 fromUserName: string
50 fromUserId: string
51 fromUserAvatarSrc?: string
52 /** Imposta questo su true per smettere di ricevere notifiche per questo oggetto. **/
53 optedOut?: boolean
54}
55

Struttura della pagina Internal Link


Un oggetto Page rappresenta la pagina a cui possono appartenere molti commenti. Questa relazione è definita da urlId.

Un oggetto Page memorizza informazioni come il titolo della pagina, il numero di commenti e urlId.

La struttura per l'oggetto Page è la seguente:

Struttura della Pagina
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 /** Impostare questo su null significa che tutti gli utenti SSO possono vedere la pagina. Una lista vuota significa che è chiusa a tutti gli utenti. **/
11 accessibleByGroupIds?: string[] | null
12 /** Questa pagina è chiusa ai nuovi commenti? **/
13 isClosed?: boolean
14}
15

Struttura dell'evento webhook in sospeso Internal Link

Un oggetto PendingWebhookEvent rappresenta un evento webhook accodato in attesa.

PendingWebhookEvent objects are created automatically and cannot be manually created via the API. They also expire after one year. Possono essere eliminati, il che rimuove il task dalla coda.

Esistono diversi tipi di eventi - controlla eventType (OutboundSyncEventType) e type (OutboundSyncType).

Un uso comune di questa API è implementare un monitoraggio personalizzato. Potresti voler chiamare periodicamente l'endpoint /count per interrogare il conteggio in sospeso per filtri specifici.

La struttura dell'oggetto PendingWebhookEvent è la seguente:

Struttura di PendingWebhookEvent
Copy Copy
1
2enum OutboundSyncEventType {
3 Create: 0,
4 Delete: 1,
5 Update: 2
6}
7
8enum OutboundSyncType {
9 /** Attività di sincronizzazione specifica per WordPress. **/
10 WP: 0,
11 Webhook: 1
12}
13
14interface PendingWebhookEvent {
15 id: string
16 /** L'id del commento associato all'evento. **/
17 commentId: string
18 /** L'oggetto del commento relativo all'evento al momento dell'evento. Abbiamo iniziato ad aggiungerli a partire da Nov 2023. **/
19 comment: Comment
20 /** Un id esterno che può essere associato al commento. **/
21 externalId: string | null
22 createdAt: Date
23 tenantId: string
24 attemptCount: number
25 /** Impostato prima del primo tentativo e dopo ogni fallimento. **/
26 nextAttemptAt: Date
27 /** Se si tratta di un evento di creazione, cancellazione o aggiornamento... **/
28 eventType: OutboundSyncEventType
29 /** Il tipo di sincronizzazione da eseguire (WordPress, chiamare l'API, ecc.). **/
30 type: OutboundSyncType
31 /** Il dominio che ha corrisposto al commento. Usiamo questo dominio per scegliere la chiave API. **/
32 domain: string
33 /** L'ultimo errore verificatosi. Questo tipo non è tipizzato ed è un "dump" di quanto accaduto. Di solito contiene un oggetto con statusCode, body, e una mappa di headers. **/
34 lastError: object | null
35}
36

Struttura utente 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:

Struttura 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 // Permesso amministratore - gli utenti SSO con questa flag vengono fatturati come Admin SSO (separati dagli utenti SSO regolari)
16 isAdminAdmin?: boolean // Permesso amministratore - gli utenti SSO con questa flag vengono fatturati come Admin SSO (separati dagli utenti SSO regolari)
17 isCommentModeratorAdmin?: boolean // Permesso moderatore - gli utenti SSO con questa flag vengono fatturati come Moderatori SSO (separati dagli utenti SSO regolari)
18 /** Se null, il Controllo Accessi non verrà applicato all'utente. Se una lista vuota, questo utente non potrà vedere alcuna pagina né menzionare altri utenti con @. **/
19 groupIds?: string[] | null
20 createdFromSimpleSSO?: boolean
21 /** Non permettere ad altri utenti di vedere l'attività di questo utente, inclusi i commenti, nel suo profilo. Il valore predefinito è true per fornire profili sicuri. **/
22 isProfileActivityPrivate?: boolean
23 /** Non permettere ad altri utenti di lasciare commenti sul profilo di questo utente, né di vedere commenti di profilo esistenti. Predefinito false. **/
24 isProfileCommentsPrivate?: boolean
25 /** Non permettere ad altri utenti di inviare messaggi diretti a questo utente. Predefinito false. **/
26 isProfileDMDisabled?: boolean
27 karma?: number
28 /** Configurazione opzionale per i badge utente. **/
29 badgeConfig?: {
30 /** Array di ID dei badge da assegnare all'utente. Limitato a 30 badge. L'ordine è rispettato. Si tratta di badge globali visibili in tutte le pagine. **/
31 badgeIds: string[]
32 /** Array di ID dei badge limitati alla pagina corrente (urlId). Questi badge sono mostrati solo sulla pagina in cui sono stati assegnati. **/
33 pageBadgeIds?: string[]
34 /** Se true, sostituisce tutti i badge attualmente mostrati con quelli forniti. I badge globali e quelli a livello di pagina sono sovrascritti indipendentemente. Se false, aggiunge ai badge esistenti. **/
35 override?: boolean
36 /** Se true, aggiorna le proprietà di visualizzazione dei badge dalla configurazione del tenant. **/
37 update?: boolean
38 }
39}
40

Billing for SSO Users

SSO users are billed differently based on their permission flags:

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

Important: To prevent double billing, the system automatically deduplicates SSO users against regular tenant users and moderators by email address. If an SSO user has the same email as a regular tenant user or moderator, they will not be billed twice.

Access Control

Users can be broken into groups. This is what the groupIds field is for, and is optional.

@Menzioni

By default @mentions will use username to search for other sso users when the @ character is typed. If displayName is used, then results matching username will be ignored when there is a match for displayName, and the @mention search results will use displayName.

Sottoscrizioni

With FastComments, users can subscribe to a page by clicking the bell icon in the comment widget and clicking Subscribe.

With a regular user, we send them notification emails based on their notification settings.

With SSO Users, we split this up for backwards compatibility. Users will only get sent these additional subscription notification emails if you set optedInSubscriptionNotifications to true.

Badge

You can assign badges to SSO users using the badgeConfig property. Badges are visual indicators that appear next to a user's name in comments.

  • badgeIds - An array of badge IDs to assign to the user. These are global badges visible on all pages. Must be valid badge IDs created in your FastComments account. Limited to 30 badges.
  • pageBadgeIds - An optional array of badge IDs scoped to the current page (urlId). These badges are only displayed on the page where they were assigned. Different pages can have different page-scoped badges for the same user.
  • override - If true, all existing displayed badges will be replaced with the provided ones. Global and page-scoped badges are overridden independently — overriding global badges does not affect page-scoped badges, and vice versa. If false or omitted, the provided badges will be added to any existing badges.
  • update - If true, badge display properties will be updated from the tenant configuration whenever the user logs in.

Struttura dell'abbonamento Internal Link

Un oggetto Subscription rappresenta una sottoscrizione per un utente.

Gli oggetti Subscription vengono creati quando un utente clicca la campanella delle notifiche nel widget dei commenti e seleziona "Iscriviti a questa pagina".

Le sottoscrizioni possono anche essere create via API.

Avere un oggetto Subscription fa sì che vengano generati oggetti Notification e inviate email quando vengono lasciati nuovi commenti nella radice della pagina associata a cui la Subscription si riferisce. L'invio delle email dipende dal tipo di utente. Per gli utenti normali ciò dipende da optedInNotifications. Per gli utenti SSO ciò dipende da optedInSubscriptionNotifications. Nota che alcune applicazioni potrebbero non avere il concetto di una pagina accessibile via web, nel qual caso impostare semplicemente urlId sull'id dell'elemento a cui si sta sottoscrivendo (stesso valore per urlId che si passerebbe al widget dei commenti).

La struttura dell'oggetto Subscription è la seguente:

Struttura di Subscription
Copy Copy
1
2interface Subscription {
3 id: string
4 tenantId: string
5 /** Con SSO, l'id utente ha il formato `<tenant id>:<user id>`. **/
6 userId: string
7 anonUserId?: string
8 urlId: string
9 url?: string
10 pageTitle?: string
11 createdAt: string // stringa della data
12}
13

Struttura dell'utilizzo giornaliero del tenant Internal Link

Un oggetto TenantDailyUsage rappresenta l'utilizzo per un tenant in un dato giorno. Se non c'è stata attività per un tenant in un determinato giorno, quel giorno non avrà un oggetto TenantDailyUsage.

L'oggetto TenantDailyUsage non è in tempo reale e può essere indietro di alcuni minuti rispetto all'utilizzo effettivo.

La struttura dell'oggetto TenantDailyUsage è la seguente:

Struttura di 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 /** Ignorato per la fatturazione. **/
19 ignored: boolean
20}
21

Struttura del tenant Internal Link

Il Tenant definisce un cliente di FastComments.com. Possono essere creati tramite l'API dai tenant con accesso al white labeling. I tenant white-labeled non possono creare altri tenant white-labeled (è consentito un solo livello di annidamento).

La struttura dell'oggetto Tenant è la seguente:

Struttura Tenant
Copy Copy
1
2export enum SiteType {
3 Unknown = 0,
4 WordPress = 1
5}
6
7/** Questo può anche essere gestito tramite l'API DomainConfig. **/
8export interface TenantDomainConfig {
9 domain: string
10 emailFromName?: string
11 emailFromEmail?: string
12 createdAt?: string,
13 siteType?: FastCommentsSiteType, // probabilmente vuoi Unknown
14 logoSrc?: string, // percorso dell'immagine originale
15 logoSrc100px?: string, // ridimensionata per le miniature
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 per motivi "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 - Calcolato in base a packageId. **/
65 hasFlexPricing?: boolean
66 /** @readonly **/
67 flexLastBilledAmount?: number
68 /** @readonly - Calcolato in base a packageId. **/
69 hasAuditing?: boolean
70 /** Puoi memorizzare una coppia chiave-valore con il tenant che puoi usare per interrogare. Le chiavi non possono contenere "." o "$", o essere più lunghe di 100 caratteri. I valori non possono essere più lunghi di 2k caratteri. **/
71 meta?: Record<string, string | null>
72}
73

Struttura utente Internal Link

User è un oggetto che rappresenta il denominatore più comune di tutti gli utenti.

Tieni presente che in FastComments abbiamo una serie di casi d'uso diversi per gli utenti:

  • Secure SSO
  • Simple SSO
  • Tenant Users (Ad esempio: Administrators)
  • Commenters

This API is for Commenters and users created via Simple SSO. Basically, any user created through your site can be accessed via this API. Tenant Users can also be fetched this way, but you'll get more information by interacting with the /tenant-users/ API.

For Secure SSO please use the /sso-users/ API.

You cannot update these types of users. They created their account through your site, so we provide some basic read-only access, but you cannot make changes. If you want to have this type of flow - you need to setup Secure SSO.

La struttura dell'oggetto User è la seguente:

Struttura di User
Copy Copy
1
2export interface User {
3 /** Questo è anche l'id usato come userId sugli oggetti commento. **/
4 id: string
5 username: string
6 /** Un link, ad esempio al blog del commentatore. **/
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

Struttura del voto Internal Link


Un oggetto Vote rappresenta un voto lasciato da un utente.

La relazione tra commenti e il voto è definita tramite commentId.

La struttura dell'oggetto Vote è la seguente:

Struttura oggetto 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

Struttura della configurazione della domanda Internal Link

FastComments fornisce un modo per creare domande e aggregarne i risultati. Un esempio di domanda (d'ora in poi chiamata QuestionConfig) potrebbe essere una valutazione a stelle, uno slider, o una domanda NPS (determinata tramite type).

I dati delle domande possono essere aggregati individualmente, insieme, nel tempo, complessivamente, per pagina, e così via.

Il framework dispone di tutte le funzionalità necessarie per costruire widget client-side (con il tuo server davanti a questa API), pannelli di amministrazione e strumenti di reporting.

Per prima cosa, dobbiamo definire un QuestionConfig. La struttura è la seguente:

Struttura di 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 /** SOLA LETTURA - incrementato per ogni nuova risposta. **/
13 usedCount: number
14 /** Una stringa di data che indica quando la configurazione è stata usata l'ultima volta (quando è stato lasciato un risultato). **/
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

Struttura del risultato della domanda Internal Link

Per salvare i risultati delle domande, crei un QuestionResult. Puoi quindi aggregare i risultati delle domande e anche collegarli ai commenti per scopi di reportistica.

Struttura di 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

Struttura del badge utente Internal Link

UserBadge è un oggetto che rappresenta un badge assegnato a un utente nel sistema FastComments.

I badge possono essere assegnati agli utenti automaticamente in base alla loro attività (come il numero di commenti, il tempo di risposta, lo stato di veterano) o manualmente dagli amministratori del sito.

La struttura dell'oggetto UserBadge è la seguente:

Struttura di UserBadge
Copy Copy
1
2export interface UserBadge {
3 /** Identificatore univoco per questa assegnazione del badge all'utente */
4 id: string
5 /** ID dell'utente a cui è assegnato questo badge */
6 userId: string
7 /** ID della definizione del badge dal catalogo dei badge del tenant */
8 badgeId: string
9 /** ID del tenant che ha creato/assegnato questo badge */
10 fromTenantId: string
11 /** Quando è stato creato questo badge (millisecondi dall'epoch) */
12 createdAt?: number
13 /** Quando questo badge è stato ricevuto dall'utente (millisecondi dall'epoch) */
14 receivedAt?: number
15 /**
16 * Il tipo di badge:
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 /** Per i badge basati su soglia, il valore della soglia */
25 threshold?: number
26 /** Il nome/etichetta del badge */
27 name?: string
28 /** Descrizione dettagliata del badge */
29 description?: string
30 /** Testo mostrato sul badge */
31 displayLabel?: string
32 /** URL di un'immagine mostrata sul badge */
33 displaySrc?: string
34 /** Colore di sfondo del badge (codice esadecimale) */
35 backgroundColor?: string
36 /** Colore del bordo del badge (codice esadecimale) */
37 borderColor?: string
38 /** Colore del testo del badge (codice esadecimale) */
39 textColor?: string
40 /** Classe CSS aggiuntiva per lo styling */
41 cssClass?: string
42 /** Per i badge veterano, la soglia temporale in millisecondi */
43 veteranUserThresholdMillis?: number
44 /** Se questo badge è visualizzato nei commenti dell'utente */
45 displayedOnComments: boolean
46 /** L'ordine di visualizzazione del badge */
47 order?: number
48 /** Se impostato, questo badge è mostrato solo nella pagina con urlId corrispondente. Null per i badge globali. */
49 urlId?: string | null
50}
51

Struttura del progresso del badge utente Internal Link

UserBadgeProgress è un oggetto che rappresenta il progresso di un utente verso l'ottenimento di vari badge nel sistema FastComments.

Questo tracciamento aiuta a determinare quando gli utenti dovrebbero ricevere badge automatici in base alla loro attività e partecipazione nella tua community.

La struttura per l'oggetto UserBadgeProgress è la seguente:

Struttura di UserBadgeProgress
Copy Copy
1
2export interface UserBadgeProgress {
3 /** Identificatore univoco per questo record di progresso */
4 id: string
5 /** ID del tenant a cui appartiene questo record di progresso */
6 tenantId: string
7 /** ID dell'utente che questo record monitora */
8 userId: string
9 /** ID del primo commento dell'utente nel sistema */
10 firstCommentId?: string
11 /** Data del primo commento dell'utente (millisecondi dall'epoch) */
12 firstCommentDate?: number
13 /** Fattore di fiducia calcolato automaticamente in base all'attività dell'utente */
14 autoTrustFactor?: number
15 /** Fattore di fiducia impostato manualmente dagli amministratori */
16 manualTrustFactor?: number
17 /** Oggetto di progresso dettagliato con varie metriche, le chiavi corrispondono all'enum BadgeType */
18 progress: {
19 /** 0: CommentCount - Numero di commenti che l'utente ha pubblicato */
20 '0'?: number
21 /** 1: CommentUpVotes - Numero di upvote che l'utente ha ricevuto */
22 '1'?: number
23 /** 2: CommentReplies - Numero di risposte che l'utente ha pubblicato */
24 '2'?: number
25 /** 3: CommentsPinned - Numero di commenti dell'utente fissati */
26 '3'?: number
27 /** 4: Veteran - Età dell'account dell'utente */
28 '4'?: number
29 /** 5: NightOwl - Numero di volte in cui l'utente ha pubblicato durante le ore notturne */
30 '5'?: number
31 /** 6: FastReplyTime - Tempo medio di risposta in millisecondi */
32 '6'?: number
33 /** 7: ModeratorCommentsDeleted - Per i badge dei moderatori, conteggio dei commenti eliminati */
34 '7'?: number
35 /** 8: ModeratorCommentsApproved - Per i badge dei moderatori, conteggio dei commenti approvati */
36 '8'?: number
37 /** 9: ModeratorCommentsUnapproved - Per i badge dei moderatori, conteggio dei commenti non approvati */
38 '9'?: number
39 /** 10: ModeratorCommentsReviewed - Per i badge dei moderatori, conteggio dei commenti revisionati */
40 '10'?: number
41 /** 11: ModeratorCommentsMarkedSpam - Per i badge dei moderatori, conteggio dei commenti contrassegnati come spam */
42 '11'?: number
43 /** 12: ModeratorCommentsMarkedNotSpam - Per i badge dei moderatori, conteggio dei commenti contrassegnati come non spam */
44 '12'?: number
45 /** 13: RepliedToSpecificPage - Per ogni pagina, conteggio delle risposte */
46 '13'?: Record<string, number>
47 }
48}
49

In conclusione

Speriamo che tu abbia trovato la nostra documentazione API esaustiva e facile da comprendere. Se trovi delle lacune, faccelo sapere qui sotto.