From bb6511730f546077df2cd219e75f99dc99beab2a Mon Sep 17 00:00:00 2001 From: hvinder Date: Mon, 7 Aug 2023 11:21:28 +0530 Subject: [PATCH 01/27] standardize association naming --- fern/api/definition/common/unified.yml | 4 ++-- packages/backend/models/unified/deal.ts | 14 +++++++------- packages/backend/models/unified/lead.ts | 18 +++++++++--------- packages/backend/models/unified/note.ts | 14 +++++++------- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/fern/api/definition/common/unified.yml b/fern/api/definition/common/unified.yml index b3ab2d802..f08655046 100644 --- a/fern/api/definition/common/unified.yml +++ b/fern/api/definition/common/unified.yml @@ -40,7 +40,7 @@ types: docs: The deal amount mentioned in the CRM for this deal. priority: type: optional - docs: The priority attached to this deal. + docs: The priority attached to this deal. (not supported by pipedrive) stage: type: string docs: Deal stage in the CRM. @@ -49,7 +49,7 @@ types: docs: The name of the deal in a CRM. expectedCloseDate: type: unknown - docs: Expected close date for this deal. + docs: Expected close date for this deal. (not supported by pipedrive search api) isWon: type: boolean docs: Is `true` if the deal is closed (won). diff --git a/packages/backend/models/unified/deal.ts b/packages/backend/models/unified/deal.ts index a00cd41b5..f5bfc3e18 100644 --- a/packages/backend/models/unified/deal.ts +++ b/packages/backend/models/unified/deal.ts @@ -1,7 +1,7 @@ import { TP_ID } from '@prisma/client'; import { PipedriveDealStatus } from '../../constants/pipedrive'; -export type DealAssociation = 'personId' | 'organizationId'; +export type DealAssociation = 'contactId' | 'companyId'; export interface UnifiedDeal { amount: number; @@ -46,8 +46,8 @@ export function unifyDeal(deal: any, tpId: TP_ID): UnifiedDeal { additional: {}, associations: { ...(tpId === TP_ID.pipedrive && { - personId: deal.person_id || deal.person?.id, - organizationId: deal.organization_id || deal.organization?.id, + contactId: deal.person_id || deal.person?.id, + companyId: deal.organization_id || deal.organization?.id, }), }, }; @@ -143,11 +143,11 @@ export function toPipedriveDeal(unifiedDeal: UnifiedDeal): any { status: unifiedDeal.isWon ? PipedriveDealStatus.won : PipedriveDealStatus.open, add_time: unifiedDeal.createdTimestamp, update_time: unifiedDeal.updatedTimestamp, - ...(unifiedDeal.associations?.personId && { - person_id: unifiedDeal.associations.personId, + ...(unifiedDeal.associations?.contactId && { + person_id: unifiedDeal.associations.contactId, }), - ...(unifiedDeal.associations?.organizationId && { - org_id: unifiedDeal.associations.organizationId, + ...(unifiedDeal.associations?.companyId && { + org_id: unifiedDeal.associations.companyId, }), }; diff --git a/packages/backend/models/unified/lead.ts b/packages/backend/models/unified/lead.ts index 758fdb662..03d7dc781 100644 --- a/packages/backend/models/unified/lead.ts +++ b/packages/backend/models/unified/lead.ts @@ -4,7 +4,7 @@ import { HubspotLead } from '../../constants/hubspot'; import { ZohoLead } from '../../constants/zoho'; import { SalesforceLead } from '../../constants/salesforce'; -export type LeadAssociation = 'personId' | 'organizationId'; +export type LeadAssociation = 'contactId' | 'companyId'; export interface UnifiedLead { firstName: string; @@ -68,8 +68,8 @@ export function unifyLead(lead: any, tpId: TP_ID): UnifiedLead { additional: {}, associations: { ...(tpId === TP_ID.pipedrive && { - personId: lead.person_id || lead.person?.id, - organizationId: lead.organization_id || lead.organization?.id, + contactId: lead.person_id || lead.person?.id, + companyId: lead.organization_id || lead.organization?.id, }), }, }; @@ -162,11 +162,11 @@ export function toPipedriveLead(lead: UnifiedLead): Partial { title: `${lead.firstName} ${lead.lastName}`, add_time: lead.createdTimestamp, update_time: lead.updatedTimestamp, - ...(lead.associations?.personId && { - person_id: lead.associations.personId, + ...(lead.associations?.contactId && { + person_id: lead.associations.contactId, }), - ...(lead.associations?.organizationId && { - organization_id: lead.associations.organizationId, + ...(lead.associations?.companyId && { + organization_id: lead.associations.companyId, }), }; @@ -181,7 +181,7 @@ export function toPipedriveLead(lead: UnifiedLead): Partial { export function unifiedLeadToPipedrivePerson(lead: UnifiedLead): Partial { return { - id: lead.associations?.personId, + id: lead.associations?.contactId, first_name: lead.firstName, last_name: lead.lastName, name: `${lead.firstName} ${lead.lastName}`, @@ -193,7 +193,7 @@ export function unifiedLeadToPipedrivePerson(lead: UnifiedLead): Partial { return { - id: lead.associations?.organizationId, + id: lead.associations?.companyId, name: lead.firstName, cc_email: lead.email, }; diff --git a/packages/backend/models/unified/note.ts b/packages/backend/models/unified/note.ts index 975448f98..ddb262067 100644 --- a/packages/backend/models/unified/note.ts +++ b/packages/backend/models/unified/note.ts @@ -1,7 +1,7 @@ import { TP_ID } from '@prisma/client'; import { getHubspotAssociationObj } from '../../helpers/hubspot'; -export type NoteAssociation = 'personId' | 'organizationId' | 'leadId' | 'dealId'; +export type NoteAssociation = 'contactId' | 'companyId' | 'leadId' | 'dealId'; export interface UnifiedNote { content: string; @@ -36,8 +36,8 @@ export function unifyNote(note: any, tpId: TP_ID): UnifiedNote { additional: {}, associations: { ...(tpId === TP_ID.pipedrive && { - personId: note.person_id, - organizationId: note.org_id, + contactId: note.person_id, + companyId: note.org_id, leadId: note.lead_id, dealId: note.deal_id, }), @@ -138,11 +138,11 @@ export function toPipedriveNote(unified: UnifiedNote): any { content: unified.content, add_time: unified.createdTimestamp, update_time: unified.updatedTimestamp, - ...(unified.associations?.personId && { - person_id: unified.associations.personId, + ...(unified.associations?.contactId && { + person_id: unified.associations.contactId, }), - ...(unified.associations?.organizationId && { - organization_id: unified.associations.organizationId, + ...(unified.associations?.companyId && { + organization_id: unified.associations.companyId, }), ...(unified.associations?.leadId && { lead_id: unified.associations.leadId, From eb589d562f2b0eb32809dd21689f63d0cc704ecf Mon Sep 17 00:00:00 2001 From: hvinder Date: Mon, 7 Aug 2023 11:33:47 +0530 Subject: [PATCH 02/27] create a union type for association --- packages/backend/constants/{index.ts => common.ts} | 2 +- packages/backend/constants/typeHelpers.ts | 3 +++ packages/backend/helpers/hubspot.ts | 4 ++-- packages/backend/models/unified/deal.ts | 4 +++- packages/backend/models/unified/lead.ts | 4 +++- packages/backend/models/unified/note.ts | 4 +++- packages/backend/services/auth.ts | 2 +- packages/backend/services/metadata.ts | 2 +- 8 files changed, 17 insertions(+), 8 deletions(-) rename packages/backend/constants/{index.ts => common.ts} (94%) create mode 100644 packages/backend/constants/typeHelpers.ts diff --git a/packages/backend/constants/index.ts b/packages/backend/constants/common.ts similarity index 94% rename from packages/backend/constants/index.ts rename to packages/backend/constants/common.ts index cb0bfa5d7..7d56c0d89 100644 --- a/packages/backend/constants/index.ts +++ b/packages/backend/constants/common.ts @@ -36,4 +36,4 @@ export const DEFAULT_SCOPE = { [TP_ID.pipedrive]: [], }; -export type ValueOf = T[keyof T]; +export type AllAssociation = 'contactId' | 'companyId' | 'leadId' | 'dealId'; diff --git a/packages/backend/constants/typeHelpers.ts b/packages/backend/constants/typeHelpers.ts new file mode 100644 index 000000000..15d0dda49 --- /dev/null +++ b/packages/backend/constants/typeHelpers.ts @@ -0,0 +1,3 @@ +export type ValueOf = T[keyof T]; + +export type Subtype = U; diff --git a/packages/backend/helpers/hubspot.ts b/packages/backend/helpers/hubspot.ts index dc38e18fe..1819c6cac 100644 --- a/packages/backend/helpers/hubspot.ts +++ b/packages/backend/helpers/hubspot.ts @@ -1,6 +1,6 @@ -import { NoteAssociation } from '../models/unified'; +import { AllAssociation } from "../constants/common"; -export const getHubspotAssociationObj = (key: NoteAssociation) => { +export const getHubspotAssociationObj = (key: AllAssociation) => { switch (key) { case 'dealId': { return { diff --git a/packages/backend/models/unified/deal.ts b/packages/backend/models/unified/deal.ts index f5bfc3e18..3aa76633c 100644 --- a/packages/backend/models/unified/deal.ts +++ b/packages/backend/models/unified/deal.ts @@ -1,7 +1,9 @@ import { TP_ID } from '@prisma/client'; import { PipedriveDealStatus } from '../../constants/pipedrive'; +import { Subtype } from '../../constants/typehelpers'; +import { AllAssociation } from '../../constants/common'; -export type DealAssociation = 'contactId' | 'companyId'; +export type DealAssociation = Subtype; export interface UnifiedDeal { amount: number; diff --git a/packages/backend/models/unified/lead.ts b/packages/backend/models/unified/lead.ts index 03d7dc781..85dfcd8ea 100644 --- a/packages/backend/models/unified/lead.ts +++ b/packages/backend/models/unified/lead.ts @@ -3,8 +3,10 @@ import { PipedriveContact, PipedriveLead, PipedriveCompany } from '../../constan import { HubspotLead } from '../../constants/hubspot'; import { ZohoLead } from '../../constants/zoho'; import { SalesforceLead } from '../../constants/salesforce'; +import { AllAssociation } from '../../constants/common'; +import { Subtype } from '../../constants/typehelpers'; -export type LeadAssociation = 'contactId' | 'companyId'; +export type LeadAssociation = Subtype; export interface UnifiedLead { firstName: string; diff --git a/packages/backend/models/unified/note.ts b/packages/backend/models/unified/note.ts index ddb262067..9d86984e8 100644 --- a/packages/backend/models/unified/note.ts +++ b/packages/backend/models/unified/note.ts @@ -1,7 +1,9 @@ import { TP_ID } from '@prisma/client'; import { getHubspotAssociationObj } from '../../helpers/hubspot'; +import { Subtype } from '../../constants/typehelpers'; +import { AllAssociation } from '../../constants/common'; -export type NoteAssociation = 'contactId' | 'companyId' | 'leadId' | 'dealId'; +export type NoteAssociation = Subtype; export interface UnifiedNote { content: string; diff --git a/packages/backend/services/auth.ts b/packages/backend/services/auth.ts index 7d2b0b9ed..32f3193b6 100644 --- a/packages/backend/services/auth.ts +++ b/packages/backend/services/auth.ts @@ -6,7 +6,7 @@ import { v4 as uuidv4 } from 'uuid'; import isWorkEmail from '../helpers/isWorkEmail'; import { ENV, TP_ID } from '@prisma/client'; import logError from '../helpers/logError'; -import { DEFAULT_SCOPE } from '../constants'; +import { DEFAULT_SCOPE } from '../constants/common'; class AuthService { async refreshOAuthTokensForThirdParty() { diff --git a/packages/backend/services/metadata.ts b/packages/backend/services/metadata.ts index 49df0d218..613727f8f 100644 --- a/packages/backend/services/metadata.ts +++ b/packages/backend/services/metadata.ts @@ -5,7 +5,7 @@ import { InternalServerError, UnAuthorizedError } from '../generated/typescript/ import logError from '../helpers/logError'; import config from '../config'; import { TP_ID, apps } from '@prisma/client'; -import { DEFAULT_SCOPE } from '../constants'; +import { DEFAULT_SCOPE } from '../constants/common'; const metadataService = new MetadataService({ async getCrms(req, res) { From 879ee1be467edbc1c4613c0523b50d015bc110d7 Mon Sep 17 00:00:00 2001 From: hvinder Date: Mon, 7 Aug 2023 21:08:03 +0530 Subject: [PATCH 03/27] hubspot association ids --- packages/backend/constants/common.ts | 2 +- packages/backend/helpers/hubspot.ts | 64 ++++++++++++++++++++----- packages/backend/models/unified/note.ts | 8 ++-- 3 files changed, 56 insertions(+), 18 deletions(-) diff --git a/packages/backend/constants/common.ts b/packages/backend/constants/common.ts index 7d56c0d89..3ed10d77d 100644 --- a/packages/backend/constants/common.ts +++ b/packages/backend/constants/common.ts @@ -36,4 +36,4 @@ export const DEFAULT_SCOPE = { [TP_ID.pipedrive]: [], }; -export type AllAssociation = 'contactId' | 'companyId' | 'leadId' | 'dealId'; +export type AllAssociation = 'contactId' | 'companyId' | 'leadId' | 'dealId' | 'noteId'; diff --git a/packages/backend/helpers/hubspot.ts b/packages/backend/helpers/hubspot.ts index 1819c6cac..5dafec469 100644 --- a/packages/backend/helpers/hubspot.ts +++ b/packages/backend/helpers/hubspot.ts @@ -1,16 +1,54 @@ -import { AllAssociation } from "../constants/common"; +import { AllAssociation } from '../constants/common'; -export const getHubspotAssociationObj = (key: AllAssociation) => { - switch (key) { - case 'dealId': { - return { - associationCategory: 'HUBSPOT_DEFINED', - associationTypeId: 214, - }; - break; - } - default: { - return {}; - } +export const getHubspotAssociationObj = ( + key: AllAssociation, + associateObj: 'note' | 'deal' | 'contact' | 'lead' | 'company' +) => { + const associationTypeMapping: { + [x in typeof associateObj]: { [y in AllAssociation]: number | undefined }; + } = { + note: { + dealId: 214, + companyId: 190, + contactId: 202, + leadId: 202, + noteId: undefined, + }, + deal: { + contactId: 3, + leadId: 3, + companyId: 341, + noteId: 213, + dealId: undefined, + }, + contact: { + companyId: 279, + dealId: 4, + noteId: 201, + leadId: undefined, + contactId: undefined, + }, + lead: { + companyId: 279, + dealId: 4, + noteId: 201, + contactId: undefined, + leadId: undefined, + }, + company: { + contactId: 280, + leadId: 280, + dealId: 342, + noteId: 189, + companyId: undefined, + }, + }; + const associationTypeId = associationTypeMapping[associateObj][key]; + if (associationTypeId) { + return { + associationCategory: 'HUBSPOT_DEFINED', + associationTypeId, + }; } + return null; }; diff --git a/packages/backend/models/unified/note.ts b/packages/backend/models/unified/note.ts index 9d86984e8..076310c84 100644 --- a/packages/backend/models/unified/note.ts +++ b/packages/backend/models/unified/note.ts @@ -43,9 +43,9 @@ export function unifyNote(note: any, tpId: TP_ID): UnifiedNote { leadId: note.lead_id, dealId: note.deal_id, }), - ...(tpId === TP_ID.hubspot && { - deal_id: '', - }), + // ...(tpId === TP_ID.hubspot && { + // deal_id: '', + // }), }, }; @@ -125,7 +125,7 @@ export function toHubspotNote(unified: UnifiedNote): any { to: { id: associationObj[key as NoteAssociation], }, - types: [getHubspotAssociationObj(key as NoteAssociation)], + types: [getHubspotAssociationObj(key as NoteAssociation, 'note')], }; }); hubspotNote['associations'] = associationArr; From e29eddf018f6384bb1f07b71dc282d7c88069e01 Mon Sep 17 00:00:00 2001 From: hvinder Date: Mon, 7 Aug 2023 21:18:35 +0530 Subject: [PATCH 04/27] hubspot contact -> deal association --- packages/backend/models/unified/contact.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/backend/models/unified/contact.ts b/packages/backend/models/unified/contact.ts index de2dbe661..018fd9eae 100644 --- a/packages/backend/models/unified/contact.ts +++ b/packages/backend/models/unified/contact.ts @@ -3,6 +3,11 @@ import { PipedriveContact } from '../../constants/pipedrive'; import { HubspotContact } from '../../constants/hubspot'; import { ZohoContact } from '../../constants/zoho'; import { SalesforceContact } from '../../constants/salesforce'; +import { Subtype } from '../../constants/typehelpers'; +import { AllAssociation } from '../../constants/common'; +import { getHubspotAssociationObj } from '../../helpers/hubspot'; + +export type ContactAssociation = Subtype; export interface UnifiedContact { firstName: string; @@ -13,7 +18,9 @@ export interface UnifiedContact { remoteId: string; // TODO: Make this unique. createdTimestamp: Date; updatedTimestamp: Date; - associations?: any; // TODO: Support associations + associations?: { + [x in ContactAssociation]?: string; + }; additional: any; } @@ -137,6 +144,18 @@ export function toHubspotContact(unifiedContact: UnifiedContact): Partial { + return { + to: { + id: associationObj[key as ContactAssociation], + }, + types: [getHubspotAssociationObj(key as ContactAssociation, 'contact')], + }; + }); + hubspotContact['associations'] = associationArr; + } return hubspotContact; } From 88257bd826ac3199396ac1ff930394352138e79c Mon Sep 17 00:00:00 2001 From: hvinder Date: Mon, 7 Aug 2023 21:24:11 +0530 Subject: [PATCH 05/27] hubspot company -> deal association --- packages/backend/models/unified/company.ts | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/backend/models/unified/company.ts b/packages/backend/models/unified/company.ts index 3ff236120..ce90a0e71 100644 --- a/packages/backend/models/unified/company.ts +++ b/packages/backend/models/unified/company.ts @@ -1,5 +1,10 @@ import { TP_ID } from '@prisma/client'; import { PipedriveCompany } from '../../constants/pipedrive'; +import { Subtype } from '../../constants/typehelpers'; +import { AllAssociation } from '../../constants/common'; +import { getHubspotAssociationObj } from '../../helpers/hubspot'; + +export type CompanyAssociation = Subtype; export interface UnifiedCompany { name: string; @@ -20,7 +25,9 @@ export interface UnifiedCompany { remoteId: string; createdTimestamp: Date; updatedTimestamp: Date; - associations?: any; // TODO: Support associations + associations?: { + [x in CompanyAssociation]?: string; + }; additional: any; } @@ -578,6 +585,19 @@ export function toHubspotCompany(unifiedCompany: UnifiedCompany): Partial { + return { + to: { + id: associationObj[key as CompanyAssociation], + }, + types: [getHubspotAssociationObj(key as CompanyAssociation, 'company')], + }; + }); + hubspotCompany['associations'] = associationArr; + } + return hubspotCompany; } From 9cf27744d4466f119edaa0cb7ff6a7273c7ef6b1 Mon Sep 17 00:00:00 2001 From: hvinder Date: Tue, 8 Aug 2023 14:00:42 +0530 Subject: [PATCH 06/27] hubspot event -> deal association --- packages/backend/helpers/hubspot.ts | 9 +++++- packages/backend/models/unified/event.ts | 37 +++++++++++++++++++++--- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/packages/backend/helpers/hubspot.ts b/packages/backend/helpers/hubspot.ts index 5dafec469..923165371 100644 --- a/packages/backend/helpers/hubspot.ts +++ b/packages/backend/helpers/hubspot.ts @@ -2,7 +2,7 @@ import { AllAssociation } from '../constants/common'; export const getHubspotAssociationObj = ( key: AllAssociation, - associateObj: 'note' | 'deal' | 'contact' | 'lead' | 'company' + associateObj: 'note' | 'deal' | 'contact' | 'lead' | 'company' | 'event' ) => { const associationTypeMapping: { [x in typeof associateObj]: { [y in AllAssociation]: number | undefined }; @@ -42,6 +42,13 @@ export const getHubspotAssociationObj = ( noteId: 189, companyId: undefined, }, + event: { + contactId: 200, + leadId: 601, + dealId: 212, + noteId: undefined, + companyId: 188, + }, }; const associationTypeId = associationTypeMapping[associateObj][key]; if (associationTypeId) { diff --git a/packages/backend/models/unified/event.ts b/packages/backend/models/unified/event.ts index 77f746d89..5b6ef4c63 100644 --- a/packages/backend/models/unified/event.ts +++ b/packages/backend/models/unified/event.ts @@ -1,4 +1,9 @@ import { TP_ID } from '@prisma/client'; +import { AllAssociation } from '../../constants/common'; +import { Subtype } from '../../constants/typehelpers'; +import { getHubspotAssociationObj } from '../../helpers/hubspot'; + +export type EventAssociation = Subtype; export interface UnifiedEvent { type: string; @@ -12,7 +17,9 @@ export interface UnifiedEvent { remoteId: string; createdTimestamp: Date; updatedTimestamp: Date; - associations?: any; // TODO: Support associations + associations?: { + [x in EventAssociation]?: string; + }; additional: any; } @@ -21,9 +28,18 @@ export function unifyEvent(event: any): UnifiedEvent { remoteId: event.id || event.Id, id: event.id || event.eventID || event.event_id || event.Id, createdTimestamp: - event.createdDate || event.CreatedDate || event.Created_Time || event.hs_timestamp || event.hs_createdate || event.add_time, + event.createdDate || + event.CreatedDate || + event.Created_Time || + event.hs_timestamp || + event.hs_createdate || + event.add_time, updatedTimestamp: - event.lastModifiedDate || event.LastModifiedDate || event.Modified_Time || event.hs_lastmodifieddate || event.update_time, + event.lastModifiedDate || + event.LastModifiedDate || + event.Modified_Time || + event.hs_lastmodifieddate || + event.update_time, type: event.type || event.Type || event.hs_activity_type || event.EventSubtype, // Note: No Type field in zoho subject: event.subject || event.Subject || event.hs_meeting_title || event.Event_Title, description: event.description || event.Description || event.hs_meeting_body || event.public_description, @@ -114,13 +130,26 @@ export function toHubspotEvent(unifiedEvent: UnifiedEvent): any { }); } + if (unifiedEvent.associations) { + const associationObj = unifiedEvent.associations; + const associationArr = Object.keys(associationObj).map((key) => { + return { + to: { + id: associationObj[key as EventAssociation], + }, + types: [getHubspotAssociationObj(key as EventAssociation, 'event')], + }; + }); + hubspotEvent['associations'] = associationArr; + } + return hubspotEvent; } export function toPipedriveEvent(unifiedEvent: UnifiedEvent): any { const pipedriveEvent: any = { id: unifiedEvent.remoteId, - type: "meeting", + type: 'meeting', subject: unifiedEvent.subject, add_time: unifiedEvent.startDateTime, due_time: unifiedEvent.endDateTime, From 3f0a6a9ec52fd3f61ba5b1cc374e2cc22d23aa6a Mon Sep 17 00:00:00 2001 From: hvinder Date: Tue, 8 Aug 2023 14:06:09 +0530 Subject: [PATCH 07/27] hubspot lead -> deal association --- packages/backend/models/unified/lead.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/backend/models/unified/lead.ts b/packages/backend/models/unified/lead.ts index 85dfcd8ea..53fdac959 100644 --- a/packages/backend/models/unified/lead.ts +++ b/packages/backend/models/unified/lead.ts @@ -5,8 +5,9 @@ import { ZohoLead } from '../../constants/zoho'; import { SalesforceLead } from '../../constants/salesforce'; import { AllAssociation } from '../../constants/common'; import { Subtype } from '../../constants/typehelpers'; +import { getHubspotAssociationObj } from '../../helpers/hubspot'; -export type LeadAssociation = Subtype; +export type LeadAssociation = Subtype; export interface UnifiedLead { firstName: string; @@ -155,6 +156,18 @@ export function toHubspotLead(lead: UnifiedLead): Partial { hubspotLead['properties'][key] = lead.additional?.[key]; }); } + if (lead.associations) { + const associationObj = lead.associations; + const associationArr = Object.keys(associationObj).map((key) => { + return { + to: { + id: associationObj[key as LeadAssociation], + }, + types: [getHubspotAssociationObj(key as LeadAssociation, 'lead')], + }; + }); + hubspotLead['associations'] = associationArr; + } return hubspotLead; } From 432591b9cc5040ec433fcf8d0419884405f69824 Mon Sep 17 00:00:00 2001 From: hvinder Date: Tue, 8 Aug 2023 14:12:10 +0530 Subject: [PATCH 08/27] hubspot task -> deal association --- packages/backend/helpers/hubspot.ts | 9 ++++++- packages/backend/models/unified/task.ts | 34 ++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/packages/backend/helpers/hubspot.ts b/packages/backend/helpers/hubspot.ts index 923165371..bb60f0be8 100644 --- a/packages/backend/helpers/hubspot.ts +++ b/packages/backend/helpers/hubspot.ts @@ -2,7 +2,7 @@ import { AllAssociation } from '../constants/common'; export const getHubspotAssociationObj = ( key: AllAssociation, - associateObj: 'note' | 'deal' | 'contact' | 'lead' | 'company' | 'event' + associateObj: 'note' | 'deal' | 'contact' | 'lead' | 'company' | 'event' | 'task' ) => { const associationTypeMapping: { [x in typeof associateObj]: { [y in AllAssociation]: number | undefined }; @@ -49,6 +49,13 @@ export const getHubspotAssociationObj = ( noteId: undefined, companyId: 188, }, + task: { + contactId: 204, + leadId: undefined, + dealId: 216, + noteId: undefined, + companyId: 192, + }, }; const associationTypeId = associationTypeMapping[associateObj][key]; if (associationTypeId) { diff --git a/packages/backend/models/unified/task.ts b/packages/backend/models/unified/task.ts index f63533080..5e7088caa 100644 --- a/packages/backend/models/unified/task.ts +++ b/packages/backend/models/unified/task.ts @@ -1,4 +1,9 @@ import { TP_ID } from '@prisma/client'; +import { AllAssociation } from '../../constants/common'; +import { Subtype } from '../../constants/typehelpers'; +import { getHubspotAssociationObj } from '../../helpers/hubspot'; + +export type TaskAssociation = Subtype; export interface UnifiedTask { subject: string; @@ -10,7 +15,9 @@ export interface UnifiedTask { remoteId: string; createdTimestamp: Date; updatedTimestamp: Date; - associations?: any; // TODO: Support associations + associations?: { + [x in TaskAssociation]?: string; + }; additional: any; } @@ -19,9 +26,18 @@ export function unifyTask(task: any): UnifiedTask { remoteId: task.id || task.Id, id: task.id || task.Id, createdTimestamp: - task.createdDate || task.CreatedDate || task.Created_Time || task.hs_timestamp || task.hs_createdate || task.add_time, + task.createdDate || + task.CreatedDate || + task.Created_Time || + task.hs_timestamp || + task.hs_createdate || + task.add_time, updatedTimestamp: - task.lastModifiedDate || task.LastModifiedDate || task.Modified_Time || task.hs_lastmodifieddate || task.update_time, + task.lastModifiedDate || + task.LastModifiedDate || + task.Modified_Time || + task.hs_lastmodifieddate || + task.update_time, body: task.Description || task.description || task.hs_task_body || task.public_description, subject: task.hs_task_subject || task.Subject || task.subject, priority: task.priority || task.Priority || task.hs_task_priority, @@ -103,6 +119,18 @@ export function toHubspotTask(unified: UnifiedTask): any { hubspotTask['properties'][key] = unified.additional?.[key]; }); } + if (unified.associations) { + const associationObj = unified.associations; + const associationArr = Object.keys(associationObj).map((key) => { + return { + to: { + id: associationObj[key as TaskAssociation], + }, + types: [getHubspotAssociationObj(key as TaskAssociation, 'task')], + }; + }); + hubspotTask['associations'] = associationArr; + } return hubspotTask; } From 7c8cc680a624a4989fd97386dcd9f26a1aec3970 Mon Sep 17 00:00:00 2001 From: hvinder Date: Thu, 10 Aug 2023 14:01:18 +0530 Subject: [PATCH 09/27] sfdc note -> deal association --- packages/backend/models/unified/note.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/backend/models/unified/note.ts b/packages/backend/models/unified/note.ts index 076310c84..87179d9e1 100644 --- a/packages/backend/models/unified/note.ts +++ b/packages/backend/models/unified/note.ts @@ -63,6 +63,9 @@ export function toSalesforceNote(unified: UnifiedNote): any { const salesforceNote: any = { Id: unified.remoteId, Body: unified.content, + ...(unified.associations?.dealId && { + parentId: unified.associations.dealId, + }), }; // Map custom fields From 977ed8e458d5d0251c19182612ec81fd77b4ab25 Mon Sep 17 00:00:00 2001 From: hvinder Date: Thu, 10 Aug 2023 14:12:27 +0530 Subject: [PATCH 10/27] sfdc task -> deal association --- packages/backend/models/unified/task.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/backend/models/unified/task.ts b/packages/backend/models/unified/task.ts index 5e7088caa..4197c7497 100644 --- a/packages/backend/models/unified/task.ts +++ b/packages/backend/models/unified/task.ts @@ -64,6 +64,9 @@ export function toSalesforceTask(unified: UnifiedTask): any { Priority: unified.priority, Status: unified.status, ActivityDate: unified.dueDate, + ...(unified.associations?.dealId && { + WhatId: unified.associations.dealId, + }), }; // Map custom fields From e224df0b290be7507fbda61b6b5f1f3c4fc78e3e Mon Sep 17 00:00:00 2001 From: hvinder Date: Thu, 10 Aug 2023 14:19:05 +0530 Subject: [PATCH 11/27] sfdc event -> deal & event -> contact association --- packages/backend/models/unified/event.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/backend/models/unified/event.ts b/packages/backend/models/unified/event.ts index 5b6ef4c63..93bfdb611 100644 --- a/packages/backend/models/unified/event.ts +++ b/packages/backend/models/unified/event.ts @@ -3,7 +3,7 @@ import { AllAssociation } from '../../constants/common'; import { Subtype } from '../../constants/typehelpers'; import { getHubspotAssociationObj } from '../../helpers/hubspot'; -export type EventAssociation = Subtype; +export type EventAssociation = Subtype; export interface UnifiedEvent { type: string; @@ -70,6 +70,12 @@ export function toSalesforceEvent(unified: UnifiedEvent): any { IsAllDayEvent: unified.isAllDayEvent, Location: unified.location, Description: unified.description, + ...(unified.associations?.dealId && { + WhatId: unified.associations.dealId, + }), + ...(unified.associations?.contactId && { + WhoId: unified.associations.contactId, + }), }; // Map custom fields From 22c8977e40f83bc25087dd8a62e980583f7431d7 Mon Sep 17 00:00:00 2001 From: hvinder Date: Thu, 10 Aug 2023 14:31:45 +0530 Subject: [PATCH 12/27] fix import --- packages/backend/models/unified/company.ts | 2 +- packages/backend/models/unified/contact.ts | 2 +- packages/backend/models/unified/lead.ts | 2 +- packages/backend/models/unified/note.ts | 2 +- packages/backend/models/unified/task.ts | 2 +- packages/backend/models/unified/user.ts | 8 +++++++- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/backend/models/unified/company.ts b/packages/backend/models/unified/company.ts index ce90a0e71..ed79b5696 100644 --- a/packages/backend/models/unified/company.ts +++ b/packages/backend/models/unified/company.ts @@ -1,6 +1,6 @@ import { TP_ID } from '@prisma/client'; import { PipedriveCompany } from '../../constants/pipedrive'; -import { Subtype } from '../../constants/typehelpers'; +import { Subtype } from '../../constants/typeHelpers'; import { AllAssociation } from '../../constants/common'; import { getHubspotAssociationObj } from '../../helpers/hubspot'; diff --git a/packages/backend/models/unified/contact.ts b/packages/backend/models/unified/contact.ts index 018fd9eae..065ff2e33 100644 --- a/packages/backend/models/unified/contact.ts +++ b/packages/backend/models/unified/contact.ts @@ -3,7 +3,7 @@ import { PipedriveContact } from '../../constants/pipedrive'; import { HubspotContact } from '../../constants/hubspot'; import { ZohoContact } from '../../constants/zoho'; import { SalesforceContact } from '../../constants/salesforce'; -import { Subtype } from '../../constants/typehelpers'; +import { Subtype } from '../../constants/typeHelpers'; import { AllAssociation } from '../../constants/common'; import { getHubspotAssociationObj } from '../../helpers/hubspot'; diff --git a/packages/backend/models/unified/lead.ts b/packages/backend/models/unified/lead.ts index 53fdac959..731223ed6 100644 --- a/packages/backend/models/unified/lead.ts +++ b/packages/backend/models/unified/lead.ts @@ -4,7 +4,7 @@ import { HubspotLead } from '../../constants/hubspot'; import { ZohoLead } from '../../constants/zoho'; import { SalesforceLead } from '../../constants/salesforce'; import { AllAssociation } from '../../constants/common'; -import { Subtype } from '../../constants/typehelpers'; +import { Subtype } from '../../constants/typeHelpers'; import { getHubspotAssociationObj } from '../../helpers/hubspot'; export type LeadAssociation = Subtype; diff --git a/packages/backend/models/unified/note.ts b/packages/backend/models/unified/note.ts index 87179d9e1..0127ea5e1 100644 --- a/packages/backend/models/unified/note.ts +++ b/packages/backend/models/unified/note.ts @@ -1,6 +1,6 @@ import { TP_ID } from '@prisma/client'; import { getHubspotAssociationObj } from '../../helpers/hubspot'; -import { Subtype } from '../../constants/typehelpers'; +import { Subtype } from '../../constants/typeHelpers'; import { AllAssociation } from '../../constants/common'; export type NoteAssociation = Subtype; diff --git a/packages/backend/models/unified/task.ts b/packages/backend/models/unified/task.ts index 4197c7497..83c782d94 100644 --- a/packages/backend/models/unified/task.ts +++ b/packages/backend/models/unified/task.ts @@ -1,6 +1,6 @@ import { TP_ID } from '@prisma/client'; import { AllAssociation } from '../../constants/common'; -import { Subtype } from '../../constants/typehelpers'; +import { Subtype } from '../../constants/typeHelpers'; import { getHubspotAssociationObj } from '../../helpers/hubspot'; export type TaskAssociation = Subtype; diff --git a/packages/backend/models/unified/user.ts b/packages/backend/models/unified/user.ts index efb98eae0..004b393f6 100644 --- a/packages/backend/models/unified/user.ts +++ b/packages/backend/models/unified/user.ts @@ -1,4 +1,8 @@ import { TP_ID } from '@prisma/client'; +import { AllAssociation } from '../../constants/common'; +import { Subtype } from '../../constants/typeHelpers'; + +export type UserAssociation = Subtype; export interface UnifiedUser { firstName: string; @@ -9,7 +13,9 @@ export interface UnifiedUser { remoteId: string; createdTimestamp: Date; updatedTimestamp: Date; - associations?: any; // TODO: Support associations + associations?: { + [x in UserAssociation]?: string; + }; additional: any; } From 774deb6c6989607cde05ffea8d0f1a0e62d861f9 Mon Sep 17 00:00:00 2001 From: hvinder Date: Thu, 10 Aug 2023 14:32:33 +0530 Subject: [PATCH 13/27] fix import --- packages/backend/models/unified/deal.ts | 2 +- packages/backend/models/unified/event.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/models/unified/deal.ts b/packages/backend/models/unified/deal.ts index 3aa76633c..256861f43 100644 --- a/packages/backend/models/unified/deal.ts +++ b/packages/backend/models/unified/deal.ts @@ -1,6 +1,6 @@ import { TP_ID } from '@prisma/client'; import { PipedriveDealStatus } from '../../constants/pipedrive'; -import { Subtype } from '../../constants/typehelpers'; +import { Subtype } from '../../constants/typeHelpers'; import { AllAssociation } from '../../constants/common'; export type DealAssociation = Subtype; diff --git a/packages/backend/models/unified/event.ts b/packages/backend/models/unified/event.ts index 93bfdb611..824f560aa 100644 --- a/packages/backend/models/unified/event.ts +++ b/packages/backend/models/unified/event.ts @@ -1,6 +1,6 @@ import { TP_ID } from '@prisma/client'; import { AllAssociation } from '../../constants/common'; -import { Subtype } from '../../constants/typehelpers'; +import { Subtype } from '../../constants/typeHelpers'; import { getHubspotAssociationObj } from '../../helpers/hubspot'; export type EventAssociation = Subtype; From f603d98505a17abce99350ffea399ffab9de7b59 Mon Sep 17 00:00:00 2001 From: hvinder Date: Thu, 10 Aug 2023 15:39:06 +0530 Subject: [PATCH 14/27] zoho note -> deal association --- packages/backend/models/unified/note.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/backend/models/unified/note.ts b/packages/backend/models/unified/note.ts index 0127ea5e1..45e2ffafb 100644 --- a/packages/backend/models/unified/note.ts +++ b/packages/backend/models/unified/note.ts @@ -79,7 +79,14 @@ export function toSalesforceNote(unified: UnifiedNote): any { export function toZohoNote(unified: UnifiedNote): any { const zoho: any = { - data: [{}], + data: [ + { + ...(unified.associations?.dealId && { + Parent_Id: unified.associations.dealId, + se_module: 'Deals', + }), + }, + ], apply_feature_execution: [ { name: 'layout_rules', From c89f3424228953787014eb74dfc38ca9037d150c Mon Sep 17 00:00:00 2001 From: hvinder Date: Fri, 11 Aug 2023 11:42:56 +0530 Subject: [PATCH 15/27] zoho event -> deal association --- packages/backend/models/unified/event.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/backend/models/unified/event.ts b/packages/backend/models/unified/event.ts index 824f560aa..c103c2809 100644 --- a/packages/backend/models/unified/event.ts +++ b/packages/backend/models/unified/event.ts @@ -89,7 +89,11 @@ export function toSalesforceEvent(unified: UnifiedEvent): any { export function toZohoEvent(unified: UnifiedEvent): any { const zoho: any = { - data: [{}], + data: [ + { + ...(unified.associations?.dealId && { What_Id: unified.associations.dealId, $se_module: 'Deals' }), + }, + ], apply_feature_execution: [ { name: 'layout_rules', From 4e1e4b8e300a6ad2435173d2a719fc6c957425cd Mon Sep 17 00:00:00 2001 From: hvinder Date: Fri, 11 Aug 2023 11:51:55 +0530 Subject: [PATCH 16/27] zoho task -> deal association --- packages/backend/models/unified/task.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/backend/models/unified/task.ts b/packages/backend/models/unified/task.ts index 83c782d94..e18b54520 100644 --- a/packages/backend/models/unified/task.ts +++ b/packages/backend/models/unified/task.ts @@ -80,7 +80,11 @@ export function toSalesforceTask(unified: UnifiedTask): any { export function toZohoTask(unified: UnifiedTask): any { const zoho: any = { - data: [{}], + data: [ + { + ...(unified.associations?.dealId && { What_Id: unified.associations.dealId, $se_module: 'Deals' }), + }, + ], apply_feature_execution: [ { name: 'layout_rules', From 0132bdea65f5f8bc3716f4cd79bda8a7be652edf Mon Sep 17 00:00:00 2001 From: hvinder Date: Sun, 13 Aug 2023 16:33:45 +0530 Subject: [PATCH 17/27] zoho contact -> deal association --- packages/backend/services/crm/contact.ts | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/backend/services/crm/contact.ts b/packages/backend/services/crm/contact.ts index 370576476..2df14e6b2 100644 --- a/packages/backend/services/crm/contact.ts +++ b/packages/backend/services/crm/contact.ts @@ -47,7 +47,7 @@ const contactService = new ContactService( case TP_ID.zohocrm: { let contact: any = await axios({ method: 'get', - url: `https://www.zohoapis.com/crm/v3/Contacts/${contactId}?fields=${fields}`, + url: `https://www.zohoapis.com/crm/v3/Contacts/${contactId}${fields ? `?fields=${fields}` : ''}`, headers: { authorization: `Zoho-oauthtoken ${thirdPartyToken}`, }, @@ -244,7 +244,7 @@ const contactService = new ContactService( break; } case TP_ID.zohocrm: { - await axios({ + const result = await axios({ method: 'post', url: `https://www.zohoapis.com/crm/v3/Contacts`, headers: { @@ -252,6 +252,23 @@ const contactService = new ContactService( }, data: JSON.stringify(contact), }); + if (contactData.associations?.dealId) { + await axios.put( + `https://www.zohoapis.com/crm/v3/Contacts/${result.data?.data?.[0]?.details?.id}/Deals/${contactData.associations.dealId}`, + { + data: [ + { + Contact_Role: 'Developer/Evaluator', + }, + ], + }, + { + headers: { + authorization: `Zoho-oauthtoken ${thirdPartyToken}`, + }, + } + ); + } res.send({ status: 'ok', message: 'Zoho contact created', result: contact }); break; } @@ -300,7 +317,7 @@ const contactService = new ContactService( } } catch (error: any) { logError(error); - console.error('Could not create lead', error.response); + console.error('Could not create contact', error.response); throw new InternalServerError({ error: 'Internal server error' }); } }, From 1ef0ecc0bb17803d99c6141e613ac80490a5218e Mon Sep 17 00:00:00 2001 From: hvinder Date: Sun, 13 Aug 2023 16:49:04 +0530 Subject: [PATCH 18/27] zoho company -> deal association --- packages/backend/services/crm/company.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/backend/services/crm/company.ts b/packages/backend/services/crm/company.ts index 06369ec53..20a133d06 100644 --- a/packages/backend/services/crm/company.ts +++ b/packages/backend/services/crm/company.ts @@ -253,7 +253,7 @@ const companyService = new CompanyService( break; } case TP_ID.zohocrm: { - await axios({ + const result = await axios({ method: 'post', url: `https://www.zohoapis.com/crm/v3/Accounts`, headers: { @@ -261,6 +261,19 @@ const companyService = new CompanyService( }, data: JSON.stringify(company), }); + if (companyData.associations?.dealId) { + await axios.put( + `https://www.zohoapis.com/crm/v3/Deals/${companyData.associations.dealId}`, + { + data: [{ Account_Name: { id: result.data?.data?.[0]?.details?.id } }], + }, + { + headers: { + authorization: `Zoho-oauthtoken ${thirdPartyToken}`, + }, + } + ); + } res.send({ status: 'ok', message: 'Zoho company created', result: company }); break; } @@ -309,7 +322,7 @@ const companyService = new CompanyService( } } catch (error: any) { logError(error); - console.error('Could not create lead', error.response); + console.error('Could not create company', error.response); throw new InternalServerError({ error: 'Internal server error' }); } }, From d975db7776c16cfb627910b82c0552399c21d5d6 Mon Sep 17 00:00:00 2001 From: hvinder Date: Mon, 14 Aug 2023 11:06:07 +0530 Subject: [PATCH 19/27] sfdc company -> deal association --- packages/backend/services/crm/company.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/backend/services/crm/company.ts b/packages/backend/services/crm/company.ts index 20a133d06..78b2bfed7 100644 --- a/packages/backend/services/crm/company.ts +++ b/packages/backend/services/crm/company.ts @@ -288,6 +288,17 @@ const companyService = new CompanyService( }, data: JSON.stringify(company), }); + if (companyData.associations?.dealId) { + await axios({ + method: 'patch', + url: `${instanceUrl}/services/data/v56.0/sobjects/Opportunity/${companyData.associations.dealId}`, + headers: { + 'content-type': 'application/json', + authorization: `Bearer ${thirdPartyToken}`, + }, + data: JSON.stringify({ AccountId: companyCreated.data?.id }), + }); + } res.send({ status: 'ok', message: 'SFDC company created', From 9a66afba67f1728d02e64fa3750a0f2d5206bb6e Mon Sep 17 00:00:00 2001 From: hvinder Date: Mon, 14 Aug 2023 11:13:22 +0530 Subject: [PATCH 20/27] enable sdk deploy to s3 --- .github/workflows/deploy-js-sdk.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-js-sdk.yaml b/.github/workflows/deploy-js-sdk.yaml index 26d3d5c51..2be190c22 100644 --- a/.github/workflows/deploy-js-sdk.yaml +++ b/.github/workflows/deploy-js-sdk.yaml @@ -4,8 +4,8 @@ on: push: branches: - main - # paths: - # - packages/js/** + paths: + - packages/js/** jobs: build-deploy-js-sdk: From a6f6ddc91f87f9cb1da0690ad3ffe100cc32c9c7 Mon Sep 17 00:00:00 2001 From: hvinder Date: Mon, 14 Aug 2023 12:46:16 +0530 Subject: [PATCH 21/27] sfdc contact -> deal association --- fern/api/definition/common/errors.yml | 3 ++ fern/api/definition/crm/contact.yml | 2 ++ packages/backend/models/unified/contact.ts | 8 ++++-- packages/backend/services/crm/contact.ts | 33 ++++++++++++++++++++-- 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/fern/api/definition/common/errors.yml b/fern/api/definition/common/errors.yml index 33e479032..746a22408 100644 --- a/fern/api/definition/common/errors.yml +++ b/fern/api/definition/common/errors.yml @@ -11,5 +11,8 @@ errors: status-code: 500 type: BaseError NotFoundError: + status-code: 404 + type: BaseError + BadRequestError: status-code: 400 type: BaseError diff --git a/fern/api/definition/crm/contact.yml b/fern/api/definition/crm/contact.yml index 09a7433b6..c321c0587 100644 --- a/fern/api/definition/crm/contact.yml +++ b/fern/api/definition/crm/contact.yml @@ -84,6 +84,7 @@ service: - errors.UnAuthorizedError - errors.InternalServerError - errors.NotFoundError + - errors.BadRequestError updateContact: docs: Update a contact method: PATCH @@ -98,6 +99,7 @@ service: - errors.UnAuthorizedError - errors.InternalServerError - errors.NotFoundError + - errors.BadRequestError searchContacts: docs: Search for contacts method: POST diff --git a/packages/backend/models/unified/contact.ts b/packages/backend/models/unified/contact.ts index 065ff2e33..14aa96034 100644 --- a/packages/backend/models/unified/contact.ts +++ b/packages/backend/models/unified/contact.ts @@ -94,7 +94,9 @@ export function toSalesforceContact(unifiedContact: UnifiedContact): Partial { - salesforceContact[key] = unifiedContact.additional?.[key]; + if (key !== 'associations') { + salesforceContact[key] = unifiedContact.additional?.[key]; + } }); } @@ -120,7 +122,9 @@ export function toZohoContact(unifiedContact: UnifiedContact): ZohoContact { // Map custom fields if (unifiedContact.additional) { Object.keys(unifiedContact.additional).forEach((key) => { - zohoContact.data[0][key] = unifiedContact.additional?.[key]; + if (key !== 'associations') { + zohoContact.data[0][key] = unifiedContact.additional?.[key]; + } }); } diff --git a/packages/backend/services/crm/contact.ts b/packages/backend/services/crm/contact.ts index 2df14e6b2..64cb7f362 100644 --- a/packages/backend/services/crm/contact.ts +++ b/packages/backend/services/crm/contact.ts @@ -2,7 +2,7 @@ import axios from 'axios'; import { TP_ID } from '@prisma/client'; import { ContactService } from '../../generated/typescript/api/resources/crm/resources/contact/service/ContactService'; -import { InternalServerError } from '../../generated/typescript/api/resources/common'; +import { BadRequestError, InternalServerError } from '../../generated/typescript/api/resources/common'; import { PipedriveContact, PipedrivePagination } from '../../constants/pipedrive'; import revertTenantMiddleware from '../../helpers/tenantIdMiddleware'; import logError from '../../helpers/logError'; @@ -47,7 +47,9 @@ const contactService = new ContactService( case TP_ID.zohocrm: { let contact: any = await axios({ method: 'get', - url: `https://www.zohoapis.com/crm/v3/Contacts/${contactId}${fields ? `?fields=${fields}` : ''}`, + url: `https://www.zohoapis.com/crm/v3/Contacts/${contactId}${ + fields ? `?fields=${fields}` : '' + }`, headers: { authorization: `Zoho-oauthtoken ${thirdPartyToken}`, }, @@ -225,6 +227,16 @@ const contactService = new ContactService( const contact = disunifyContact(contactData, thirdPartyId); console.log('Revert::CREATE CONTACT', tenantId, contact, thirdPartyId); + if ( + thirdPartyId === TP_ID.zohocrm && + contactData.associations?.dealId && + !contactData.additional?.associations?.contactRole + ) { + throw new BadRequestError({ + error: 'Required field for association is missing: (additional.associations.contactRole)', + }); + } + switch (thirdPartyId) { case TP_ID.hubspot: { await axios({ @@ -258,7 +270,7 @@ const contactService = new ContactService( { data: [ { - Contact_Role: 'Developer/Evaluator', + Contact_Role: contactData.additional.associations.contactRole, }, ], }, @@ -283,6 +295,21 @@ const contactService = new ContactService( }, data: JSON.stringify(contact), }); + if (contactData.associations?.dealId) { + await axios.post( + `${instanceUrl}/services/data/v56.0/sobjects/OpportunityContactRole/`, + { + ContactId: contactCreated.data?.id, + OpportunityId: contactData.associations.dealId, + }, + { + headers: { + 'content-type': 'application/json', + authorization: `Bearer ${thirdPartyToken}`, + }, + } + ); + } res.send({ status: 'ok', message: 'SFDC contact created', From f356e0001f9b3a2d3ad81b1515933b1b3e4b5e40 Mon Sep 17 00:00:00 2001 From: hvinder Date: Mon, 14 Aug 2023 13:13:50 +0530 Subject: [PATCH 22/27] zoho contact -> deal association payload fixed --- packages/backend/models/unified/contact.ts | 6 ++---- packages/backend/services/crm/contact.ts | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/backend/models/unified/contact.ts b/packages/backend/models/unified/contact.ts index 14aa96034..0a89898a4 100644 --- a/packages/backend/models/unified/contact.ts +++ b/packages/backend/models/unified/contact.ts @@ -94,9 +94,7 @@ export function toSalesforceContact(unifiedContact: UnifiedContact): Partial { - if (key !== 'associations') { - salesforceContact[key] = unifiedContact.additional?.[key]; - } + salesforceContact[key] = unifiedContact.additional?.[key]; }); } @@ -122,7 +120,7 @@ export function toZohoContact(unifiedContact: UnifiedContact): ZohoContact { // Map custom fields if (unifiedContact.additional) { Object.keys(unifiedContact.additional).forEach((key) => { - if (key !== 'associations') { + if (key !== 'Contact_Role') { zohoContact.data[0][key] = unifiedContact.additional?.[key]; } }); diff --git a/packages/backend/services/crm/contact.ts b/packages/backend/services/crm/contact.ts index 64cb7f362..e55fe6e55 100644 --- a/packages/backend/services/crm/contact.ts +++ b/packages/backend/services/crm/contact.ts @@ -230,10 +230,10 @@ const contactService = new ContactService( if ( thirdPartyId === TP_ID.zohocrm && contactData.associations?.dealId && - !contactData.additional?.associations?.contactRole + !contactData.additional?.Contact_Role ) { throw new BadRequestError({ - error: 'Required field for association is missing: (additional.associations.contactRole)', + error: 'Required field for association is missing: (additional.Contact_Role)', }); } @@ -270,7 +270,7 @@ const contactService = new ContactService( { data: [ { - Contact_Role: contactData.additional.associations.contactRole, + Contact_Role: contactData.additional.Contact_Role, }, ], }, From 3345d096478ede5eca32bd0bc7ca8841f20d45eb Mon Sep 17 00:00:00 2001 From: hvinder Date: Mon, 14 Aug 2023 13:15:48 +0530 Subject: [PATCH 23/27] minor changes --- packages/backend/services/crm/deal.ts | 2 +- packages/backend/services/crm/task.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/services/crm/deal.ts b/packages/backend/services/crm/deal.ts index 92d4d9e2a..758a0e5b9 100644 --- a/packages/backend/services/crm/deal.ts +++ b/packages/backend/services/crm/deal.ts @@ -49,7 +49,7 @@ const dealService = new DealService( case TP_ID.zohocrm: { const deals = await axios({ method: 'get', - url: `https://www.zohoapis.com/crm/v3/Deals/${dealId}?fields=${fields}`, + url: `https://www.zohoapis.com/crm/v3/Deals/${dealId}${ fields ? `?fields=${fields}` : ''}`, headers: { authorization: `Zoho-oauthtoken ${thirdPartyToken}`, }, diff --git a/packages/backend/services/crm/task.ts b/packages/backend/services/crm/task.ts index 7e8c84f3a..3231596c3 100644 --- a/packages/backend/services/crm/task.ts +++ b/packages/backend/services/crm/task.ts @@ -298,7 +298,7 @@ const taskService = new TaskService( } } catch (error: any) { logError(error); - console.error('Could not create lead', error.response); + console.error('Could not create task', error.response); throw new InternalServerError({ error: 'Internal server error' }); } }, From 2961daaf3dc51059c6535cf3f6fa5caf0ddb177e Mon Sep 17 00:00:00 2001 From: hvinder Date: Mon, 14 Aug 2023 20:42:15 +0530 Subject: [PATCH 24/27] Address comments --- packages/backend/models/unified/note.ts | 3 --- packages/backend/services/crm/contact.ts | 15 +++++---------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/packages/backend/models/unified/note.ts b/packages/backend/models/unified/note.ts index 45e2ffafb..e7ab89b8d 100644 --- a/packages/backend/models/unified/note.ts +++ b/packages/backend/models/unified/note.ts @@ -43,9 +43,6 @@ export function unifyNote(note: any, tpId: TP_ID): UnifiedNote { leadId: note.lead_id, dealId: note.deal_id, }), - // ...(tpId === TP_ID.hubspot && { - // deal_id: '', - // }), }, }; diff --git a/packages/backend/services/crm/contact.ts b/packages/backend/services/crm/contact.ts index e55fe6e55..25bad7c55 100644 --- a/packages/backend/services/crm/contact.ts +++ b/packages/backend/services/crm/contact.ts @@ -227,16 +227,6 @@ const contactService = new ContactService( const contact = disunifyContact(contactData, thirdPartyId); console.log('Revert::CREATE CONTACT', tenantId, contact, thirdPartyId); - if ( - thirdPartyId === TP_ID.zohocrm && - contactData.associations?.dealId && - !contactData.additional?.Contact_Role - ) { - throw new BadRequestError({ - error: 'Required field for association is missing: (additional.Contact_Role)', - }); - } - switch (thirdPartyId) { case TP_ID.hubspot: { await axios({ @@ -256,6 +246,11 @@ const contactService = new ContactService( break; } case TP_ID.zohocrm: { + if (contactData.associations?.dealId && !contactData.additional?.Contact_Role) { + throw new BadRequestError({ + error: 'Required field for association is missing: (additional.Contact_Role)', + }); + } const result = await axios({ method: 'post', url: `https://www.zohoapis.com/crm/v3/Contacts`, From 0fefff4496ea269f252ac3ae59056e5e6074d814 Mon Sep 17 00:00:00 2001 From: hvinder Date: Tue, 15 Aug 2023 12:14:57 +0530 Subject: [PATCH 25/27] Handle errors better --- packages/backend/helpers/error.ts | 15 +++++++++++++++ packages/backend/services/crm/contact.ts | 6 +++++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 packages/backend/helpers/error.ts diff --git a/packages/backend/helpers/error.ts b/packages/backend/helpers/error.ts new file mode 100644 index 000000000..d7aac8b5e --- /dev/null +++ b/packages/backend/helpers/error.ts @@ -0,0 +1,15 @@ +import { + BadRequestError, + InternalServerError, + NotFoundError, + UnAuthorizedError, +} from '../generated/typescript/api/resources/common'; + +export const isStandardError = (error: any) => { + return ( + error instanceof NotFoundError || + error instanceof BadRequestError || + error instanceof UnAuthorizedError || + error instanceof InternalServerError + ); +}; diff --git a/packages/backend/services/crm/contact.ts b/packages/backend/services/crm/contact.ts index 25bad7c55..304922277 100644 --- a/packages/backend/services/crm/contact.ts +++ b/packages/backend/services/crm/contact.ts @@ -3,12 +3,13 @@ import { TP_ID } from '@prisma/client'; import { ContactService } from '../../generated/typescript/api/resources/crm/resources/contact/service/ContactService'; import { BadRequestError, InternalServerError } from '../../generated/typescript/api/resources/common'; +import { NotFoundError } from '../../generated/typescript/api/resources/common'; import { PipedriveContact, PipedrivePagination } from '../../constants/pipedrive'; import revertTenantMiddleware from '../../helpers/tenantIdMiddleware'; import logError from '../../helpers/logError'; import revertAuthMiddleware from '../../helpers/authMiddleware'; +import { isStandardError } from '../../helpers/error'; import { UnifiedContact, disunifyContact, unifyContact } from '../../models/unified/contact'; -import { NotFoundError } from '../../generated/typescript/api/resources/common'; const contactService = new ContactService( { @@ -340,6 +341,9 @@ const contactService = new ContactService( } catch (error: any) { logError(error); console.error('Could not create contact', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, From 59f6d07b1a27892bee6572d9364a2cd88ccd500b Mon Sep 17 00:00:00 2001 From: hvinder Date: Wed, 16 Aug 2023 12:41:59 +0530 Subject: [PATCH 26/27] Handle standard errors --- packages/backend/services/crm/company.ts | 16 ++++++++++++++++ packages/backend/services/crm/contact.ts | 12 ++++++++++++ packages/backend/services/crm/deal.ts | 16 ++++++++++++++++ packages/backend/services/crm/event.ts | 16 ++++++++++++++++ packages/backend/services/crm/lead.ts | 16 ++++++++++++++++ packages/backend/services/crm/note.ts | 16 ++++++++++++++++ packages/backend/services/crm/task.ts | 16 ++++++++++++++++ packages/backend/services/crm/user.ts | 10 ++++++++++ 8 files changed, 118 insertions(+) diff --git a/packages/backend/services/crm/company.ts b/packages/backend/services/crm/company.ts index 78b2bfed7..061423eaa 100644 --- a/packages/backend/services/crm/company.ts +++ b/packages/backend/services/crm/company.ts @@ -7,6 +7,7 @@ import { InternalServerError } from '../../generated/typescript/api/resources/co import logError from '../../helpers/logError'; import revertTenantMiddleware from '../../helpers/tenantIdMiddleware'; import revertAuthMiddleware from '../../helpers/authMiddleware'; +import { isStandardError } from '../../helpers/error'; import { unifyCompany, disunifyCompany, UnifiedCompany } from '../../models/unified/company'; import { PipedriveCompany, PipedrivePagination } from '../../constants/pipedrive'; @@ -95,6 +96,9 @@ const companyService = new CompanyService( } catch (error: any) { logError(error); console.error('Could not fetch lead', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -221,6 +225,9 @@ const companyService = new CompanyService( } catch (error: any) { logError(error); console.error('Could not fetch leads', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -334,6 +341,9 @@ const companyService = new CompanyService( } catch (error: any) { logError(error); console.error('Could not create company', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -418,6 +428,9 @@ const companyService = new CompanyService( } catch (error: any) { logError(error); console.error('Could not update lead', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -519,6 +532,9 @@ const companyService = new CompanyService( } catch (error: any) { logError(error); console.error('Could not search CRM', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, diff --git a/packages/backend/services/crm/contact.ts b/packages/backend/services/crm/contact.ts index 304922277..9d0f7abae 100644 --- a/packages/backend/services/crm/contact.ts +++ b/packages/backend/services/crm/contact.ts @@ -93,6 +93,9 @@ const contactService = new ContactService( } catch (error: any) { logError(error); console.error('Could not fetch lead', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -215,6 +218,9 @@ const contactService = new ContactService( } catch (error: any) { logError(error); console.error('Could not fetch leads', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -428,6 +434,9 @@ const contactService = new ContactService( } catch (error: any) { logError(error); console.error('Could not update lead', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -527,6 +536,9 @@ const contactService = new ContactService( } catch (error: any) { logError(error); console.error('Could not search CRM', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, diff --git a/packages/backend/services/crm/deal.ts b/packages/backend/services/crm/deal.ts index 758a0e5b9..d9b0ae84c 100644 --- a/packages/backend/services/crm/deal.ts +++ b/packages/backend/services/crm/deal.ts @@ -7,6 +7,7 @@ import { NotFoundError } from '../../generated/typescript/api/resources/common'; import logError from '../../helpers/logError'; import revertTenantMiddleware from '../../helpers/tenantIdMiddleware'; import revertAuthMiddleware from '../../helpers/authMiddleware'; +import { isStandardError } from '../../helpers/error'; import { UnifiedDeal, disunifyDeal, unifyDeal } from '../../models/unified'; import { PipedriveDeal, PipedrivePagination } from '../../constants/pipedrive'; @@ -91,6 +92,9 @@ const dealService = new DealService( } catch (error: any) { logError(error); console.error('Could not fetch deal', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -216,6 +220,9 @@ const dealService = new DealService( } catch (error: any) { logError(error); console.error('Could not fetch deals', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -305,6 +312,9 @@ const dealService = new DealService( } catch (error: any) { logError(error); console.error('Could not create deal', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -389,6 +399,9 @@ const dealService = new DealService( } catch (error: any) { logError(error); console.error('Could not update deal', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -489,6 +502,9 @@ const dealService = new DealService( } catch (error: any) { logError(error); console.error('Could not search CRM', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, diff --git a/packages/backend/services/crm/event.ts b/packages/backend/services/crm/event.ts index 974b4e94d..f810ac5bd 100644 --- a/packages/backend/services/crm/event.ts +++ b/packages/backend/services/crm/event.ts @@ -7,6 +7,7 @@ import { NotFoundError } from '../../generated/typescript/api/resources/common'; import revertTenantMiddleware from '../../helpers/tenantIdMiddleware'; import logError from '../../helpers/logError'; import revertAuthMiddleware from '../../helpers/authMiddleware'; +import { isStandardError } from '../../helpers/error'; import { UnifiedEvent, disunifyEvent, unifyEvent } from '../../models/unified'; import { PipedriveEvent, PipedrivePagination } from '../../constants/pipedrive'; @@ -91,6 +92,9 @@ const eventService = new EventService( } catch (error: any) { logError(error); console.error('Could not fetch lead', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -214,6 +218,9 @@ const eventService = new EventService( } catch (error: any) { logError(error); console.error('Could not fetch leads', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -295,6 +302,9 @@ const eventService = new EventService( } catch (error: any) { logError(error); console.error('Could not create lead', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -374,6 +384,9 @@ const eventService = new EventService( } catch (error: any) { logError(error); console.error('Could not update lead', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -453,6 +466,9 @@ const eventService = new EventService( } catch (error: any) { logError(error); console.error('Could not search CRM', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, diff --git a/packages/backend/services/crm/lead.ts b/packages/backend/services/crm/lead.ts index ab7393805..2a5dfc0a8 100644 --- a/packages/backend/services/crm/lead.ts +++ b/packages/backend/services/crm/lead.ts @@ -8,6 +8,7 @@ import logError from '../../helpers/logError'; import revertTenantMiddleware from '../../helpers/tenantIdMiddleware'; import revertAuthMiddleware from '../../helpers/authMiddleware'; import { filterLeadsFromContactsForHubspot } from '../../helpers/filterLeadsFromContacts'; +import { isStandardError } from '../../helpers/error'; import { UnifiedLead, disunifyLead, unifyLead } from '../../models/unified/lead'; import { PipedrivePagination, PipedriveLead, PipedriveContact, PipedriveCompany } from '../../constants/pipedrive'; @@ -95,6 +96,9 @@ const leadService = new LeadService( } catch (error: any) { logError(error); console.error('Could not fetch lead', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -226,6 +230,9 @@ const leadService = new LeadService( } catch (error: any) { logError(error); console.error('Could not fetch leads', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -315,6 +322,9 @@ const leadService = new LeadService( } catch (error: any) { logError(error); console.error('Could not create lead', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -399,6 +409,9 @@ const leadService = new LeadService( } catch (error: any) { logError(error); console.error('Could not update lead', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -499,6 +512,9 @@ const leadService = new LeadService( } catch (error: any) { logError(error); console.error('Could not search CRM', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, diff --git a/packages/backend/services/crm/note.ts b/packages/backend/services/crm/note.ts index fd2b30713..b348fcf25 100644 --- a/packages/backend/services/crm/note.ts +++ b/packages/backend/services/crm/note.ts @@ -7,6 +7,7 @@ import { NotFoundError } from '../../generated/typescript/api/resources/common'; import logError from '../../helpers/logError'; import revertAuthMiddleware from '../../helpers/authMiddleware'; import revertTenantMiddleware from '../../helpers/tenantIdMiddleware'; +import { isStandardError } from '../../helpers/error'; import { UnifiedNote, disunifyNote, unifyNote } from '../../models/unified'; import { PipedriveNote, PipedrivePagination } from '../../constants/pipedrive'; @@ -82,6 +83,9 @@ const noteService = new NoteService( } catch (error: any) { logError(error); console.error('Could not fetch lead', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -196,6 +200,9 @@ const noteService = new NoteService( } catch (error: any) { logError(error); console.error('Could not fetch leads', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -276,6 +283,9 @@ const noteService = new NoteService( } catch (error: any) { logError(error); console.error('Could not create lead', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -356,6 +366,9 @@ const noteService = new NoteService( } catch (error: any) { logError(error); console.error('Could not update lead', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -426,6 +439,9 @@ const noteService = new NoteService( } catch (error: any) { logError(error); console.error('Could not search CRM', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, diff --git a/packages/backend/services/crm/task.ts b/packages/backend/services/crm/task.ts index 3231596c3..238de921f 100644 --- a/packages/backend/services/crm/task.ts +++ b/packages/backend/services/crm/task.ts @@ -7,6 +7,7 @@ import { NotFoundError } from '../../generated/typescript/api/resources/common'; import revertTenantMiddleware from '../../helpers/tenantIdMiddleware'; import revertAuthMiddleware from '../../helpers/authMiddleware'; import logError from '../../helpers/logError'; +import { isStandardError } from '../../helpers/error'; import { UnifiedTask, disunifyTask, unifyTask } from '../../models/unified'; import { PipedrivePagination, PipedriveTask } from '../../constants/pipedrive'; @@ -89,6 +90,9 @@ const taskService = new TaskService( } catch (error: any) { logError(error); console.error('Could not fetch lead', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -210,6 +214,9 @@ const taskService = new TaskService( } catch (error: any) { logError(error); console.error('Could not fetch leads', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -299,6 +306,9 @@ const taskService = new TaskService( } catch (error: any) { logError(error); console.error('Could not create task', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -383,6 +393,9 @@ const taskService = new TaskService( } catch (error: any) { logError(error); console.error('Could not update lead', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -463,6 +476,9 @@ const taskService = new TaskService( } catch (error: any) { logError(error); console.error('Could not search CRM', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, diff --git a/packages/backend/services/crm/user.ts b/packages/backend/services/crm/user.ts index 63b3a1fef..2442852ba 100644 --- a/packages/backend/services/crm/user.ts +++ b/packages/backend/services/crm/user.ts @@ -7,6 +7,7 @@ import { NotFoundError } from '../../generated/typescript/api/resources/common'; import revertTenantMiddleware from '../../helpers/tenantIdMiddleware'; import revertAuthMiddleware from '../../helpers/authMiddleware'; import logError from '../../helpers/logError'; +import { isStandardError } from '../../helpers/error'; import { UnifiedUser, disunifyUser, unifyUser } from '../../models/unified/user'; import { PipedriveUser } from '../../constants/pipedrive'; @@ -89,6 +90,9 @@ const userService = new UserService( } catch (error: any) { logError(error); console.error('Could not fetch user', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -210,6 +214,9 @@ const userService = new UserService( } catch (error: any) { logError(error); console.error('Could not fetch users', error); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, @@ -299,6 +306,9 @@ const userService = new UserService( } catch (error: any) { logError(error); console.error('Could not create user', error.response); + if (isStandardError(error)) { + throw error; + } throw new InternalServerError({ error: 'Internal server error' }); } }, From a66d6bb56028f16de20da6bce54cda2437980153 Mon Sep 17 00:00:00 2001 From: hvinder Date: Wed, 16 Aug 2023 13:04:16 +0530 Subject: [PATCH 27/27] fern types for association --- fern/api/definition/common/associations.yml | 62 +++++++++++++++++++++ fern/api/definition/common/unified.yml | 12 +++- 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 fern/api/definition/common/associations.yml diff --git a/fern/api/definition/common/associations.yml b/fern/api/definition/common/associations.yml new file mode 100644 index 000000000..c7175cdd4 --- /dev/null +++ b/fern/api/definition/common/associations.yml @@ -0,0 +1,62 @@ +types: + CompanyAssociation: + properties: + dealId: + type: optional + docs: The id of the deal to associate with company + ContactAssociation: + properties: + dealId: + type: optional + docs: The id of the deal to associate with contact + DealAssociation: + properties: + contactId: + type: optional + docs: The id of the contact to associate with deal + companyId: + type: optional + docs: The id of the company to associate with deal + EventAssociation: + properties: + dealId: + type: optional + docs: The id of the deal to associate with event + contactId: + type: optional + docs: The id of the contact to associate with event + LeadAssociation: + properties: + contactId: + type: optional + docs: The id of the contact to associate with lead + companyId: + type: optional + docs: The id of the company to associate with lead + dealId: + type: optional + docs: The id of the deal to associate with lead + NoteAssociation: + properties: + contactId: + type: optional + docs: The id of the contact to associate with note + companyId: + type: optional + docs: The id of the company to associate with note + leadId: + type: optional + docs: The id of the lead to associate with note + dealId: + type: optional + docs: The id of the deal to associate with note + TaskAssociation: + properties: + dealId: + type: optional + docs: The id of the deal to associate with task + UserAssociation: + properties: + dealId: + type: optional + docs: The id of the deal to associate with user diff --git a/fern/api/definition/common/unified.yml b/fern/api/definition/common/unified.yml index f08655046..c9196860b 100644 --- a/fern/api/definition/common/unified.yml +++ b/fern/api/definition/common/unified.yml @@ -1,3 +1,6 @@ +imports: + associations: ./associations.yml + types: CommonUnifiedFields: properties: @@ -13,7 +16,6 @@ types: updatedTimestamp: type: unknown docs: The last updated timestamp of the object. - associations: unknown additional: type: unknown docs: Any fields that are not unified yet/non-unifiable come inside this `json` object. @@ -32,6 +34,7 @@ types: email: type: string docs: The email of the lead in a CRM. + associations: optional Deal: extends: CommonUnifiedFields properties: @@ -56,12 +59,14 @@ types: probability: type: integer docs: Probability of the deal getting closed, a decimal number between 0 to 1 (inclusive). + associations: optional Note: extends: CommonUnifiedFields properties: content: type: string docs: The contents of the note in plain text or HTML. + associations: optional Company: extends: CommonUnifiedFields properties: @@ -86,6 +91,7 @@ types: address: type: CompanyAddress docs: Company address. + associations: optional CompanyAddress: properties: street: optional @@ -109,6 +115,7 @@ types: email: type: string docs: The email of the contact in a CRM. + associations: optional Event: extends: CommonUnifiedFields properties: @@ -133,6 +140,7 @@ types: location: type: string docs: The location of the event/meeting. + associations: optional Task: extends: CommonUnifiedFields properties: @@ -151,6 +159,7 @@ types: dueDate: type: unknown docs: The date when this task is due. + associations: optional User: extends: CommonUnifiedFields properties: @@ -166,3 +175,4 @@ types: email: type: string docs: The email of a user in a CRM. + associations: optional