salesforce.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { Resource } from "@opencode-ai/console-resource"
  2. async function login() {
  3. const url = Resource.SALESFORCE_INSTANCE_URL.value.replace(/\/$/, "")
  4. const clientId = Resource.SALESFORCE_CLIENT_ID.value
  5. const clientSecret = Resource.SALESFORCE_CLIENT_SECRET.value
  6. const params = new URLSearchParams({
  7. grant_type: "client_credentials",
  8. client_id: clientId,
  9. client_secret: clientSecret,
  10. })
  11. const res = await fetch(`${url}/services/oauth2/token`, {
  12. method: "POST",
  13. headers: { "Content-Type": "application/x-www-form-urlencoded" },
  14. body: params.toString(),
  15. }).catch((err) => {
  16. console.error("Failed to fetch Salesforce access token:", err)
  17. })
  18. if (!res) return
  19. if (!res.ok) {
  20. console.error("Failed to fetch Salesforce access token:", res.status, await res.text())
  21. return
  22. }
  23. const data = (await res.json()) as { access_token?: string; instance_url?: string }
  24. if (!data.access_token) {
  25. console.error("Salesforce auth response did not include an access token")
  26. return
  27. }
  28. return {
  29. token: data.access_token,
  30. url: data.instance_url ?? url,
  31. }
  32. }
  33. export interface SalesforceLeadInput {
  34. name: string
  35. role: string
  36. company?: string
  37. email: string
  38. phone?: string
  39. message: string
  40. }
  41. export async function createLead(input: SalesforceLeadInput): Promise<boolean> {
  42. const auth = await login()
  43. if (!auth) return false
  44. const res = await fetch(`${auth.url}/services/data/v59.0/sobjects/Lead`, {
  45. method: "POST",
  46. headers: {
  47. Authorization: `Bearer ${auth.token}`,
  48. "Content-Type": "application/json",
  49. },
  50. body: JSON.stringify({
  51. LastName: input.name,
  52. Company: input.company?.trim() || "Website",
  53. Email: input.email,
  54. Phone: input.phone ?? null,
  55. Title: input.role,
  56. Description: input.message,
  57. LeadSource: "Website",
  58. }),
  59. }).catch((err) => {
  60. console.error("Failed to create Salesforce lead:", err)
  61. })
  62. if (!res) return false
  63. if (!res.ok) {
  64. console.error("Failed to create Salesforce lead:", res.status, await res.text())
  65. return false
  66. }
  67. return true
  68. }