FastComments.com

API di commenti in tempo reale

L'API FastComments

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

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

Per i clienti Enterprise, tutti gli accessi all'API sono registrati nel Registro di Audit.

SDK Generati

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

Abbiamo anche ora SDK per i linguaggi più popolari:

Autenticazione

L'API è autenticata passando la tua chiave API come header X-API-KEY o come parametro di query API_KEY. Avrai anche bisogno del tuo tenantId per effettuare chiamate API. Questo può essere recuperato dalla stessa pagina della tua chiave API.

Nota di Sicurezza

Queste rotte sono destinate a essere chiamate da un server. NON chiamarle da un browser. Farlo esporrà la tua chiave API - questo fornirà pieno accesso al tuo account a chiunque possa visualizzare il codice sorgente di una pagina!

Opzione di Autenticazione Uno - Header

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

Opzione di Autenticazione Due - Parametri di Query

  • Query Param: API_KEY
  • Query Param: tenantId

Opzione di Autenticazione Tre - Token OAuth Bearer

  • Header: Authorization: Bearer fcat_...

Le applicazioni di terze parti come Zapier e i client del server MCP ottengono un token tramite OAuth invece di una chiave API. Quel token funziona su tutti gli endpoint qui. Il tenant è implicito nel token, quindi tenantId è opzionale, ma deve corrispondere al token se fornito. Le richieste GET richiedono lo scope read e ogni altro metodo richiede lo scope write. Il flusso completo, inclusa la registrazione del client, PKCE, refresh e revoca, è documentato sotto OAuth Authorization. La scoperta inizia a https://fastcomments.com/.well-known/oauth-authorization-server.

Leggere le proprie scritture

FastComments fornisce disponibilità Active-Active. Le richieste dal tuo datacenter sono instradate al punto di presenza più vicino al tuo. Questo è automatico, e normalmente puoi osservare la semantica di lettura-scrittura. Se vuoi essere sicuro di leggere le tue proprie scritture, puoi fissare le tue richieste a una certa regione usando quella regione come host API (tuttavia ciò di solito non è necessario per la maggior parte delle integrazioni):

  • 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

Nota che se fai così potresti voler definire un fallback, poiché in passato abbiamo deprecato i nodi di ingresso e utilizziamo nuovi nomi per il passaggio.

Struttura AuditLog Internal Link

An AuditLog è un oggetto che rappresenta un evento auditato per i tenant che hanno accesso a questa funzionalità.

La struttura dell'oggetto AuditLog è la seguente:

Struttura AuditLog
Copy Copy
1
2interface AuditLog {
3 id: string;
4 /** Who performed the event. **/
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 /** The browser that performed the event, when it came from one. **/
13 ua?: string;
14 /** A hash of the session the event came from, for correlating one person's actions. Never the session itself. **/
15 sIdHashed?: string;
16 when: string;
17 description?: string;
18 serverStartDate: string;
19 /** The id of the object the event was performed on, as opposed to who performed it. **/
20 targetId?: string;
21 /** A human-readable label for that object, e.g. "jsmith (jsmith@example.com)". **/
22 targetLabel?: string;
23 objectDetails?: object;
24}
25

targetId e targetLabel descrivono su cosa è stato eseguito l'evento; userId e username descrivono chi lo ha eseguito. Per gli aggiornamenti, objectDetails.changes contiene una mappa {field: {from, to}} di ciò che è effettivamente cambiato.

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

Gli eventi nel registro di audit scadono dopo due anni.

Struttura BatchJob Internal Link

Un BatchJob è un'attività a lunga esecuzione, come un'importazione, un'esportazione o una migrazione di pagina. I lavori sono accodati, poi prelevati ed eseguiti in background.

processedCount e totalCount mostrano l'avanzamento. La loro unità dipende dal type:

  • migrate-pages: migrazioni completate, rispetto alle migrazioni richieste.
  • undo-page-migration: record ripristinati. Non c'è totalCount.
  • import, export e altri lavori: righe elaborate.

La struttura dell'oggetto BatchJob è la seguente:

Struttura BatchJob
Copy Copy
1
2interface BatchJob {
3 id: string
4 /** Ad esempio migrate-pages, undo-page-migration, migrate-domains, import, export, users-export o copy-comments. **/
5 type: string
6 status: 'requested' | 'running' | 'success' | 'failed'
7 createdAt: string
8 completedAt?: string
9 processedCount: number
10 /** Lavoro totale, quando è noto in anticipo. **/
11 totalCount?: number
12 /** migrate-pages: una voce per ogni migrazione completata, in ordine di richiesta. **/
13 pageMigrationResults?: Array<PageMigrationSuccess | PageMigrationFailure>
14 /**
15 * migrate-pages: impostato una volta che il lavoro è terminato (successo o fallito). Passare a POST /api/v1/pages/migrations/:undoId/undo entro 90 giorni.
16 * undo-page-migration: la migrazione da annullare.
17 **/
18 undoId?: string
19 /** undo-page-migration: impostato una volta che il lavoro è terminato. **/
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 /** Record ripristinati ai loro valori precedenti la migrazione. **/
42 restored: number
43 /** Record lasciati invariati perché sono cambiati dopo la migrazione, o non esistono più. **/
44 skipped: number
45 /** Record della migrazione eliminati durante l'unione delle pagine. Questi non possono essere ripristinati. **/
46 notRestorable: number
47}
48

Tentativi

Se il server che esegue un lavoro di migrazione di pagina si riavvia, il lavoro viene reinserito nella coda e riprende dopo l'ultima migrazione completata. Un lavoro viene provato fino a 3 volte, dopodiché il suo status è failed.

Struttura commento Internal Link

Un oggetto Comment rappresenta un commento lasciato da un utente.

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

La struttura dell'oggetto Comment è la seguente:

Struttura del Commento
Copy Copy
1
2interface Comment {
3 /** READONLY: Impostato su true se il motore anti-spam ha determinato che il commento era spam. **/
4 aiDeterminedSpam?: boolean
5 /** Se il commento è approvato per la visualizzazione. Impostare 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. Utilizzato quando asTree è impostato su true tramite l'API. **/
10 children: Comment[]
11 /** Il commento grezzo dell'utente. **/
12 comment: string
13 /** READONLY: Il commento dell'utente analizzato in HTML. **/
14 commentHTML?: string
15 /** L'email del commentatore. Richiesta se i commenti anonimi sono disattivati. **/
16 commenterEmail?: string
17 /** Il link del commentatore (per esempio, il loro blog). **/
18 commenterLink?: string
19 /** Il nome del commentatore. Sempre richiesto. Se non disponibile, impostare qualcosa come "Anonimo". **/
20 commenterName: string
21 /** La data in cui è stato lasciato 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 /** READONLY: Il numero di volte che il commento è stato segnalato. **/
28 flagCount?: number
29 /** Gli #hashtag scritti nel commento che sono stati analizzati correttamente. È inoltre possibile aggiungere manualmente hashtag, per le query, ma non verranno mostrati automaticamente nel testo del commento. **/
30 hashTags?: CommentHashTag[]
31 /** READONLY: Il commento contiene immagini? **/
32 hasImages?: boolean
33 /** READONLY: Il commento contiene link? **/
34 hasLinks?: boolean
35 /** READONLY: L'id univoco del commento. **/
36 id: string
37 /** Solo alla creazione! Viene hashato per l'archiviazione. **/
38 ip?: string
39 /** READONLY: L'utente corrente ha bloccato l'autore di questo commento? **/
40 isBlocked?: boolean
41 /** READONLY: Il commento è di un admin? Impostato automaticamente in base a userId. **/
42 isByAdmin?: boolean
43 /** READONLY: Il commento è di un moderatore? Impostato automaticamente in base a userId. **/
44 isByModerator?: boolean
45 /** Impostato su true se il commento è stato eliminato soft (deve essere 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 doveva essere mantenuto. **/
48 isDeletedUser?: boolean
49 /** READONLY: È stato segnalato dall'utente attualmente connesso (contextUserId)? **/
50 isFlagged?: boolean
51 /** Il commento è appuntato (pinned)? **/
52 isPinned?: boolean
53 /** Il commento è bloccato? Quando true, nessuno (inclusi i moderatori) può rispondere, modificare o eliminarlo fino a quando non viene sbloccato. **/
54 isLocked?: boolean
55 /** Il commento è spam? **/
56 isSpam?: boolean
57 /** READONLY: Il commento è stato votato negativamente dall'utente corrente (contextUserId)? **/
58 isVotedDown?: boolean
59 /** READONLY: Il commento è stato votato positivamente dall'utente corrente (contextUserId)? **/
60 isVotedUp?: boolean
61 /** La locale del commento. Se non fornita, verrà derivata 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 /** READONLY: Le @menzioni scritte nel commento che sono state analizzate correttamente. **/
64 mentions?: CommentUserMention[]
65 /** Metadati opzionali associati al commento. **/
66 meta?: Record<string, string | number | boolean>
67 /** L'elenco opzionale di id dei gruppi di moderazione associati a questo commento. **/
68 moderationGroupIds?: string[]|null
69 /** READONLY: L'id dell'oggetto voto che corrisponde al voto dell'utente corrente (contextUserId) su questo commento. **/
70 myVoteId?: string
71 /** Se sono state inviate notifiche per questo commento ai commentatori. Per evitare l'invio di notifiche durante le importazioni, impostare questo valore su true. **/
72 notificationSentForParent?: boolean
73 /** Se sono state inviate notifiche per questo commento agli utenti del tenant. Per evitare l'invio di notifiche durante le importazioni, impostare questo valore su true. **/
74 notificationSentForParentTenant?: boolean
75 /** Il titolo della pagina su cui si trovava questo commento. **/
76 pageTitle?: string
77 /** Se stiamo rispondendo a un commento, questo è l'ID a cui stiamo rispondendo. **/
78 parentId?: string|null
79 /** 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" dell'urlId che ci hai fornito. Durante il salvataggio, specifichi questo campo, ma quando recuperi il commento questo verrà "ripulito" e il tuo valore originale spostato in "urlIdRaw". **/
88 urlId: string
89 /** READONLY: L'urlId originale che ci hai passato. **/
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 - questi 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, come [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 raccomanda di renderizzare l'HTML, dato che è un sottoinsieme molto piccolo di HTML, costruire un renderer è piuttosto semplice. Esistono diverse librerie per React Native e Flutter, per esempio, che possono aiutare in questo

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

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

Tagging

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 delle Menzioni del Commento
Copy CopyRun External Link
1
2interface CommentUserMention {
3 /** L'id utente. Per gli utenti SSO, questo avrà prefissato il tuo id 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 /** Che tipo di utente è stato 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

HashTags

Quando gli hashtag vengono usati e analizzati correttamente, le informazioni vengono 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 mantenere l'hashtag, anche se non esiste nel testo del commento, quando il commento viene aggiornato. Utile per taggare commenti senza cambiare il testo del commento. **/
10 retain?: boolean
11}
12

Struttura 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 FeedPost Internal Link

Un oggetto FeedPost rappresenta un post in un feed di FastComments. Un feed è un flusso di post con i propri thread di commenti, renderizzato dal widget Feed. Ogni post ha un autore, contenuto ricco opzionale, media e link, e può essere taggato in modo che un feed possa essere filtrato.

La struttura dell'oggetto FeedPost è la seguente:

Struttura FeedPost
Copy Copy
1
2interface FeedPost {
3 /** READONLY **/
4 _id: string
5 /** READONLY **/
6 tenantId: string
7 title?: string
8 /** L'ID dell'utente FastComments o SSO che ha scritto il post. **/
9 fromUserId?: string
10 /** Compilato dall'utente se non impostato. **/
11 fromUserDisplayName?: string | null
12 /** READONLY. Compilato dall'utente. **/
13 fromUserAvatar?: string | null
14 /** Usato per filtrare un feed. **/
15 tags?: string[]
16 /** Peso di ordinamento all'interno di un feed. Valori più alti vengono ordinati per primi. **/
17 weight?: number
18 /** Coppie chiave/valore libere per il tuo uso. **/
19 meta?: Record<string, string>
20 /** HTML sanitizzato. **/
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 /** Dove il media punta quando viene cliccato. **/
35 linkUrl?: string
36 /** Una voce per ogni versione. Il widget sceglie la più adatta. **/
37 sizes: FeedPostMediaItemAsset[]
38}
39
40interface FeedPostMediaItemAsset {
41 w: number
42 h: number
43 src: string
44}
45
46interface FeedPostLink {
47 /** Il testo del link, ad esempio "Iscriviti ora". **/
48 text?: string
49 /** Un'intestazione mostrata con il link. **/
50 title?: string
51 /** Una descrizione mostrata con il link. **/
52 description?: string
53 url?: string
54}
55

Note:

  • Alcuni di questi campi sono contrassegnati come READONLY - vengono restituiti dall'API ma non possono essere impostati.
  • I commenti su un post sono commenti regolari il cui urlId è post: seguito dall'_id del post. Usa quel valore con l'API Commenti per leggere o creare commenti su un post.

Struttura 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 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 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 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 sondaggio Internal Link

Un Poll è collegato a un commento, anziché essere un oggetto a sé stante. Viene creato insieme al commento (vedi POST /api/v1/comments), oppure aggiunto successivamente a un commento esistente con PUT /api/v1/polls/:commentId.

I conteggi dei voti sono conservati direttamente sul sondaggio, quindi la lettura di un sondaggio fornisce i risultati senza dover sommare nulla. I singoli voti alla base di quei conteggi sono oggetti PollVote.

Ogni opzione ha un id generato quando il sondaggio viene creato. Quell'id è ciò che usi per esprimere un voto, per rinominare un'opzione e per mantenere un'opzione (e i suoi voti) quando esegui un PUT del sondaggio con opzioni aggiunte o rimosse. È l'unico modo sicuro per riferirsi a un'opzione - mai alla sua posizione nell'elenco.

Struttura del Poll
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 /** Se impostato e nel passato, il sondaggio è chiuso e non accetta più voti. **/
13 closesAt?: string | null
14 /** 0 anonimo (predefinito), 1 amministratori e moderatori, 2 tutti. Assente significa anonimo. **/
15 privacy?: 0 | 1 | 2 | null
16 /** Se true, i conteggi sono nascosti a chiunque non abbia ancora votato. Assente significa false. **/
17 requireVoteToSeeResults?: boolean | null
18}
19

Limiti

  • Una domanda è obbligatoria e ha al massimo 200 caratteri.
  • Un sondaggio ha tra 2 e 10 opzioni.
  • L'etichetta di un'opzione è obbligatoria, ha al massimo 100 caratteri e deve essere unica all'interno del sondaggio (ignorando maiuscole/minuscole).
  • closesAt deve essere nel futuro quando il sondaggio viene creato. Per chiudere immediatamente un sondaggio, esegui un PATCH con una data nel passato.

Impostazioni del Sito

I sondaggi rispettano la configurazione del tuo sito, che puoi modificare sotto Customize Widget:

  • I sondaggi devono essere abilitati prima che sia possibile crearne uno, altrimenti l'API risponde con polls-disabled.
  • Il voto può essere limitato agli utenti registrati, nel qual caso un voto inviato con solo un anonUserId viene rifiutato con poll-login-required.

Struttura voto sondaggio Internal Link

Un PollVote è la risposta di una persona a un sondaggio. I conteggi mostrati sul sondaggio stesso sono tenuti aggiornati con questi, quindi li servono solo quando vuoi sapere chi ha votato per cosa, piuttosto che i totali.

Un elettore può avere al massimo un voto per sondaggio. Votare di nuovo sposta il voto esistente verso la nuova opzione invece di aggiungerne un secondo, e updatedAt registra quando ciò è avvenuto.

voterId è il userId quando l'elettore era connesso, altrimenti è l'anonUserId.

Struttura PollVote
Copy Copy
1
2interface PollVote {
3 id: string
4 tenantId: string
5 commentId: string
6 urlId: string
7 /** L'userId quando l'elettore era connesso, altrimenti l'anonUserId. **/
8 voterId: string
9 optionId: string
10 createdAt: string
11 /** Quando l'elettore ha spostato per l'ultima volta il suo voto a un'opzione diversa. **/
12 updatedAt?: string
13}
14

Privacy

L'impostazione privacy del sondaggio si applica a questa API nello stesso modo in cui si applica nel widget dei commenti:

  • Anonymous (il valore predefinito): nessuno può vedere come qualcuno ha votato, quindi i voti non possono essere letti. GET /api/v1/poll-votes e GET /api/v1/poll-votes/:id rispondono con poll-anonymous. I conteggi del sondaggio sono ancora disponibili da GET /api/v1/polls/:commentId.
  • Admins and moderators: la tua chiave API appartiene all'amministratore del tuo sito, quindi può leggere i voti.
  • Everyone: i voti possono essere letti.

La privacy del sondaggio può essere ridotta ma non ampliata una volta che ha dei voti.

Struttura evento webhook in sospeso Internal Link

Un oggetto PendingWebhookEvent rappresenta un evento webhook in coda che è in attesa di elaborazione.

Gli oggetti PendingWebhookEvent vengono creati automaticamente e non possono essere creati manualmente tramite l'API. Inoltre scadono dopo un anno. Possono essere eliminati, il che rimuove l'attività dalla coda.

Esistono diversi tipi di evento - controllare eventType (OutboundSyncEventType) e type (OutboundSyncType).

Un caso d'uso comune per questa API è l'implementazione di un monitoraggio personalizzato. Potrebbe essere necessario chiamare periodicamente l'endpoint /count per interrogare il numero di eventi in sospeso in base ai filtri specificati.

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 commento per l'evento al momento dell'evento. Abbiamo iniziato ad aggiungerli a novembre 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 /** Indica se si tratta di un evento di creazione, eliminazione o aggiornamento... **/
28 eventType: OutboundSyncEventType
29 /** Il tipo di sincronizzazione da eseguire (WordPress, chiamata API, ecc). **/
30 type: OutboundSyncType
31 /** Il dominio corrispondente al commento. Usiamo questo dominio per selezionare 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 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 far caricare all'utente la pagina con un payload aggiornato.

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

La SSO User API fornisce un modo per eseguire operazioni CRUD su oggetti che chiamiamo SSOUsers. Questi oggetti sono diversi dagli Users regolari e vengono mantenuti separati per type safety.

La struttura dell'oggetto SSOUser è la seguente:

Struttura di 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 // Permessi di amministratore - gli SSO users con questo flag vengono fatturati come SSO Admins (separati dagli SSO users regolari)
16 isAdminAdmin?: boolean // Permessi di amministratore - gli SSO users con questo flag vengono fatturati come SSO Admins (separati dagli SSO users regolari)
17 isCommentModeratorAdmin?: boolean // Permessi di moderatore - gli SSO users con questo flag vengono fatturati come SSO Moderators (separati dagli SSO users regolari)
18 /** Se null, l'Access Control non verrà applicato all'utente. Se è una lista vuota, questo utente non potrà vedere alcuna pagina né fare @mention ad altri utenti. **/
19 groupIds?: string[] | null
20 createdFromSimpleSSO?: boolean
21 /** Non far vedere ad altri utenti l'attività di questo utente, inclusi i commenti, sul suo profilo. Il valore predefinito è true per fornire profili sicuri di default. **/
22 isProfileActivityPrivate?: boolean
23 /** Non far sì che altri utenti possano lasciare commenti sul profilo dell'utente, o vedere i commenti esistenti sul profilo. Il valore predefinito è false. **/
24 isProfileCommentsPrivate?: boolean
25 /** Non far sì che altri utenti possano inviare messaggi diretti a questo utente. Il valore predefinito è false. **/
26 isProfileDMDisabled?: boolean
27 karma?: number
28 /** Configurazione opzionale per i badge dell'utente. **/
29 badgeConfig?: {
30 /** Array di ID badge da assegnare all'utente. Limitato a 30 badge. L'ordine viene rispettato. Questi sono badge globali visibili su tutte le pagine. **/
31 badgeIds: string[]
32 /** Array di ID badge con ambito limitato alla pagina corrente (urlId). Questi badge vengono mostrati solo sulla pagina a cui sono stati assegnati. **/
33 pageBadgeIds?: string[]
34 /** Se true, sostituisce tutti i badge attualmente visualizzati con quelli forniti. I badge globali e quelli con ambito di pagina vengono 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

Fatturazione degli SSO Users

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

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

Importante: per prevenire una doppia fatturazione, il sistema deduplica automaticamente gli SSO users rispetto agli utenti e moderatori regolari del tenant tramite l'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. È a questo che serve il campo groupIds, ed è opzionale.

@Mentions

Per impostazione predefinita, gli @mentions utilizzeranno username per cercare altri sso users quando viene digitato il carattere @. Se viene usato displayName, i risultati corrispondenti a username verranno ignorati quando c'è una corrispondenza per displayName, e i risultati della ricerca @mention utilizzeranno displayName.

Sottoscrizioni

Con FastComments, gli utenti possono sottoscrivere una pagina cliccando l'icona a forma di campanella nel widget dei commenti e poi cliccando Subscribe.

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

Con gli SSO Users, separiamo questo comportamento per compatibilità con le versioni precedenti. Gli utenti riceveranno queste email di notifica di sottoscrizione aggiuntive solo se imposti optedInSubscriptionNotifications su true.

Badge

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 badge da assegnare all'utente. Questi sono badge globali visibili su tutte le pagine. Devono essere ID badge validi creati nel tuo account FastComments. Limitato a 30 badge.
  • pageBadgeIds - Un array opzionale di ID badge con ambito limitato alla pagina corrente (urlId). Questi badge vengono mostrati solo sulla pagina a cui sono stati assegnati. Pagine diverse possono avere badge di pagina diversi per lo stesso utente.
  • override - Se true, tutti i badge attualmente visualizzati verranno sostituiti con quelli forniti. I badge globali e quelli con ambito di pagina vengono sovrascritti indipendentemente — sovrascrivere i badge globali non influisce sui badge con ambito di pagina, e viceversa. Se false o omesso, i badge forniti verranno aggiunti ai badge 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 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 utilizzo giornaliero 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 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 comune di tutti gli utenti.

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

  • Secure SSO
  • Simple SSO
  • Utenti Tenant (Ad esempio: Amministratori)
  • Commentatori

Questa API è per i Commentatori e per gli utenti creati tramite Simple SSO. In pratica, qualsiasi utente creato tramite il tuo sito può essere accessibile tramite questa API. Anche gli Utenti Tenant possono essere recuperati in questo modo, ma otterrai più informazioni interagendo con l'API /tenant-users/.

Per Secure SSO utilizza l'API /sso-users/.

Non puoi aggiornare questi tipi di utenti. Hanno creato il loro account tramite il tuo sito, quindi forniamo un accesso di base in sola lettura, ma non puoi apportare modifiche. Se desideri avere questo tipo di flusso - devi configurare 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 al blog del commentatore, per esempio. **/
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 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 configurazione 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 risultato 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 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 progresso 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.