//native
export type DynSelect_object_type = string
// Dropdown of the standard CRM object types plus the account's custom objects.
export async function object_type(auth: RT.Hubspot) {
const standard = [
"contacts",
"companies",
"deals",
"tickets",
"line_items",
"products",
"quotes",
"leads",
"notes",
"tasks",
"meetings",
"calls",
"emails",
"communications",
].map((o) => ({ value: o, label: o }))
const response = await fetch("https://api.hubapi.com/crm/v3/schemas", {
headers: {
Authorization: `Bearer ${auth.token}`,
Accept: "application/json",
},
})
// A token without crm.schemas.custom.read still gets the standard objects.
if (!response.ok) return standard
const { results } = (await response.json()) as {
results: { fullyQualifiedName: string; labels: { plural: string } }[]
}
return [
...standard,
...results.map((s) => ({
value: s.fullyQualifiedName,
label: `${s.labels.plural} (custom)`,
})),
]
}
/**
* Create Task
* Create a task, optionally attached to a contact, company, deal, ticket or other record. `due_date` is ISO 8601 and defaults to now.
*/
export async function main(
auth: RT.Hubspot,
subject: string,
to_object_type: DynSelect_object_type | undefined,
to_object_id: string | undefined,
task_body: string | undefined,
due_date: string | undefined,
status:
| "NOT_STARTED"
| "IN_PROGRESS"
| "WAITING"
| "COMPLETED"
| "DEFERRED"
| undefined,
priority: "LOW" | "MEDIUM" | "HIGH" | undefined,
task_type: "TODO" | "CALL" | "EMAIL" | undefined,
owner_id: string | undefined
) {
const properties: { [key: string]: any } = {
hs_task_subject: subject,
hs_task_body: task_body,
hs_timestamp: due_date || new Date().toISOString(),
hs_task_status: status,
hs_task_priority: priority,
hs_task_type: task_type,
hubspot_owner_id: owner_id,
}
for (const key of Object.keys(properties)) {
if (properties[key] == null || properties[key] === "")
delete properties[key]
}
const response = await fetch("https://api.hubapi.com/crm/v3/objects/tasks", {
method: "POST",
headers: {
Authorization: `Bearer ${auth.token}`,
"Content-Type": "application/json",
Accept: "application/json",
},
body: JSON.stringify({ properties }),
})
if (!response.ok) {
throw new Error(`${response.status} ${await response.text()}`)
}
const created = await response.json()
if (!to_object_type || !to_object_id) return created
const association = await fetch(
`https://api.hubapi.com/crm/v4/objects/tasks/${created.id}/associations/default/${to_object_type}/${to_object_id}`,
{
method: "PUT",
headers: {
Authorization: `Bearer ${auth.token}`,
Accept: "application/json",
},
}
)
if (!association.ok) {
throw new Error(`${association.status} ${await association.text()}`)
}
return { ...created, association: await association.json() }
}
Submitted by hugo989 4 hours ago