import assert from "assert"; import { RawEvent, NormalizedEvent } from "../../types"; const getText = (event: RawEvent) => { switch (event.type) { case "event": return event.name; case "page": return `Viewed Page '${event.data.title}'`; case "sent_action": case "failed_action": case "attempted_action": return `${event.type.split("_")[0]} ${event.delivery_type || ""}`; case "attribute_change": return "Attributes Updated"; default: return `${event.type .split("_") .map(str => str.charAt(0).toUpperCase() + str.slice(1)) .join(" ")}`; } }; const getDirection = (event: RawEvent) => ({ event: "inbound", failed_action: "outbound", attempted_action: "outbound", sent_action: "outbound", page: "inbound", sent_email: "outbound", delivered_email: "outbound" }[event.type] || null); const getHref = (event: RawEvent) => ({ attempted_action: `https://fly.customer.io/env/1/outbox/deliveries/${event.delivery_id}`, sent_action: `https://fly.customer.io/env/1/outbox/deliveries/${event.delivery_id}`, failed_action: `https://fly.customer.io/env/1/outbox/deliveries/${event.delivery_id}` }[event.type] || `https://fly.customer.io/env/1/people/${event.customer_id}/activity`); export default (event: RawEvent): NormalizedEvent<"customer_io"> => { assert(event, `Customer.io:Activities null event: ${event}`); assert( event.id, `Customer.io:Activities event is missing the required field id ${event}` ); assert( event.timestamp, `Customer.io:Activities event is missing the required field timestamp ${event}` ); return { id: `customer_io|${event.id}`, ts: 1000 * event.timestamp, user_info: { user_id: event.customer_id, source_user_id: null, name: null, email: null, 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: 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: getHref(event), is_bad: ["failed_action", "dropped_email", "attemped_action"].includes( event.type ), direction: getDirection(event), source: "customer_io", stream: "activities" }; };