@memberjunction/integration-connectors 5.8.0 → 5.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,41 +1,96 @@
1
- import { type FetchContext, type FetchBatchResult, type DefaultFieldMapping } from '@memberjunction/integration-engine';
2
- import { RelationalDBConnector } from './RelationalDBConnector.js';
1
+ import { type UserInfo } from '@memberjunction/core';
2
+ import type { MJCompanyIntegrationEntity, MJIntegrationObjectEntity } from '@memberjunction/core-entities';
3
+ import { BaseRESTIntegrationConnector, type RESTAuthContext, type RESTResponse, type PaginationState, type PaginationType, type ConnectionTestResult, type DefaultFieldMapping, type DefaultIntegrationConfig } from '@memberjunction/integration-engine';
4
+ /** HubSpot property definition (from /crm/v3/properties/{objectType}) */
5
+ interface HubSpotPropertyDef {
6
+ name: string;
7
+ label: string;
8
+ type: string;
9
+ fieldType: string;
10
+ groupName: string;
11
+ description: string;
12
+ hasUniqueValue: boolean;
13
+ calculated: boolean;
14
+ externalOptions: boolean;
15
+ modificationMetadata?: {
16
+ readOnlyValue: boolean;
17
+ };
18
+ }
3
19
  /**
4
- * Connector for HubSpot CRM data, backed by the mock_data database (hs schema).
5
- * Reads from hs.contacts, hs.companies, and hs.deals tables.
6
- * Provides default field mappings for contacts and companies to MJ entities.
20
+ * Connector for HubSpot CRM via the HubSpot REST API v3.
21
+ *
22
+ * Extends BaseRESTIntegrationConnector to leverage metadata-driven object/field
23
+ * discovery from IntegrationEngineBase cache and generic pagination handling.
24
+ *
25
+ * Uses Bearer token authentication (private app key or OAuth access token).
26
+ * Supports cursor-based pagination and automatic response flattening.
27
+ *
28
+ * DATA SAFETY: This connector is READ-ONLY. It never writes data back to HubSpot.
7
29
  */
8
- export declare class HubSpotConnector extends RelationalDBConnector {
30
+ export declare class HubSpotConnector extends BaseRESTIntegrationConnector {
31
+ /** Timestamp of the last API request, used for throttling */
32
+ private lastRequestTime;
33
+ protected Authenticate(companyIntegration: MJCompanyIntegrationEntity): Promise<RESTAuthContext>;
34
+ protected BuildHeaders(auth: RESTAuthContext): Record<string, string>;
35
+ protected MakeHTTPRequest(_auth: RESTAuthContext, url: string, method: string, headers: Record<string, string>, _body?: unknown): Promise<RESTResponse>;
36
+ protected NormalizeResponse(rawBody: unknown, responseDataKey: string | null): Record<string, unknown>[];
37
+ protected ExtractPaginationInfo(rawBody: unknown, _paginationType: PaginationType, _currentPage: number, _currentOffset: number, _pageSize: number): PaginationState;
38
+ protected GetBaseURL(_companyIntegration: MJCompanyIntegrationEntity): string;
9
39
  /**
10
- * Fetches a batch of changed records from the specified HubSpot object table.
11
- * Uses lastmodifieddate for watermark-based incremental sync.
12
- * @param ctx - Fetch context with integration, object, watermark, and batch details
13
- * @returns Batch of HubSpot records with pagination info
40
+ * Overrides base pagination URL building to use HubSpot's parameter names.
41
+ * HubSpot uses `after` for cursor pagination (not `cursor`), and needs
42
+ * `limit` instead of `pageSize`. Also appends `properties` query param.
14
43
  */
15
- FetchChanges(ctx: FetchContext): Promise<FetchBatchResult>;
44
+ protected BuildPaginatedURL(basePath: string, obj: MJIntegrationObjectEntity, _page: number, _offset: number, cursor?: string): string;
45
+ /** Tests connectivity by authenticating and fetching 1 contact. */
46
+ TestConnection(companyIntegration: MJCompanyIntegrationEntity, _contextUser: UserInfo): Promise<ConnectionTestResult>;
47
+ GetDefaultFieldMappings(objectName: string, _entityName: string): DefaultFieldMapping[];
48
+ GetDefaultConfiguration(): DefaultIntegrationConfig;
49
+ /** Converts a HubSpot property definition to ExternalFieldSchema format */
50
+ MapPropertyToField(prop: HubSpotPropertyDef): {
51
+ Name: string;
52
+ Label: string;
53
+ DataType: string;
54
+ IsRequired: boolean;
55
+ IsUniqueKey: boolean;
56
+ IsReadOnly: boolean;
57
+ };
58
+ /** Maps HubSpot type + fieldType to a simplified data type string */
59
+ MapHubSpotType(type: string, fieldType: string): string;
16
60
  /**
17
- * Returns suggested default field mappings for known HubSpot objects to MJ entities.
18
- * @param objectName - HubSpot object name (e.g., "contacts")
19
- * @param entityName - Target MJ entity name (e.g., "Contacts")
20
- * @returns Array of default field mappings
61
+ * Reads credentials from CompanyIntegration.CredentialID -> Credential.Values JSON,
62
+ * or falls back to CompanyIntegration Configuration JSON for backwards compat.
21
63
  */
22
- GetDefaultFieldMappings(objectName: string, _entityName: string): DefaultFieldMapping[];
64
+ private LoadCredentials;
65
+ /** Loads credentials from a Credential entity by ID. */
66
+ private LoadFromCredentialEntity;
67
+ /** Parses a JSON string to extract HubSpot credentials. Returns null if no token found. */
68
+ private ParseCredentialJson;
69
+ /**
70
+ * Flattens a HubSpot CRM record from the nested format:
71
+ * { id, properties: { field1, field2 }, createdAt, updatedAt, archived }
72
+ * into a flat record with all properties at the top level,
73
+ * plus system fields (hs_object_id, createdAt, updatedAt, archived).
74
+ */
75
+ private FlattenHubSpotRecord;
23
76
  /**
24
- * Gets the primary key column for a HubSpot table.
25
- * @param objectName - Table name
26
- * @returns Column name for the primary key
77
+ * Extracts the HubSpot object name from an API path.
78
+ * E.g., "/crm/v3/objects/contacts" -> "contacts"
27
79
  */
28
- private getIdField;
80
+ private ExtractObjectNameFromPath;
29
81
  /**
30
- * Gets the soft-delete flag column for a HubSpot table, if one exists.
31
- * Currently only the contacts table has an is_deleted column.
32
- * @param objectName - Table name
33
- * @returns Column name for the deleted flag, or undefined if not applicable
82
+ * Builds the `properties` query parameter for a HubSpot object type.
83
+ * Returns empty string if no properties are configured for the object.
34
84
  */
35
- private getDeletedField;
36
- /** Default field mappings: hs_Contacts -> Contacts */
37
- private getContactMappings;
38
- /** Default field mappings: hs_Companies -> Companies */
39
- private getCompanyMappings;
85
+ private BuildPropertiesParam;
86
+ /** Executes an HTTP request with a timeout. */
87
+ private FetchWithTimeout;
88
+ /** Calculates retry delay from Retry-After header or exponential backoff. */
89
+ private CalculateRetryDelay;
90
+ /** Converts a fetch Response + parsed body into a RESTResponse. */
91
+ private BuildRESTResponse;
92
+ /** Returns a promise that resolves after the specified number of milliseconds. */
93
+ private Sleep;
40
94
  }
95
+ export {};
41
96
  //# sourceMappingURL=HubSpotConnector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HubSpotConnector.d.ts","sourceRoot":"","sources":["../src/HubSpotConnector.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAC3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAanE;;;;GAIG;AACH,qBACa,gBAAiB,SAAQ,qBAAqB;IACvD;;;;;OAKG;IACU,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAMvE;;;;;OAKG;IACa,uBAAuB,CACnC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GACpB,mBAAmB,EAAE;IAWxB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IASlB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAOvB,sDAAsD;IACtD,OAAO,CAAC,kBAAkB;IAW1B,wDAAwD;IACxD,OAAO,CAAC,kBAAkB;CAS7B"}
1
+ {"version":3,"file":"HubSpotConnector.d.ts","sourceRoot":"","sources":["../src/HubSpotConnector.ts"],"names":[],"mappings":"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"}