ultisuite-client/lib/mail-automation/webhook-template-variables.ts
R3D347HR4Y 20552a34ff feat(automation): multi-domain rules and webhook scope UI
Extend automations to drive and contacts with context-aware triggers,
conditions, and actions. Webhooks can filter event types and scopes per domain.
2026-06-07 15:51:47 +02:00

216 lines
5.6 KiB
TypeScript

export type WebhookTemplateVariable = {
token: string
label: string
description: string
example?: string
}
import type { AutomationDomain } from './domains'
export type WebhookTemplateVariableGroup = {
id: string
label: string
description: string
domain: AutomationDomain | 'universal'
variables: WebhookTemplateVariable[]
}
/** Variables interpolées côté backend (`internal/mail/webhooks/executor.go`). */
export const WEBHOOK_TEMPLATE_VARIABLE_GROUPS: WebhookTemplateVariableGroup[] = [
{
id: "event",
label: "Événement",
description: "Métadonnées communes à tout type d'automatisation.",
domain: "universal",
variables: [
{
token: "$event.type",
label: "Type",
description: "Type d'événement déclencheur (ex. message_received, drive_file_created).",
example: "drive_file_created",
},
{
token: "$event.domain",
label: "Domaine",
description: "Domaine source : mail, drive ou contacts.",
example: "drive",
},
{
token: "$date",
label: "Date",
description: "Horodatage ISO 8601 de l'événement.",
example: "2026-05-22T10:00:00Z",
},
],
},
{
id: "sender",
label: "Expéditeur",
description: "Identité de l'expéditeur du message déclencheur.",
domain: "mail",
variables: [
{
token: "$sender.name",
label: "Nom",
description: "Nom affiché de l'expéditeur.",
example: "Alice Example",
},
{
token: "$sender.email",
label: "E-mail",
description: "Adresse e-mail de l'expéditeur.",
example: "alice@example.com",
},
],
},
{
id: "message",
label: "Message",
description: "Métadonnées principales du mail.",
domain: "mail",
variables: [
{
token: "$subject",
label: "Objet",
description: "Objet du message.",
example: "Hello World",
},
{
token: "$message_id",
label: "Identifiant",
description: "Identifiant interne Ultimail du message.",
example: "msg-123",
},
],
},
{
id: "body",
label: "Contenu",
description: "Corps du message, en texte ou HTML.",
domain: "mail",
variables: [
{
token: "$body.textContent",
label: "Texte brut",
description: "Corps du message sans mise en forme.",
example: "Plain body",
},
{
token: "$body.htmlContent",
label: "HTML",
description: "Corps du message avec balises HTML.",
example: "<p>HTML body</p>",
},
],
},
{
id: "recipients",
label: "Destinataires",
description: "Adresses en copie directe (To).",
domain: "mail",
variables: [
{
token: "$recipients.to",
label: "To",
description: "Liste des destinataires, séparés par des virgules.",
example: "bob@example.com, carol@example.com",
},
],
},
{
id: "drive",
label: "Fichier Drive",
description: "Métadonnées du fichier ou dossier déclencheur.",
domain: "drive",
variables: [
{
token: "$drive.file_name",
label: "Nom",
description: "Nom du fichier ou dossier.",
example: "rapport.pdf",
},
{
token: "$drive.file_path",
label: "Chemin",
description: "Chemin complet dans le Drive.",
example: "/Documents/rapport.pdf",
},
{
token: "$drive.mime_type",
label: "Type MIME",
description: "Type MIME du fichier.",
example: "application/pdf",
},
{
token: "$drive.file_size",
label: "Taille",
description: "Taille en octets.",
example: "102400",
},
{
token: "$drive.is_folder",
label: "Dossier",
description: "true si l'élément est un dossier.",
example: "false",
},
],
},
{
id: "contact",
label: "Contact",
description: "Métadonnées du contact déclencheur.",
domain: "contacts",
variables: [
{
token: "$contact.name",
label: "Nom",
description: "Nom affiché du contact.",
example: "Alice Example",
},
{
token: "$contact.email",
label: "E-mail",
description: "Adresse e-mail principale.",
example: "alice@example.com",
},
{
token: "$contact.phone",
label: "Téléphone",
description: "Numéro de téléphone principal.",
example: "+33 6 00 00 00 00",
},
{
token: "$contact.org",
label: "Organisation",
description: "Entreprise ou organisation.",
example: "Example Corp",
},
{
token: "$contact.id",
label: "Identifiant",
description: "Identifiant interne du contact.",
example: "contact-42",
},
],
},
]
export const WEBHOOK_TEMPLATE_VARIABLES = WEBHOOK_TEMPLATE_VARIABLE_GROUPS.flatMap(
(group) => group.variables
)
export function webhookVariableGroupsForDomains(
domains: AutomationDomain[],
includeUniversal = true
): WebhookTemplateVariableGroup[] {
const allowed = new Set<AutomationDomain | 'universal'>(domains)
if (includeUniversal) allowed.add('universal')
return WEBHOOK_TEMPLATE_VARIABLE_GROUPS.filter((g) => allowed.has(g.domain))
}
export const WEBHOOK_DEFAULT_TEMPLATES: Record<AutomationDomain, string> = {
mail: '{"text":"Nouveau mail de $sender.name : $subject"}',
drive: '{"text":"Fichier Drive $drive.file_name ajouté dans $drive.file_path"}',
contacts: '{"text":"Contact $contact.name ($contact.email) mis à jour"}',
}