89 lines
2.9 KiB
Python
89 lines
2.9 KiB
Python
from typing import Annotated, Any, Optional
|
|
|
|
from arcade.sdk import ToolContext, tool
|
|
from arcade.sdk.auth import Hubspot
|
|
|
|
from arcade_hubspot.enums import HubspotObject
|
|
from arcade_hubspot.models import HubspotCrmClient
|
|
from arcade_hubspot.utils import clean_data
|
|
|
|
|
|
@tool(
|
|
requires_auth=Hubspot(
|
|
scopes=[
|
|
"oauth",
|
|
"crm.objects.contacts.read",
|
|
],
|
|
),
|
|
)
|
|
async def get_contact_data_by_keywords(
|
|
context: ToolContext,
|
|
keywords: Annotated[
|
|
str,
|
|
"The keywords to search for contacts. It will match against the contact's "
|
|
"first and last name, email addresses, phone numbers, and company name.",
|
|
],
|
|
limit: Annotated[
|
|
int, "The maximum number of contacts to return. Defaults to 10. Max is 100."
|
|
] = 10,
|
|
next_page_token: Annotated[
|
|
Optional[str],
|
|
"The token to get the next page of results. "
|
|
"Defaults to None (returns first page of results)",
|
|
] = None,
|
|
) -> Annotated[
|
|
dict[str, Any],
|
|
"Retrieve contact data with associated companies, deals, calls, "
|
|
"emails, meetings, notes, and tasks.",
|
|
]:
|
|
"""
|
|
Retrieve contact data with associated companies, deals, calls, emails,
|
|
meetings, notes, and tasks.
|
|
"""
|
|
limit = min(limit, 100)
|
|
client = HubspotCrmClient(context.get_auth_token_or_empty())
|
|
return await client.search_by_keywords(
|
|
object_type=HubspotObject.CONTACT,
|
|
keywords=keywords,
|
|
limit=limit,
|
|
next_page_token=next_page_token,
|
|
associations=[
|
|
HubspotObject.CALL,
|
|
HubspotObject.COMPANY,
|
|
HubspotObject.DEAL,
|
|
HubspotObject.EMAIL,
|
|
HubspotObject.MEETING,
|
|
HubspotObject.NOTE,
|
|
HubspotObject.TASK,
|
|
],
|
|
)
|
|
|
|
|
|
@tool(
|
|
requires_auth=Hubspot(
|
|
scopes=["oauth", "crm.objects.contacts.write"],
|
|
),
|
|
)
|
|
async def create_contact(
|
|
context: ToolContext,
|
|
company_id: Annotated[str, "The ID of the company to create the contact for."],
|
|
first_name: Annotated[str, "The first name of the contact."],
|
|
last_name: Annotated[Optional[str], "The last name of the contact."] = None,
|
|
email: Annotated[Optional[str], "The email address of the contact."] = None,
|
|
phone: Annotated[Optional[str], "The phone number of the contact."] = None,
|
|
mobile_phone: Annotated[Optional[str], "The mobile phone number of the contact."] = None,
|
|
job_title: Annotated[Optional[str], "The job title of the contact."] = None,
|
|
) -> Annotated[dict, "Create a contact associated with a company."]:
|
|
"""Create a contact associated with a company."""
|
|
client = HubspotCrmClient(context.get_auth_token_or_empty())
|
|
response = await client.create_contact(
|
|
company_id=company_id,
|
|
first_name=first_name,
|
|
last_name=last_name,
|
|
email=email,
|
|
phone=phone,
|
|
mobile_phone=mobile_phone,
|
|
job_title=job_title,
|
|
)
|
|
|
|
return clean_data(response, HubspotObject.CONTACT)
|