import assert from "assert"; import { RawEvent, NormalizedEvent } from "../../types"; const getText = (event: RawEvent) => ({ processed: `Email Processed and Will be Sent`, deferred: `Email Deferred`, delivered: `Email Delivered`, open: `Email Opened`, click: `Email Clicked`, bounce: `Email Bounced`, dropped: `Email Dropped`, spamreport: `Email was reported as Spam`, unsubscribe: `User Unsubscribed from Emails`, group_unsubscribe: `User Unsubscribed from Emails in Group`, group_resubscribe: `User Resubscribed to Emails in Group` }[event.event] || event.event || null); const getDirection = (event: RawEvent) => ({ processed: "outbound", delivered: "outbound", click: "inbound", spamreport: "inbound", unsubscribe: "inbound", group_unsubscribe: "inbound", group_resubscribe: "inbound" }[event.event] || null); export default (event: RawEvent): NormalizedEvent<"sendgrid"> => { assert(event, `Sendgrid:Events null event: ${event}`); assert( event.sg_event_id, `Sendgrid:Events event is missing the required field sg_event_id ${event}` ); assert( event.timestamp, `Sendgrid:Events event is missing the required field timestamp ${event}` ); // https://sendgrid.com/docs/for-developers/tracking-events/event/#json-objects return { id: `sendgrid|${event.sg_event_id}`, ts: event.timestamp * 1000, user_info: { source_user_id: null, user_id: null, name: null, email: event.email || null, ip: event.ip || null, avatar: null, nickname: null, phone: null, city: null, continent_code: null, country: null, postal_code: null, region: null, timezone: null, country_code: null, address_line1: null, address_line2: null, user_agent: event.useragent || null, is_employee: null, title: null, birthday: null, company: { name: null, id: null, industry: null, employee_count: null, plan: null }, created_at: null, age: null, gender: null, website: null, custom_attributes: null }, text: getText(event), href: `https://app.sendgrid.com/email_activity/${event.sg_message_id}`, is_bad: [ "dropped", "deferred", "bounce", "spam report", "unsubscribe", "group unsubscribe" ].includes(event.event), direction: getDirection(event), source: "sendgrid", stream: "events" }; };