Wire automation dispatcher to IMAP sync, drive mutations, and contact CRUD. Add webhook event_types and mail/drive/contacts scope filters (migration 30).
74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
package rules
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/ultisuite/ulti-backend/internal/mail/webhooks"
|
|
)
|
|
|
|
func WebhookContextFromEvent(evt *EventContext, msg *Message) *webhooks.MessageContext {
|
|
ctx := &webhooks.MessageContext{Date: time.Now().UTC().Format(time.RFC3339)}
|
|
if msg != nil {
|
|
senderName, senderEmail := parseFromAddress(msg.From)
|
|
ctx.SenderName = senderName
|
|
ctx.SenderEmail = senderEmail
|
|
ctx.Subject = msg.Subject
|
|
ctx.BodyText = msg.BodyText
|
|
ctx.Recipients = strings.Join(msg.To, ", ")
|
|
ctx.HasAttachment = msg.HasAttachments
|
|
ctx.MessageID = msg.ID
|
|
}
|
|
if evt == nil {
|
|
ctx.EventDomain = "mail"
|
|
return ctx
|
|
}
|
|
ctx.EventType = string(evt.Type)
|
|
ctx.EventDomain = webhookEventDomain(evt.Type)
|
|
ctx.DriveFileName = evt.DriveFileName
|
|
ctx.DriveFilePath = evt.DriveFilePath
|
|
ctx.DriveMimeType = evt.DriveMimeType
|
|
ctx.DriveFileSize = strconv.FormatInt(evt.DriveFileSize, 10)
|
|
if evt.DriveIsFolder {
|
|
ctx.DriveIsFolder = "true"
|
|
} else {
|
|
ctx.DriveIsFolder = "false"
|
|
}
|
|
ctx.ContactID = evt.ContactID
|
|
ctx.ContactName = evt.ContactName
|
|
ctx.ContactEmail = evt.ContactEmail
|
|
ctx.ContactPhone = evt.ContactPhone
|
|
ctx.ContactOrg = evt.ContactOrg
|
|
return ctx
|
|
}
|
|
|
|
func webhookEventDomain(trigger TriggerType) string {
|
|
switch trigger {
|
|
case TriggerDriveFileCreated, TriggerDriveFileUpdated, TriggerDriveFileDeleted,
|
|
TriggerDriveFileMoved, TriggerDriveShareUpdated:
|
|
return "drive"
|
|
case TriggerContactCreated, TriggerContactUpdated, TriggerContactDeleted:
|
|
return "contacts"
|
|
default:
|
|
return "mail"
|
|
}
|
|
}
|
|
|
|
func parseFromAddress(from string) (name, email string) {
|
|
from = strings.TrimSpace(from)
|
|
if from == "" {
|
|
return "", ""
|
|
}
|
|
if i := strings.LastIndex(from, "<"); i >= 0 {
|
|
j := strings.LastIndex(from, ">")
|
|
if j > i {
|
|
email = strings.TrimSpace(from[i+1 : j])
|
|
name = strings.TrimSpace(from[:i])
|
|
name = strings.Trim(name, `"`)
|
|
return name, email
|
|
}
|
|
}
|
|
return "", from
|
|
}
|