Skip to content

Commit 65fc396

Browse files
authored
fix: outreach custom field validation (#244)
1 parent 72b4b87 commit 65fc396

File tree

3 files changed

+70
-44
lines changed

3 files changed

+70
-44
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": "1.0.32",
3+
"version": "1.0.33",
44
"description": "Vessel integrations",
55
"main": "dist/index.js",
66
"module": "dist/index.mjs",

src/platforms/outreach/actions/prospects/create.ts

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,31 @@
11
import { client } from '@/platforms/outreach/client';
22
import { action } from '@/sdk';
3+
import { omit } from 'radash';
34
import { z } from 'zod';
45

6+
const customFieldsSchema = z
7+
.record(
8+
z
9+
.string()
10+
.regex(/^custom[0-9]+$/, 'Custom fields must be of the form custom[0-9]+')
11+
.transform((key) => key as `custom${number}`),
12+
z.string().nullable(),
13+
)
14+
.optional();
15+
16+
const attributesSchema = z.object({
17+
firstName: z.string().nullish(),
18+
lastName: z.string().nullish(),
19+
occupation: z.string().nullish(),
20+
addressCity: z.string().nullish(),
21+
addressCountry: z.string().nullish(),
22+
addressState: z.string().nullish(),
23+
addressStreet: z.string().nullish(),
24+
addressStreet2: z.string().nullish(),
25+
addressZip: z.string().nullish(),
26+
emails: z.array(z.string()).optional(),
27+
});
28+
529
export default action(
630
'create-prospect',
731
{
@@ -10,28 +34,17 @@ export default action(
1034
mutation: true,
1135
schema: z.object({
1236
attributes: z
13-
.object({
14-
firstName: z.string().nullish(),
15-
lastName: z.string().nullish(),
16-
occupation: z.string().nullish(),
17-
addressCity: z.string().nullish(),
18-
addressCountry: z.string().nullish(),
19-
addressState: z.string().nullish(),
20-
addressStreet: z.string().nullish(),
21-
addressStreet2: z.string().nullish(),
22-
addressZip: z.string().nullish(),
23-
emails: z.array(z.string()).optional(),
24-
})
25-
.catchall(
26-
z
27-
.string()
28-
.regex(
29-
/^custom[0-9]+$/,
30-
'Custom fields must be of the form custom[0-9]+',
31-
)
32-
.transform((key) => key as `custom${number}`)
33-
.nullable(),
34-
),
37+
.preprocess((input) => {
38+
const attributes = attributesSchema.parse(input);
39+
const customFields = customFieldsSchema.parse(
40+
omit(input as any, Object.keys(attributes)),
41+
);
42+
return { customFields, ...attributes };
43+
}, attributesSchema.extend({ customFields: customFieldsSchema }))
44+
.transform((attr) => ({
45+
...omit(attr, ['customFields']),
46+
...attr.customFields,
47+
})),
3548
relationships: z.object({
3649
ownerId: z.number().optional(),
3750
accountId: z.number().optional(),

src/platforms/outreach/actions/prospects/update.ts

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,30 @@
11
import { client } from '@/platforms/outreach/client';
22
import { action } from '@/sdk';
3+
import { omit } from 'radash';
34
import { z } from 'zod';
45

6+
const customFieldsSchema = z
7+
.record(
8+
z
9+
.string()
10+
.regex(/^custom[0-9]+$/, 'Custom fields must be of the form custom[0-9]+')
11+
.transform((key) => key as `custom${number}`),
12+
z.string().nullable(),
13+
)
14+
.optional();
15+
16+
const attributesSchema = z.object({
17+
firstName: z.string().nullish(),
18+
lastName: z.string().nullish(),
19+
occupation: z.string().nullish(),
20+
addressCity: z.string().nullish(),
21+
addressCountry: z.string().nullish(),
22+
addressState: z.string().nullish(),
23+
addressStreet: z.string().nullish(),
24+
addressStreet2: z.string().nullish(),
25+
addressZip: z.string().nullish(),
26+
});
27+
528
export default action(
629
'update-prospect',
730
{
@@ -11,27 +34,17 @@ export default action(
1134
schema: z.object({
1235
id: z.number(),
1336
attributes: z
14-
.object({
15-
firstName: z.string().nullish(),
16-
lastName: z.string().nullish(),
17-
occupation: z.string().nullish(),
18-
addressCity: z.string().nullish(),
19-
addressCountry: z.string().nullish(),
20-
addressState: z.string().nullish(),
21-
addressStreet: z.string().nullish(),
22-
addressStreet2: z.string().nullish(),
23-
addressZip: z.string().nullish(),
24-
})
25-
.catchall(
26-
z
27-
.string()
28-
.regex(
29-
/^custom[0-9]+$/,
30-
'Custom fields must be of the form custom[0-9]+',
31-
)
32-
.transform((key) => key as `custom${number}`)
33-
.nullable(),
34-
),
37+
.preprocess((input) => {
38+
const attributes = attributesSchema.parse(input);
39+
const customFields = customFieldsSchema.parse(
40+
omit(input as any, Object.keys(attributes)),
41+
);
42+
return { customFields, ...attributes };
43+
}, attributesSchema.extend({ customFields: customFieldsSchema }))
44+
.transform((attr) => ({
45+
...omit(attr, ['customFields']),
46+
...attr.customFields,
47+
})),
3548
}),
3649
scopes: [],
3750
},

0 commit comments

Comments
 (0)