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 fornisce una soluzione SSO facile da usare. Aggiornare le informazioni di un utente con l'integrazione basata su HMAC è semplice come fare in modo che l'utente carichi la pagina con un payload aggiornato.

Tuttavia, potrebbe essere desiderabile gestire un utente al di fuori di quel flusso, per migliorare la coerenza della tua applicazione.

L'SSO User API fornisce un modo per creare, leggere, aggiornare e cancellare oggetti che chiamiamo SSOUsers. Questi oggetti sono diversi dagli Users regolari e vengono mantenuti separati per sicurezza di tipo.

La struttura dell'oggetto SSOUser è la seguente:

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 SSO users con questo flag vengono fatturati come SSO Admins (separati dagli SSO users regolari)
16 isAdminAdmin?: boolean // Permesso amministratore - gli SSO users con questo flag vengono fatturati come SSO Admins (separati dagli SSO users regolari)
17 isCommentModeratorAdmin?: boolean // Permesso moderatore - gli SSO users con questo flag vengono fatturati come SSO Moderators (separati dagli SSO users regolari)
18 /** Se null, Access Control non verrà applicato all'utente. Se una lista vuota, questo utente non potrà vedere alcuna pagina né usare @mention per altri utenti. **/
19 groupIds?: string[] | null
20 createdFromSimpleSSO?: boolean
21 /** Non permettere ad altri utenti di vedere l'attività di questo utente, inclusi i commenti, nel loro profilo. Il valore predefinito è true per fornire profili sicuri di default. **/
22 isProfileActivityPrivate?: boolean
23 /** Non permettere ad altri utenti di lasciare commenti sul profilo dell'utente, o vedere i commenti esistenti del profilo. Default false. **/
24 isProfileCommentsPrivate?: boolean
25 /** Non permettere ad altri utenti di inviare messaggi diretti a questo utente. Default 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. **/
31 badgeIds: string[]
32 /** Se true, sostituisce tutti i badge esistenti mostrati con quelli forniti. Se false, aggiunge ai badge esistenti. **/
33 override?: boolean
34 /** Se true, aggiorna le proprietà di visualizzazione dei badge dalla configurazione del tenant. **/
35 update?: boolean
36 }
37}
38

Billing for SSO Users

Gli SSO users vengono fatturati in modo diverso in base ai loro flag di permesso:

  • Regular SSO Users: Utenti senza permessi di admin o moderatore vengono fatturati come regular SSO users
  • SSO Admins: Utenti con i flag isAccountOwner o isAdminAdmin vengono fatturati separatamente come SSO Admins (stessa tariffa degli admin regolari del tenant)
  • SSO Moderators: Utenti con il flag isCommentModeratorAdmin vengono fatturati separatamente come SSO Moderators (stessa tariffa dei moderatori regolari)

Importante: Per evitare doppia fatturazione, il sistema deduplica automaticamente gli SSO users rispetto agli utenti e moderatori regolari del tenant basandosi sull'indirizzo email. Se un SSO user ha la stessa email di un utente o moderatore regolare del tenant, non verrà fatturato due volte.

Access Control

Gli utenti possono essere suddivisi in gruppi. Questo è lo scopo del campo groupIds, ed è opzionale.

@Mentions

Di default @mentions utilizzerà username per cercare altri sso users quando viene digitato il carattere @. Se viene utilizzato displayName, allora i risultati che corrispondono a username saranno ignorati quando c'è una corrispondenza per displayName, e i risultati della ricerca per gli @mention useranno displayName.

Subscriptions

Con FastComments, gli utenti possono iscriversi a una pagina cliccando l'icona della campanella nel widget dei commenti e selezionando Subscribe.

Con un utente regolare, inviamo loro email di notifica in base alle loro impostazioni di notifica.

Con gli SSO Users, abbiamo separato questo comportamento per compatibilità retroattiva. Gli utenti riceveranno queste email di notifica aggiuntive per le subscription solo se imposti optedInSubscriptionNotifications su true.

Badges

Puoi assegnare badge agli SSO users usando la proprietà badgeConfig. I badge sono indicatori visivi che appaiono accanto al nome di un utente nei commenti.

  • badgeIds - Un array di ID dei badge da assegnare all'utente. Devono essere ID validi di badge creati nel tuo account FastComments. Limitato a 30 badge.
  • override - Se true, tutti i badge esistenti visualizzati sui commenti saranno sostituiti con quelli forniti. Se false o omesso, i badge forniti saranno aggiunti a quelli esistenti.
  • update - Se true, le proprietà di visualizzazione dei badge verranno aggiornate dalla configurazione del tenant ogni volta che l'utente effettua il login.

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à (ad esempio conteggio dei commenti, tempo di risposta, stato di veterano) o manualmente dagli amministratori del sito.

La struttura per l'oggetto UserBadge è la seguente:

Struttura di UserBadge
Copy Copy
1
2export interface UserBadge {
3 /** Identificatore univoco per questa assegnazione di 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 badge del tenant */
8 badgeId: string
9 /** ID del tenant che ha creato/assegnato questo badge */
10 fromTenantId: string
11 /** Quando questo badge è stato creato (millisecondi dall'epoca) */
12 createdAt?: number
13 /** Quando questo badge è stato ricevuto dall'utente (millisecondi dall'epoca) */
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 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 /** Il testo mostrato sul badge */
31 displayLabel?: string
32 /** URL dell'immagine mostrata sul badge */
33 displaySrc?: string
34 /** Colore di sfondo per il badge (codice esadecimale) */
35 backgroundColor?: string
36 /** Colore del bordo per il badge (codice esadecimale) */
37 borderColor?: string
38 /** Colore del testo per il 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 viene visualizzato nei commenti dell'utente */
45 displayedOnComments: boolean
46 /** L'ordine di visualizzazione del badge */
47 order?: number
48}
49
---

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.