placementt-core 1.400.1127 → 1.400.1129
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.
- package/lib/callables/__tests__/outreach.test.js +9 -1
- package/lib/callables/__tests__/outreach.test.js.map +1 -1
- package/lib/callables/outreach.d.ts +44 -0
- package/lib/callables/outreach.js +22 -0
- package/lib/callables/outreach.js.map +1 -1
- package/lib/callables/registry.d.ts +80 -0
- package/lib/typeDefinitions.d.ts +8 -0
- package/package.json +1 -1
- package/src/callables/__tests__/outreach.test.ts +10 -1
- package/src/callables/outreach.ts +23 -0
- package/src/typeDefinitions.ts +6 -0
|
@@ -5,13 +5,17 @@ const outreach_1 = require("../outreach");
|
|
|
5
5
|
* breaks the web or backend payload fails here first. */
|
|
6
6
|
const samples = {
|
|
7
7
|
"outreach-upsertContacts": {
|
|
8
|
-
request: { rows: [{ urn: "100000", affiliation: "Test School", email: "head@test.sch.uk" }], dryRun: true },
|
|
8
|
+
request: { rows: [{ urn: "100000", affiliation: "Test School", email: "head@test.sch.uk" }], dryRun: true, group: "Derby" },
|
|
9
9
|
response: { added: 1, updated: 0, keptStatus: 0, noEmail: 0, invalidEmail: 0, duplicateEmailInUpload: 0, skipped: [{ row: 2, reason: "No URN" }] },
|
|
10
10
|
},
|
|
11
11
|
"outreach-setStatus": {
|
|
12
12
|
request: { urn: 100000, status: "deferred", deferUntil: "2027-09-28", reason: "Next year" },
|
|
13
13
|
response: { urn: 100000, status: "deferred", brevoSynced: true, affectedUrns: [100000] },
|
|
14
14
|
},
|
|
15
|
+
"outreach-setGroup": {
|
|
16
|
+
request: { urn: 100000, group: "Derby" },
|
|
17
|
+
response: { urn: 100000, group: "Derby", brevoSynced: true, affectedUrns: [100000] },
|
|
18
|
+
},
|
|
15
19
|
"outreach-convertToLead": {
|
|
16
20
|
request: { urn: 100000, lead: { forename: "Jo", surname: "Bloggs", email: "jo@test.sch.uk", organisation: "Test School", assignee: "uid1" } },
|
|
17
21
|
response: { leadId: "lead1" },
|
|
@@ -49,6 +53,10 @@ describe("outreach contracts", () => {
|
|
|
49
53
|
expect(outreach_1.outreachCallables["outreach-setStatus"].request
|
|
50
54
|
.safeParse({ urn: 1, status: "deferred", deferUntil: "28/09/2027" }).success).toBe(false);
|
|
51
55
|
});
|
|
56
|
+
it("rejects a blank group name", () => {
|
|
57
|
+
expect(outreach_1.outreachCallables["outreach-upsertContacts"].request
|
|
58
|
+
.safeParse({ rows: [{ urn: "1" }], group: " " }).success).toBe(false);
|
|
59
|
+
});
|
|
52
60
|
it("rejects an empty upload", () => {
|
|
53
61
|
expect(outreach_1.outreachCallables["outreach-upsertContacts"].request.safeParse({ rows: [] }).success).toBe(false);
|
|
54
62
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outreach.test.js","sourceRoot":"","sources":["../../../src/callables/__tests__/outreach.test.ts"],"names":[],"mappings":";;AAAA,0CAA8C;AAE9C;yDACyD;AACzD,MAAM,OAAO,GAAmF;IAC5F,yBAAyB,EAAE;QACvB,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,kBAAkB,EAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAC;
|
|
1
|
+
{"version":3,"file":"outreach.test.js","sourceRoot":"","sources":["../../../src/callables/__tests__/outreach.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,13 +3,17 @@ export declare const outreachCallables: {
|
|
|
3
3
|
"outreach-upsertContacts": {
|
|
4
4
|
request: z.ZodObject<{
|
|
5
5
|
rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodString>>, "many">;
|
|
6
|
+
/** Group for rows whose group column is blank (created in Brevo if new). A row's own group wins. */
|
|
7
|
+
group: z.ZodOptional<z.ZodString>;
|
|
6
8
|
/** Count what would happen without writing to Firestore or Brevo. */
|
|
7
9
|
dryRun: z.ZodOptional<z.ZodBoolean>;
|
|
8
10
|
}, "strip", z.ZodTypeAny, {
|
|
9
11
|
rows: Record<string, string | undefined>[];
|
|
12
|
+
group?: string | undefined;
|
|
10
13
|
dryRun?: boolean | undefined;
|
|
11
14
|
}, {
|
|
12
15
|
rows: Record<string, string | undefined>[];
|
|
16
|
+
group?: string | undefined;
|
|
13
17
|
dryRun?: boolean | undefined;
|
|
14
18
|
}>;
|
|
15
19
|
response: z.ZodObject<{
|
|
@@ -33,6 +37,8 @@ export declare const outreachCallables: {
|
|
|
33
37
|
row: number;
|
|
34
38
|
urn?: string | undefined;
|
|
35
39
|
}>, "many">;
|
|
40
|
+
/** Rows put in each group by this upload. */
|
|
41
|
+
groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
36
42
|
brevoProcessId: z.ZodOptional<z.ZodNumber>;
|
|
37
43
|
brevoError: z.ZodOptional<z.ZodString>;
|
|
38
44
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -47,6 +53,7 @@ export declare const outreachCallables: {
|
|
|
47
53
|
keptStatus: number;
|
|
48
54
|
invalidEmail: number;
|
|
49
55
|
duplicateEmailInUpload: number;
|
|
56
|
+
groups?: Record<string, number> | undefined;
|
|
50
57
|
brevoProcessId?: number | undefined;
|
|
51
58
|
brevoError?: string | undefined;
|
|
52
59
|
}, {
|
|
@@ -61,6 +68,7 @@ export declare const outreachCallables: {
|
|
|
61
68
|
keptStatus: number;
|
|
62
69
|
invalidEmail: number;
|
|
63
70
|
duplicateEmailInUpload: number;
|
|
71
|
+
groups?: Record<string, number> | undefined;
|
|
64
72
|
brevoProcessId?: number | undefined;
|
|
65
73
|
brevoError?: string | undefined;
|
|
66
74
|
}>;
|
|
@@ -74,6 +82,8 @@ export declare const outreachCallables: {
|
|
|
74
82
|
deferUntil: z.ZodOptional<z.ZodString>;
|
|
75
83
|
/** Customer institute, when status is customer. */
|
|
76
84
|
oId: z.ZodOptional<z.ZodString>;
|
|
85
|
+
/** Lead to link, e.g. when confirming a domain match. */
|
|
86
|
+
leadId: z.ZodOptional<z.ZodString>;
|
|
77
87
|
/** Also apply to every URN in `outreach.sharedEmailUrns`. */
|
|
78
88
|
applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
|
|
79
89
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -82,6 +92,7 @@ export declare const outreachCallables: {
|
|
|
82
92
|
reason?: string | undefined;
|
|
83
93
|
oId?: string | undefined;
|
|
84
94
|
deferUntil?: string | undefined;
|
|
95
|
+
leadId?: string | undefined;
|
|
85
96
|
applyToSharedEmail?: boolean | undefined;
|
|
86
97
|
}, {
|
|
87
98
|
status: "pool" | "lead" | "deferred" | "customer" | "doNotContact";
|
|
@@ -89,6 +100,7 @@ export declare const outreachCallables: {
|
|
|
89
100
|
reason?: string | undefined;
|
|
90
101
|
oId?: string | undefined;
|
|
91
102
|
deferUntil?: string | undefined;
|
|
103
|
+
leadId?: string | undefined;
|
|
92
104
|
applyToSharedEmail?: boolean | undefined;
|
|
93
105
|
}>;
|
|
94
106
|
response: z.ZodObject<{
|
|
@@ -108,6 +120,38 @@ export declare const outreachCallables: {
|
|
|
108
120
|
affectedUrns: number[];
|
|
109
121
|
}>;
|
|
110
122
|
};
|
|
123
|
+
"outreach-setGroup": {
|
|
124
|
+
request: z.ZodObject<{
|
|
125
|
+
urn: z.ZodNumber;
|
|
126
|
+
/** The school's group; null takes it out of any group. */
|
|
127
|
+
group: z.ZodNullable<z.ZodString>;
|
|
128
|
+
applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
|
|
129
|
+
}, "strip", z.ZodTypeAny, {
|
|
130
|
+
group: string | null;
|
|
131
|
+
urn: number;
|
|
132
|
+
applyToSharedEmail?: boolean | undefined;
|
|
133
|
+
}, {
|
|
134
|
+
group: string | null;
|
|
135
|
+
urn: number;
|
|
136
|
+
applyToSharedEmail?: boolean | undefined;
|
|
137
|
+
}>;
|
|
138
|
+
response: z.ZodObject<{
|
|
139
|
+
urn: z.ZodNumber;
|
|
140
|
+
group: z.ZodNullable<z.ZodString>;
|
|
141
|
+
brevoSynced: z.ZodBoolean;
|
|
142
|
+
affectedUrns: z.ZodArray<z.ZodNumber, "many">;
|
|
143
|
+
}, "strip", z.ZodTypeAny, {
|
|
144
|
+
group: string | null;
|
|
145
|
+
urn: number;
|
|
146
|
+
brevoSynced: boolean;
|
|
147
|
+
affectedUrns: number[];
|
|
148
|
+
}, {
|
|
149
|
+
group: string | null;
|
|
150
|
+
urn: number;
|
|
151
|
+
brevoSynced: boolean;
|
|
152
|
+
affectedUrns: number[];
|
|
153
|
+
}>;
|
|
154
|
+
};
|
|
111
155
|
"outreach-convertToLead": {
|
|
112
156
|
request: z.ZodObject<{
|
|
113
157
|
urn: z.ZodNumber;
|
|
@@ -12,11 +12,15 @@ const zod_1 = require("zod");
|
|
|
12
12
|
const outreachStatus = zod_1.z.enum(["pool", "lead", "deferred", "customer", "doNotContact"]);
|
|
13
13
|
/** A pasted spreadsheet row keyed by DFE_CONTACT_UPLOAD_COLUMNS. Raw strings; the backend coerces. */
|
|
14
14
|
const uploadRow = zod_1.z.record(zod_1.z.string(), zod_1.z.string().optional());
|
|
15
|
+
/** An outreach group name, which is also its Brevo list name. */
|
|
16
|
+
const groupName = zod_1.z.string().trim().min(1, "Name the group.").max(60, "Keep group names under 60 characters.");
|
|
15
17
|
const isoDate = zod_1.z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Use a YYYY-MM-DD date.");
|
|
16
18
|
exports.outreachCallables = {
|
|
17
19
|
"outreach-upsertContacts": {
|
|
18
20
|
request: zod_1.z.object({
|
|
19
21
|
rows: zod_1.z.array(uploadRow).min(1).max(2000),
|
|
22
|
+
/** Group for rows whose group column is blank (created in Brevo if new). A row's own group wins. */
|
|
23
|
+
group: groupName.optional(),
|
|
20
24
|
/** Count what would happen without writing to Firestore or Brevo. */
|
|
21
25
|
dryRun: zod_1.z.boolean().optional(),
|
|
22
26
|
}),
|
|
@@ -29,6 +33,8 @@ exports.outreachCallables = {
|
|
|
29
33
|
invalidEmail: zod_1.z.number(),
|
|
30
34
|
duplicateEmailInUpload: zod_1.z.number(),
|
|
31
35
|
skipped: zod_1.z.array(zod_1.z.object({ row: zod_1.z.number(), urn: zod_1.z.string().optional(), reason: zod_1.z.string() })),
|
|
36
|
+
/** Rows put in each group by this upload. */
|
|
37
|
+
groups: zod_1.z.record(zod_1.z.string(), zod_1.z.number()).optional(),
|
|
32
38
|
brevoProcessId: zod_1.z.number().optional(),
|
|
33
39
|
brevoError: zod_1.z.string().optional(),
|
|
34
40
|
}),
|
|
@@ -42,6 +48,8 @@ exports.outreachCallables = {
|
|
|
42
48
|
deferUntil: isoDate.optional(),
|
|
43
49
|
/** Customer institute, when status is customer. */
|
|
44
50
|
oId: zod_1.z.string().optional(),
|
|
51
|
+
/** Lead to link, e.g. when confirming a domain match. */
|
|
52
|
+
leadId: zod_1.z.string().optional(),
|
|
45
53
|
/** Also apply to every URN in `outreach.sharedEmailUrns`. */
|
|
46
54
|
applyToSharedEmail: zod_1.z.boolean().optional(),
|
|
47
55
|
}),
|
|
@@ -52,6 +60,20 @@ exports.outreachCallables = {
|
|
|
52
60
|
affectedUrns: zod_1.z.array(zod_1.z.number()),
|
|
53
61
|
}),
|
|
54
62
|
},
|
|
63
|
+
"outreach-setGroup": {
|
|
64
|
+
request: zod_1.z.object({
|
|
65
|
+
urn: zod_1.z.number(),
|
|
66
|
+
/** The school's group; null takes it out of any group. */
|
|
67
|
+
group: groupName.nullable(),
|
|
68
|
+
applyToSharedEmail: zod_1.z.boolean().optional(),
|
|
69
|
+
}),
|
|
70
|
+
response: zod_1.z.object({
|
|
71
|
+
urn: zod_1.z.number(),
|
|
72
|
+
group: zod_1.z.string().nullable(),
|
|
73
|
+
brevoSynced: zod_1.z.boolean(),
|
|
74
|
+
affectedUrns: zod_1.z.array(zod_1.z.number()),
|
|
75
|
+
}),
|
|
76
|
+
},
|
|
55
77
|
"outreach-convertToLead": {
|
|
56
78
|
request: zod_1.z.object({
|
|
57
79
|
urn: zod_1.z.number(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outreach.js","sourceRoot":"","sources":["../../src/callables/outreach.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"outreach.js","sourceRoot":"","sources":["../../src/callables/outreach.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,12 +14,15 @@ export declare const allCallables: {
|
|
|
14
14
|
"outreach-upsertContacts": {
|
|
15
15
|
request: z.ZodObject<{
|
|
16
16
|
rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodString>>, "many">;
|
|
17
|
+
group: z.ZodOptional<z.ZodString>;
|
|
17
18
|
dryRun: z.ZodOptional<z.ZodBoolean>;
|
|
18
19
|
}, "strip", z.ZodTypeAny, {
|
|
19
20
|
rows: Record<string, string | undefined>[];
|
|
21
|
+
group?: string | undefined;
|
|
20
22
|
dryRun?: boolean | undefined;
|
|
21
23
|
}, {
|
|
22
24
|
rows: Record<string, string | undefined>[];
|
|
25
|
+
group?: string | undefined;
|
|
23
26
|
dryRun?: boolean | undefined;
|
|
24
27
|
}>;
|
|
25
28
|
response: z.ZodObject<{
|
|
@@ -42,6 +45,7 @@ export declare const allCallables: {
|
|
|
42
45
|
row: number;
|
|
43
46
|
urn?: string | undefined;
|
|
44
47
|
}>, "many">;
|
|
48
|
+
groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
45
49
|
brevoProcessId: z.ZodOptional<z.ZodNumber>;
|
|
46
50
|
brevoError: z.ZodOptional<z.ZodString>;
|
|
47
51
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -56,6 +60,7 @@ export declare const allCallables: {
|
|
|
56
60
|
keptStatus: number;
|
|
57
61
|
invalidEmail: number;
|
|
58
62
|
duplicateEmailInUpload: number;
|
|
63
|
+
groups?: Record<string, number> | undefined;
|
|
59
64
|
brevoProcessId?: number | undefined;
|
|
60
65
|
brevoError?: string | undefined;
|
|
61
66
|
}, {
|
|
@@ -70,6 +75,7 @@ export declare const allCallables: {
|
|
|
70
75
|
keptStatus: number;
|
|
71
76
|
invalidEmail: number;
|
|
72
77
|
duplicateEmailInUpload: number;
|
|
78
|
+
groups?: Record<string, number> | undefined;
|
|
73
79
|
brevoProcessId?: number | undefined;
|
|
74
80
|
brevoError?: string | undefined;
|
|
75
81
|
}>;
|
|
@@ -81,6 +87,7 @@ export declare const allCallables: {
|
|
|
81
87
|
reason: z.ZodOptional<z.ZodString>;
|
|
82
88
|
deferUntil: z.ZodOptional<z.ZodString>;
|
|
83
89
|
oId: z.ZodOptional<z.ZodString>;
|
|
90
|
+
leadId: z.ZodOptional<z.ZodString>;
|
|
84
91
|
applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
|
|
85
92
|
}, "strip", z.ZodTypeAny, {
|
|
86
93
|
status: "pool" | "lead" | "deferred" | "customer" | "doNotContact";
|
|
@@ -88,6 +95,7 @@ export declare const allCallables: {
|
|
|
88
95
|
reason?: string | undefined;
|
|
89
96
|
oId?: string | undefined;
|
|
90
97
|
deferUntil?: string | undefined;
|
|
98
|
+
leadId?: string | undefined;
|
|
91
99
|
applyToSharedEmail?: boolean | undefined;
|
|
92
100
|
}, {
|
|
93
101
|
status: "pool" | "lead" | "deferred" | "customer" | "doNotContact";
|
|
@@ -95,6 +103,7 @@ export declare const allCallables: {
|
|
|
95
103
|
reason?: string | undefined;
|
|
96
104
|
oId?: string | undefined;
|
|
97
105
|
deferUntil?: string | undefined;
|
|
106
|
+
leadId?: string | undefined;
|
|
98
107
|
applyToSharedEmail?: boolean | undefined;
|
|
99
108
|
}>;
|
|
100
109
|
response: z.ZodObject<{
|
|
@@ -114,6 +123,37 @@ export declare const allCallables: {
|
|
|
114
123
|
affectedUrns: number[];
|
|
115
124
|
}>;
|
|
116
125
|
};
|
|
126
|
+
"outreach-setGroup": {
|
|
127
|
+
request: z.ZodObject<{
|
|
128
|
+
urn: z.ZodNumber;
|
|
129
|
+
group: z.ZodNullable<z.ZodString>;
|
|
130
|
+
applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
|
|
131
|
+
}, "strip", z.ZodTypeAny, {
|
|
132
|
+
group: string | null;
|
|
133
|
+
urn: number;
|
|
134
|
+
applyToSharedEmail?: boolean | undefined;
|
|
135
|
+
}, {
|
|
136
|
+
group: string | null;
|
|
137
|
+
urn: number;
|
|
138
|
+
applyToSharedEmail?: boolean | undefined;
|
|
139
|
+
}>;
|
|
140
|
+
response: z.ZodObject<{
|
|
141
|
+
urn: z.ZodNumber;
|
|
142
|
+
group: z.ZodNullable<z.ZodString>;
|
|
143
|
+
brevoSynced: z.ZodBoolean;
|
|
144
|
+
affectedUrns: z.ZodArray<z.ZodNumber, "many">;
|
|
145
|
+
}, "strip", z.ZodTypeAny, {
|
|
146
|
+
group: string | null;
|
|
147
|
+
urn: number;
|
|
148
|
+
brevoSynced: boolean;
|
|
149
|
+
affectedUrns: number[];
|
|
150
|
+
}, {
|
|
151
|
+
group: string | null;
|
|
152
|
+
urn: number;
|
|
153
|
+
brevoSynced: boolean;
|
|
154
|
+
affectedUrns: number[];
|
|
155
|
+
}>;
|
|
156
|
+
};
|
|
117
157
|
"outreach-convertToLead": {
|
|
118
158
|
request: z.ZodObject<{
|
|
119
159
|
urn: z.ZodNumber;
|
|
@@ -3582,12 +3622,15 @@ export declare const callableGroups: {
|
|
|
3582
3622
|
"outreach-upsertContacts": {
|
|
3583
3623
|
request: z.ZodObject<{
|
|
3584
3624
|
rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodString>>, "many">;
|
|
3625
|
+
group: z.ZodOptional<z.ZodString>;
|
|
3585
3626
|
dryRun: z.ZodOptional<z.ZodBoolean>;
|
|
3586
3627
|
}, "strip", z.ZodTypeAny, {
|
|
3587
3628
|
rows: Record<string, string | undefined>[];
|
|
3629
|
+
group?: string | undefined;
|
|
3588
3630
|
dryRun?: boolean | undefined;
|
|
3589
3631
|
}, {
|
|
3590
3632
|
rows: Record<string, string | undefined>[];
|
|
3633
|
+
group?: string | undefined;
|
|
3591
3634
|
dryRun?: boolean | undefined;
|
|
3592
3635
|
}>;
|
|
3593
3636
|
response: z.ZodObject<{
|
|
@@ -3610,6 +3653,7 @@ export declare const callableGroups: {
|
|
|
3610
3653
|
row: number;
|
|
3611
3654
|
urn?: string | undefined;
|
|
3612
3655
|
}>, "many">;
|
|
3656
|
+
groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
3613
3657
|
brevoProcessId: z.ZodOptional<z.ZodNumber>;
|
|
3614
3658
|
brevoError: z.ZodOptional<z.ZodString>;
|
|
3615
3659
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -3624,6 +3668,7 @@ export declare const callableGroups: {
|
|
|
3624
3668
|
keptStatus: number;
|
|
3625
3669
|
invalidEmail: number;
|
|
3626
3670
|
duplicateEmailInUpload: number;
|
|
3671
|
+
groups?: Record<string, number> | undefined;
|
|
3627
3672
|
brevoProcessId?: number | undefined;
|
|
3628
3673
|
brevoError?: string | undefined;
|
|
3629
3674
|
}, {
|
|
@@ -3638,6 +3683,7 @@ export declare const callableGroups: {
|
|
|
3638
3683
|
keptStatus: number;
|
|
3639
3684
|
invalidEmail: number;
|
|
3640
3685
|
duplicateEmailInUpload: number;
|
|
3686
|
+
groups?: Record<string, number> | undefined;
|
|
3641
3687
|
brevoProcessId?: number | undefined;
|
|
3642
3688
|
brevoError?: string | undefined;
|
|
3643
3689
|
}>;
|
|
@@ -3649,6 +3695,7 @@ export declare const callableGroups: {
|
|
|
3649
3695
|
reason: z.ZodOptional<z.ZodString>;
|
|
3650
3696
|
deferUntil: z.ZodOptional<z.ZodString>;
|
|
3651
3697
|
oId: z.ZodOptional<z.ZodString>;
|
|
3698
|
+
leadId: z.ZodOptional<z.ZodString>;
|
|
3652
3699
|
applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
|
|
3653
3700
|
}, "strip", z.ZodTypeAny, {
|
|
3654
3701
|
status: "pool" | "lead" | "deferred" | "customer" | "doNotContact";
|
|
@@ -3656,6 +3703,7 @@ export declare const callableGroups: {
|
|
|
3656
3703
|
reason?: string | undefined;
|
|
3657
3704
|
oId?: string | undefined;
|
|
3658
3705
|
deferUntil?: string | undefined;
|
|
3706
|
+
leadId?: string | undefined;
|
|
3659
3707
|
applyToSharedEmail?: boolean | undefined;
|
|
3660
3708
|
}, {
|
|
3661
3709
|
status: "pool" | "lead" | "deferred" | "customer" | "doNotContact";
|
|
@@ -3663,6 +3711,7 @@ export declare const callableGroups: {
|
|
|
3663
3711
|
reason?: string | undefined;
|
|
3664
3712
|
oId?: string | undefined;
|
|
3665
3713
|
deferUntil?: string | undefined;
|
|
3714
|
+
leadId?: string | undefined;
|
|
3666
3715
|
applyToSharedEmail?: boolean | undefined;
|
|
3667
3716
|
}>;
|
|
3668
3717
|
response: z.ZodObject<{
|
|
@@ -3682,6 +3731,37 @@ export declare const callableGroups: {
|
|
|
3682
3731
|
affectedUrns: number[];
|
|
3683
3732
|
}>;
|
|
3684
3733
|
};
|
|
3734
|
+
"outreach-setGroup": {
|
|
3735
|
+
request: z.ZodObject<{
|
|
3736
|
+
urn: z.ZodNumber;
|
|
3737
|
+
group: z.ZodNullable<z.ZodString>;
|
|
3738
|
+
applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
|
|
3739
|
+
}, "strip", z.ZodTypeAny, {
|
|
3740
|
+
group: string | null;
|
|
3741
|
+
urn: number;
|
|
3742
|
+
applyToSharedEmail?: boolean | undefined;
|
|
3743
|
+
}, {
|
|
3744
|
+
group: string | null;
|
|
3745
|
+
urn: number;
|
|
3746
|
+
applyToSharedEmail?: boolean | undefined;
|
|
3747
|
+
}>;
|
|
3748
|
+
response: z.ZodObject<{
|
|
3749
|
+
urn: z.ZodNumber;
|
|
3750
|
+
group: z.ZodNullable<z.ZodString>;
|
|
3751
|
+
brevoSynced: z.ZodBoolean;
|
|
3752
|
+
affectedUrns: z.ZodArray<z.ZodNumber, "many">;
|
|
3753
|
+
}, "strip", z.ZodTypeAny, {
|
|
3754
|
+
group: string | null;
|
|
3755
|
+
urn: number;
|
|
3756
|
+
brevoSynced: boolean;
|
|
3757
|
+
affectedUrns: number[];
|
|
3758
|
+
}, {
|
|
3759
|
+
group: string | null;
|
|
3760
|
+
urn: number;
|
|
3761
|
+
brevoSynced: boolean;
|
|
3762
|
+
affectedUrns: number[];
|
|
3763
|
+
}>;
|
|
3764
|
+
};
|
|
3685
3765
|
"outreach-convertToLead": {
|
|
3686
3766
|
request: z.ZodObject<{
|
|
3687
3767
|
urn: z.ZodNumber;
|
package/lib/typeDefinitions.d.ts
CHANGED
|
@@ -4421,6 +4421,8 @@ export type DfESchoolContact = {
|
|
|
4421
4421
|
city: string;
|
|
4422
4422
|
doesWex?: boolean;
|
|
4423
4423
|
notes?: string;
|
|
4424
|
+
/** Outreach group (e.g. "Derby"), false for none. Each group is a Brevo list the
|
|
4425
|
+
* school is in while it is in the mailable pool. */
|
|
4424
4426
|
group?: string | false;
|
|
4425
4427
|
url: string;
|
|
4426
4428
|
potential: string;
|
|
@@ -4517,6 +4519,12 @@ export type OutreachConfig = {
|
|
|
4517
4519
|
marketingListId: number;
|
|
4518
4520
|
customersListId: number;
|
|
4519
4521
|
webhookId?: number;
|
|
4522
|
+
/** Brevo folder the outreach lists live in. */
|
|
4523
|
+
folderId?: number;
|
|
4524
|
+
/** Brevo list id per outreach group name, created on first use. */
|
|
4525
|
+
groupLists?: {
|
|
4526
|
+
[group: string]: number;
|
|
4527
|
+
};
|
|
4520
4528
|
backfill?: {
|
|
4521
4529
|
cursorUrn?: number;
|
|
4522
4530
|
done: boolean;
|
package/package.json
CHANGED
|
@@ -4,13 +4,17 @@ import {outreachCallables} from "../outreach";
|
|
|
4
4
|
* breaks the web or backend payload fails here first. */
|
|
5
5
|
const samples: {[K in keyof typeof outreachCallables]: {request: unknown, response: unknown}} = {
|
|
6
6
|
"outreach-upsertContacts": {
|
|
7
|
-
request: {rows: [{urn: "100000", affiliation: "Test School", email: "head@test.sch.uk"}], dryRun: true},
|
|
7
|
+
request: {rows: [{urn: "100000", affiliation: "Test School", email: "head@test.sch.uk"}], dryRun: true, group: "Derby"},
|
|
8
8
|
response: {added: 1, updated: 0, keptStatus: 0, noEmail: 0, invalidEmail: 0, duplicateEmailInUpload: 0, skipped: [{row: 2, reason: "No URN"}]},
|
|
9
9
|
},
|
|
10
10
|
"outreach-setStatus": {
|
|
11
11
|
request: {urn: 100000, status: "deferred", deferUntil: "2027-09-28", reason: "Next year"},
|
|
12
12
|
response: {urn: 100000, status: "deferred", brevoSynced: true, affectedUrns: [100000]},
|
|
13
13
|
},
|
|
14
|
+
"outreach-setGroup": {
|
|
15
|
+
request: {urn: 100000, group: "Derby"},
|
|
16
|
+
response: {urn: 100000, group: "Derby", brevoSynced: true, affectedUrns: [100000]},
|
|
17
|
+
},
|
|
14
18
|
"outreach-convertToLead": {
|
|
15
19
|
request: {urn: 100000, lead: {forename: "Jo", surname: "Bloggs", email: "jo@test.sch.uk", organisation: "Test School", assignee: "uid1"}},
|
|
16
20
|
response: {leadId: "lead1"},
|
|
@@ -51,6 +55,11 @@ describe("outreach contracts", () => {
|
|
|
51
55
|
.safeParse({urn: 1, status: "deferred", deferUntil: "28/09/2027"}).success).toBe(false);
|
|
52
56
|
});
|
|
53
57
|
|
|
58
|
+
it("rejects a blank group name", () => {
|
|
59
|
+
expect(outreachCallables["outreach-upsertContacts"].request
|
|
60
|
+
.safeParse({rows: [{urn: "1"}], group: " "}).success).toBe(false);
|
|
61
|
+
});
|
|
62
|
+
|
|
54
63
|
it("rejects an empty upload", () => {
|
|
55
64
|
expect(outreachCallables["outreach-upsertContacts"].request.safeParse({rows: []}).success).toBe(false);
|
|
56
65
|
});
|
|
@@ -14,12 +14,17 @@ const outreachStatus = z.enum(["pool", "lead", "deferred", "customer", "doNotCon
|
|
|
14
14
|
/** A pasted spreadsheet row keyed by DFE_CONTACT_UPLOAD_COLUMNS. Raw strings; the backend coerces. */
|
|
15
15
|
const uploadRow = z.record(z.string(), z.string().optional());
|
|
16
16
|
|
|
17
|
+
/** An outreach group name, which is also its Brevo list name. */
|
|
18
|
+
const groupName = z.string().trim().min(1, "Name the group.").max(60, "Keep group names under 60 characters.");
|
|
19
|
+
|
|
17
20
|
const isoDate = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Use a YYYY-MM-DD date.");
|
|
18
21
|
|
|
19
22
|
export const outreachCallables = {
|
|
20
23
|
"outreach-upsertContacts": {
|
|
21
24
|
request: z.object({
|
|
22
25
|
rows: z.array(uploadRow).min(1).max(2000),
|
|
26
|
+
/** Group for rows whose group column is blank (created in Brevo if new). A row's own group wins. */
|
|
27
|
+
group: groupName.optional(),
|
|
23
28
|
/** Count what would happen without writing to Firestore or Brevo. */
|
|
24
29
|
dryRun: z.boolean().optional(),
|
|
25
30
|
}),
|
|
@@ -32,6 +37,8 @@ export const outreachCallables = {
|
|
|
32
37
|
invalidEmail: z.number(),
|
|
33
38
|
duplicateEmailInUpload: z.number(),
|
|
34
39
|
skipped: z.array(z.object({row: z.number(), urn: z.string().optional(), reason: z.string()})),
|
|
40
|
+
/** Rows put in each group by this upload. */
|
|
41
|
+
groups: z.record(z.string(), z.number()).optional(),
|
|
35
42
|
brevoProcessId: z.number().optional(),
|
|
36
43
|
brevoError: z.string().optional(),
|
|
37
44
|
}),
|
|
@@ -45,6 +52,8 @@ export const outreachCallables = {
|
|
|
45
52
|
deferUntil: isoDate.optional(),
|
|
46
53
|
/** Customer institute, when status is customer. */
|
|
47
54
|
oId: z.string().optional(),
|
|
55
|
+
/** Lead to link, e.g. when confirming a domain match. */
|
|
56
|
+
leadId: z.string().optional(),
|
|
48
57
|
/** Also apply to every URN in `outreach.sharedEmailUrns`. */
|
|
49
58
|
applyToSharedEmail: z.boolean().optional(),
|
|
50
59
|
}),
|
|
@@ -55,6 +64,20 @@ export const outreachCallables = {
|
|
|
55
64
|
affectedUrns: z.array(z.number()),
|
|
56
65
|
}),
|
|
57
66
|
},
|
|
67
|
+
"outreach-setGroup": {
|
|
68
|
+
request: z.object({
|
|
69
|
+
urn: z.number(),
|
|
70
|
+
/** The school's group; null takes it out of any group. */
|
|
71
|
+
group: groupName.nullable(),
|
|
72
|
+
applyToSharedEmail: z.boolean().optional(),
|
|
73
|
+
}),
|
|
74
|
+
response: z.object({
|
|
75
|
+
urn: z.number(),
|
|
76
|
+
group: z.string().nullable(),
|
|
77
|
+
brevoSynced: z.boolean(),
|
|
78
|
+
affectedUrns: z.array(z.number()),
|
|
79
|
+
}),
|
|
80
|
+
},
|
|
58
81
|
"outreach-convertToLead": {
|
|
59
82
|
request: z.object({
|
|
60
83
|
urn: z.number(),
|
package/src/typeDefinitions.ts
CHANGED
|
@@ -4573,6 +4573,8 @@ export type DfESchoolContact = {
|
|
|
4573
4573
|
city: string,
|
|
4574
4574
|
doesWex?: boolean,
|
|
4575
4575
|
notes?: string,
|
|
4576
|
+
/** Outreach group (e.g. "Derby"), false for none. Each group is a Brevo list the
|
|
4577
|
+
* school is in while it is in the mailable pool. */
|
|
4576
4578
|
group?: string|false,
|
|
4577
4579
|
url: string,
|
|
4578
4580
|
potential: string,
|
|
@@ -4670,6 +4672,10 @@ export type OutreachConfig = {
|
|
|
4670
4672
|
marketingListId: number,
|
|
4671
4673
|
customersListId: number,
|
|
4672
4674
|
webhookId?: number,
|
|
4675
|
+
/** Brevo folder the outreach lists live in. */
|
|
4676
|
+
folderId?: number,
|
|
4677
|
+
/** Brevo list id per outreach group name, created on first use. */
|
|
4678
|
+
groupLists?: {[group: string]: number},
|
|
4673
4679
|
backfill?: {cursorUrn?: number, done: boolean, total: number, processed?: number},
|
|
4674
4680
|
lastSweepAt?: string,
|
|
4675
4681
|
lastReconcile?: {
|