Skip to content

Commit 5940c18

Browse files
authored
feat: [sf,hs] batch gets (#133)
* feat: [sf,hs] batch gets * updating version and adding missing cursor logic piece
1 parent 3ecfd37 commit 5940c18

File tree

5 files changed

+129
-13
lines changed

5 files changed

+129
-13
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@vesselapi/integrations",
3-
"version": "0.0.98",
3+
"version": "0.0.99",
44
"description": "Vessel integrations",
55
"main": "dist/index.js",
66
"module": "dist/index.mjs",

src/platforms/hubspot/client.ts

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -173,16 +173,24 @@ const makeClient = () => {
173173
schema: z.ZodSchema,
174174
properties?: string[],
175175
): requestFunctionType<BatchReadObjectInput, TOutput> =>
176-
request(({ ids }: BatchReadObjectInput) => ({
177-
url: `/crm/${API_VERSION}/${module}/batch/read`,
178-
method: 'POST',
179-
json: {
180-
properties: properties ?? null,
181-
inputs: ids.map((id) => ({ id })),
182-
propertiesWithHistory: null,
183-
},
184-
schema,
185-
}));
176+
request(
177+
({
178+
ids,
179+
after,
180+
limit = HUBSPOT_MAX_PAGE_SIZE,
181+
}: BatchReadObjectInput) => ({
182+
url: `/crm/${API_VERSION}/${module}/batch/read`,
183+
method: 'POST',
184+
json: {
185+
properties: properties ?? null,
186+
inputs: ids.map((id) => ({ id })),
187+
propertiesWithHistory: null,
188+
limit,
189+
after,
190+
},
191+
schema,
192+
}),
193+
);
186194

187195
const crud = <
188196
TCreate extends Record<string, unknown>,
@@ -220,6 +228,10 @@ const makeClient = () => {
220228
'owners',
221229
listResponseSchema(hubspotOwnerSchema),
222230
),
231+
batchRead: batchReadObject<ListOutput<HubspotOwner>>(
232+
'owners',
233+
listResponseSchema(hubspotOwnerSchema),
234+
),
223235
},
224236
contacts: crud<HubspotContactCreate, HubspotContactUpdate, HubspotContact>(
225237
'objects/contacts',

src/platforms/hubspot/schemas.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export type ListObjectInput = {
2424
};
2525
export type BatchReadObjectInput = {
2626
ids: string[];
27-
};
27+
} & ListObjectInput;
2828
export type ListOutput<T> = {
2929
results?: T[];
3030
paging?: {

src/platforms/salesforce/actions/query-builder.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,27 @@ export const salesforceQueryBuilder: Record<
8484
LIMIT ${limit}
8585
`);
8686
},
87+
batchRead: ({
88+
ids,
89+
objectType,
90+
relationalSelect,
91+
associations,
92+
}: {
93+
ids: string[];
94+
objectType: SalesforceSupportedObjectType;
95+
relationalSelect?: Partial<Record<SalesforceSupportedObjectType, string>>;
96+
associations?: SalesforceSupportedObjectType[];
97+
}) => {
98+
const selectClauses = sift([
99+
'SELECT FIELDS(ALL)',
100+
buildRelationalSelectClause(relationalSelect, associations),
101+
]);
102+
return formatQuery(`
103+
${selectClauses.join(', ')}
104+
FROM ${objectType}
105+
WHERE Id IN ('${ids.join("','")}')
106+
`);
107+
},
87108
listListView: ({
88109
objectType,
89110
cursor,

src/platforms/salesforce/client.ts

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,35 @@ const query = {
144144
}),
145145
}),
146146
),
147+
batchRead: <T extends z.ZodType>({
148+
schema,
149+
objectType,
150+
relationalSelect,
151+
}: {
152+
schema: T;
153+
objectType: SalesforceSupportedObjectType;
154+
relationalSelect?: Partial<Record<SalesforceSupportedObjectType, string>>;
155+
}) =>
156+
request(
157+
({
158+
Ids,
159+
associations,
160+
}: {
161+
Ids: string[];
162+
associations?: SalesforceSupportedObjectType[];
163+
}) => ({
164+
url: `/query/?q=${salesforceQueryBuilder.batchRead({
165+
ids: Ids,
166+
objectType,
167+
relationalSelect,
168+
associations,
169+
})}`,
170+
method: 'GET',
171+
schema: z.object({
172+
records: z.array(schema),
173+
}),
174+
}),
175+
),
147176
};
148177

149178
export const client = {
@@ -166,7 +195,11 @@ export const client = {
166195
method: 'GET',
167196
schema: salesforceUser,
168197
})),
169-
list: query.list({
198+
list: query.list<typeof salesforceUser>({
199+
objectType: 'User',
200+
schema: salesforceUser,
201+
}),
202+
batchRead: query.batchRead<typeof salesforceUser>({
170203
objectType: 'User',
171204
schema: salesforceUser,
172205
}),
@@ -180,6 +213,10 @@ export const client = {
180213
objectType: 'Contact',
181214
schema: salesforceContact,
182215
}),
216+
batchRead: query.batchRead<typeof salesforceContact>({
217+
objectType: 'Contact',
218+
schema: salesforceContact,
219+
}),
183220
create: request(({ Contact }: SalesforceContactCreate) => ({
184221
url: `/sobjects/Contact`,
185222
method: 'POST',
@@ -255,6 +292,11 @@ export const client = {
255292
schema: salesforceAccount,
256293
relationalSelect: salesforceAccountRelationalSelect,
257294
}),
295+
batchRead: query.batchRead<typeof salesforceAccount>({
296+
objectType: 'Account',
297+
schema: salesforceAccount,
298+
relationalSelect: salesforceAccountRelationalSelect,
299+
}),
258300
create: request(({ Account }: SalesforceAccountCreate) => ({
259301
url: `/sobjects/Account`,
260302
method: 'POST',
@@ -282,6 +324,10 @@ export const client = {
282324
objectType: 'Opportunity',
283325
schema: salesforceOpportunity,
284326
}),
327+
batchRead: query.batchRead({
328+
objectType: 'Opportunity',
329+
schema: salesforceOpportunity,
330+
}),
285331
create: request(({ Opportunity }: SalesforceOpportunityCreate) => ({
286332
url: `/sobjects/Opportunity`,
287333
method: 'POST',
@@ -309,6 +355,10 @@ export const client = {
309355
objectType: 'Lead',
310356
schema: salesforceLead,
311357
}),
358+
batchRead: query.batchRead<typeof salesforceLead>({
359+
objectType: 'Lead',
360+
schema: salesforceLead,
361+
}),
312362
create: request(({ Lead }: SalesforceLeadCreate) => ({
313363
url: `/sobjects/Lead`,
314364
method: 'POST',
@@ -338,6 +388,11 @@ export const client = {
338388
schema: salesforceNote,
339389
relationalSelect: salesforceNoteRelationalSelect,
340390
}),
391+
batchRead: query.batchRead<typeof salesforceNote>({
392+
objectType: 'Note',
393+
schema: salesforceNote,
394+
relationalSelect: salesforceNoteRelationalSelect,
395+
}),
341396
create: request(({ Note }: SalesforceNoteCreate) => ({
342397
url: `/sobjects/Note`,
343398
method: 'POST',
@@ -367,6 +422,11 @@ export const client = {
367422
schema: salesforceContentNote,
368423
relationalSelect: salesforceContentNoteRelationalSelect,
369424
}),
425+
batchRead: query.batchRead<typeof salesforceContentNote>({
426+
objectType: 'ContentNote',
427+
schema: salesforceContentNote,
428+
relationalSelect: salesforceContentNoteRelationalSelect,
429+
}),
370430
create: request(({ ContentNote }: SalesforceContentNoteCreate) => ({
371431
url: `/sobjects/ContentNote`,
372432
method: 'POST',
@@ -411,6 +471,11 @@ export const client = {
411471
schema: salesforceTask,
412472
relationalSelect: salesforceTaskRelationalSelect,
413473
}),
474+
batchRead: query.batchRead<typeof salesforceTask>({
475+
objectType: 'Task',
476+
schema: salesforceTask,
477+
relationalSelect: salesforceTaskRelationalSelect,
478+
}),
414479
create: request(({ Task }: SalesforceTaskCreate) => ({
415480
url: `/sobjects/Task`,
416481
method: 'POST',
@@ -440,6 +505,11 @@ export const client = {
440505
schema: salesforceEvent,
441506
relationalSelect: salesforceEventRelationalSelect,
442507
}),
508+
batchRead: query.batchRead<typeof salesforceEvent>({
509+
objectType: 'Event',
510+
schema: salesforceEvent,
511+
relationalSelect: salesforceEventRelationalSelect,
512+
}),
443513
create: request(({ Event }: SalesforceEventCreate) => ({
444514
url: `/sobjects/Event`,
445515
method: 'POST',
@@ -467,6 +537,10 @@ export const client = {
467537
objectType: 'EventRelation',
468538
schema: salesforceEventRelation,
469539
}),
540+
batchRead: query.batchRead<typeof salesforceEventRelation>({
541+
objectType: 'EventRelation',
542+
schema: salesforceEventRelation,
543+
}),
470544
create: request(({ EventRelation }: SalesforceEventRelationCreate) => ({
471545
url: `/sobjects/EventRelation`,
472546
method: 'POST',
@@ -496,6 +570,11 @@ export const client = {
496570
schema: salesforceEmailMessage,
497571
relationalSelect: salesforceEmailMessageRelationalSelect,
498572
}),
573+
batchRead: query.batchRead<typeof salesforceEmailMessage>({
574+
objectType: 'EmailMessage',
575+
schema: salesforceEmailMessage,
576+
relationalSelect: salesforceEmailMessageRelationalSelect,
577+
}),
499578
create: request(({ EmailMessage }: SalesforceEmailMessageCreate) => ({
500579
url: `/sobjects/EmailMessage`,
501580
method: 'POST',
@@ -523,6 +602,10 @@ export const client = {
523602
objectType: 'EmailMessageRelation',
524603
schema: salesforceEmailMessageRelation,
525604
}),
605+
batchRead: query.batchRead<typeof salesforceEmailMessageRelation>({
606+
objectType: 'EmailMessageRelation',
607+
schema: salesforceEmailMessageRelation,
608+
}),
526609
create: request(
527610
({ EmailMessageRelation }: SalesforceEmailMessageRelationCreate) => ({
528611
url: `/sobjects/EmailMessageRelation`,

0 commit comments

Comments
 (0)