function buildTranscript(events, users) {
const nameById = Object.fromEntries(
users.map((u) => [u.id, u.name ?? u.email]),
);
return events
.filter((e) => e.type === "message")
.map(
(e) =>
`[${e.created_at}] ${nameById[e.author_id] ?? e.author_id}: ${e.text}`,
)
.join("\n");
}
async function createNote(contactId, chat) {
const transcript = buildTranscript(chat.thread.events, chat.users);
const rating = chat.thread.statistics?.agent_rating;
const body = [
`<b>Text chat:</b> ${chat.id}`,
rating &&
`<b>Rating:</b> ${rating.rating}${rating.comment ? ` — "${rating.comment}"` : ""}`,
"",
"<b>Transcript:</b>",
`<pre>${transcript}</pre>`,
]
.filter(Boolean)
.join("<br>");
await fetch("https://api.hubapi.com/crm/v3/objects/notes", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.HUBSPOT_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
properties: {
hs_note_body: body,
hs_timestamp: new Date().toISOString(),
},
associations: [
{
to: { id: contactId },
types: [
{ associationCategory: "HUBSPOT_DEFINED", associationTypeId: 202 },
],
},
],
}),
});
}