@itm-studio/partner-sdk 0.2.1 → 0.2.2
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/README.md +283 -0
- package/dist/index.d.mts +126 -2
- package/dist/index.d.ts +126 -2
- package/dist/index.js +204 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +204 -21
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/schema/partner.graphql +88 -0
package/README.md
CHANGED
|
@@ -64,6 +64,31 @@ Get your partner API token from the ITM backstage dashboard: **Settings > Partne
|
|
|
64
64
|
|
|
65
65
|
The token is sent as the `x-partner-api-key` header on every request. Your brand is determined automatically from the token — no need to pass brand IDs.
|
|
66
66
|
|
|
67
|
+
Keep the partner token on your server. Do not expose it from browser code or client-side mobile code.
|
|
68
|
+
|
|
69
|
+
For request-scoped mutations such as partner brand subscriptions, create the client inside the incoming request and forward `x-forwarded-for` and `user-agent` so the backend can enrich compliance metadata when those fields are omitted from `input.compliance`.
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
import { createITMPartnerClient } from '@itm-studio/partner-sdk';
|
|
73
|
+
|
|
74
|
+
export function createITMClientForRequest(request: Request) {
|
|
75
|
+
return createITMPartnerClient({
|
|
76
|
+
token: process.env.ITM_PARTNER_TOKEN!,
|
|
77
|
+
headers: () => {
|
|
78
|
+
const forwardedFor = request.headers.get('x-forwarded-for');
|
|
79
|
+
const userAgent = request.headers.get('user-agent');
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
...(forwardedFor ? { 'x-forwarded-for': forwardedFor } : {}),
|
|
83
|
+
...(userAgent ? { 'user-agent': userAgent } : {}),
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
If you also send `input.compliance`, the backend keeps the values you provide and backfills missing `ipAddress` and `userAgent` from the forwarded headers when available.
|
|
91
|
+
|
|
67
92
|
## Available Queries
|
|
68
93
|
|
|
69
94
|
### `getPartnerMomentsForBrand`
|
|
@@ -114,6 +139,29 @@ const { getPartnerMoment } = await itm.query({
|
|
|
114
139
|
});
|
|
115
140
|
```
|
|
116
141
|
|
|
142
|
+
### `getMomentStats`
|
|
143
|
+
|
|
144
|
+
Get cached partner-facing counts for a moment owned by the authenticated partner's brand.
|
|
145
|
+
|
|
146
|
+
- `ticketsCount` counts confirmed tickets only.
|
|
147
|
+
- `waitlistCount` counts active waitlist entries.
|
|
148
|
+
- `externalRsvpCount` counts external RSVPs.
|
|
149
|
+
- `ticketRsvpRequestsCount` counts ticket RSVP requests.
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
const { getMomentStats } = await itm.query({
|
|
153
|
+
getMomentStats: {
|
|
154
|
+
__args: { momentSlug: 'my-event-slug' },
|
|
155
|
+
ticketsCount: true,
|
|
156
|
+
waitlistCount: true,
|
|
157
|
+
externalRsvpCount: true,
|
|
158
|
+
ticketRsvpRequestsCount: true,
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
> **Note:** `getMomentStats` returns `null` if the moment does not exist or is not owned by the authenticated partner's brand.
|
|
164
|
+
|
|
117
165
|
### `getPartnerTicketsForMoment`
|
|
118
166
|
|
|
119
167
|
Get paginated tickets for a moment.
|
|
@@ -295,6 +343,241 @@ const { getPartnerPublicEchoes } = await itm.query({
|
|
|
295
343
|
|
|
296
344
|
The SDK supports write operations via `client.mutation()`. All mutations use the same authentication — your brand is determined from the token.
|
|
297
345
|
|
|
346
|
+
## Partner Brand Subscription Guide
|
|
347
|
+
|
|
348
|
+
The partner brand subscription API supports two integration modes:
|
|
349
|
+
|
|
350
|
+
- Direct subscribe: create the subscription immediately in one mutation.
|
|
351
|
+
- OTP subscribe: send an SMS code first, then confirm with a second mutation.
|
|
352
|
+
|
|
353
|
+
Use direct subscribe when your product already has the right consent flow and you do not need to prove possession of the phone number in real time.
|
|
354
|
+
|
|
355
|
+
Use OTP subscribe when you want the user to confirm the phone number before the brand subscription is created.
|
|
356
|
+
|
|
357
|
+
### Flow Summary
|
|
358
|
+
|
|
359
|
+
| Mode | First mutation | First response | Second mutation |
|
|
360
|
+
|---|---|---|---|
|
|
361
|
+
| Direct | `createPartnerBrandSubscription` with `requireOtpVerification: false` or omitted | `verificationRequired: false` and `subscription` populated | None |
|
|
362
|
+
| OTP | `createPartnerBrandSubscription` with `requireOtpVerification: true` | `verificationRequired: true`, `verificationToken`, `subscription: null` | `verifyPartnerBrandSubscription` |
|
|
363
|
+
|
|
364
|
+
### Input Behavior
|
|
365
|
+
|
|
366
|
+
- `phoneNumber`: send an E.164 phone number such as `+14155551234`.
|
|
367
|
+
- `fullName`: optional, but if you send it, include both first and last name.
|
|
368
|
+
- `email`: optional and attached to the subscribed user if provided.
|
|
369
|
+
- `listNames`: optional brand list names. Missing lists are created automatically and the subscribed user is attached to them.
|
|
370
|
+
- `compliance`: optional metadata about how consent was collected. This is the right place for fields like `pageUrl`, `submissionMethod`, `submittedAt`, `timezone`, and geo/browser/device details.
|
|
371
|
+
- `compliance.ipAddress` and `compliance.userAgent`: optional. If you omit them and forward `x-forwarded-for` and `user-agent`, the backend backfills those values for you.
|
|
372
|
+
|
|
373
|
+
### OTP Flow Step By Step
|
|
374
|
+
|
|
375
|
+
1. Call `createPartnerBrandSubscription` with `requireOtpVerification: true`.
|
|
376
|
+
2. Store the returned `verificationToken` in the user session or another short-lived server-side state container associated with the current signup attempt.
|
|
377
|
+
3. Collect the SMS code from the user.
|
|
378
|
+
4. Call `verifyPartnerBrandSubscription` with that `verificationToken` and `code`.
|
|
379
|
+
|
|
380
|
+
`verificationToken` is brand-scoped. A token created under one partner token cannot be verified by another brand's partner token.
|
|
381
|
+
|
|
382
|
+
If the verification token is invalid or expired, verification fails and the subscription is not created.
|
|
383
|
+
|
|
384
|
+
### `createPartnerBrandSubscription`
|
|
385
|
+
|
|
386
|
+
Subscribe a phone number to the authenticated partner brand.
|
|
387
|
+
|
|
388
|
+
- Omit `requireOtpVerification` or set it to `false` to create the subscription immediately.
|
|
389
|
+
- Set `requireOtpVerification: true` to start the OTP flow. The backend sends the code to the provided phone number and returns a `verificationToken`.
|
|
390
|
+
- If you pass `fullName`, include both first and last name.
|
|
391
|
+
|
|
392
|
+
```typescript
|
|
393
|
+
const { createPartnerBrandSubscription } = await itm.mutation({
|
|
394
|
+
createPartnerBrandSubscription: {
|
|
395
|
+
__args: {
|
|
396
|
+
input: {
|
|
397
|
+
phoneNumber: '+14155550111',
|
|
398
|
+
fullName: 'Jane Doe',
|
|
399
|
+
email: 'jane@example.com',
|
|
400
|
+
listNames: ['VIP', 'Newsletter'],
|
|
401
|
+
compliance: {
|
|
402
|
+
pageUrl: 'https://example.com/signup',
|
|
403
|
+
submissionMethod: 'partner_sdk',
|
|
404
|
+
},
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
verificationRequired: true,
|
|
408
|
+
verificationToken: true,
|
|
409
|
+
subscription: {
|
|
410
|
+
uid: true,
|
|
411
|
+
isActive: true,
|
|
412
|
+
subscribedAt: true,
|
|
413
|
+
},
|
|
414
|
+
},
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
if (!createPartnerBrandSubscription.verificationRequired) {
|
|
418
|
+
console.log(createPartnerBrandSubscription.subscription?.uid);
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
When `verificationRequired` is `false`, `subscription` is populated and `verificationToken` is `null`.
|
|
423
|
+
|
|
424
|
+
This is the recommended mode when:
|
|
425
|
+
|
|
426
|
+
- You are subscribing from an already-authenticated server flow.
|
|
427
|
+
- You already have consent and do not need phone possession verification.
|
|
428
|
+
- You want a single network round trip.
|
|
429
|
+
|
|
430
|
+
### `verifyPartnerBrandSubscription`
|
|
431
|
+
|
|
432
|
+
Complete a subscription created with `requireOtpVerification: true`.
|
|
433
|
+
|
|
434
|
+
```typescript
|
|
435
|
+
const { createPartnerBrandSubscription } = await itm.mutation({
|
|
436
|
+
createPartnerBrandSubscription: {
|
|
437
|
+
__args: {
|
|
438
|
+
input: {
|
|
439
|
+
phoneNumber: '+14155550112',
|
|
440
|
+
requireOtpVerification: true,
|
|
441
|
+
fullName: 'Otp User',
|
|
442
|
+
compliance: {
|
|
443
|
+
pageUrl: 'https://example.com/otp-signup',
|
|
444
|
+
submissionMethod: 'partner_sdk',
|
|
445
|
+
},
|
|
446
|
+
},
|
|
447
|
+
},
|
|
448
|
+
verificationRequired: true,
|
|
449
|
+
verificationToken: true,
|
|
450
|
+
},
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
if (!createPartnerBrandSubscription.verificationToken) {
|
|
454
|
+
throw new Error('Expected OTP verification to be required');
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Collect the SMS code from the user in your UI or API flow.
|
|
458
|
+
const code = '123456';
|
|
459
|
+
|
|
460
|
+
const { verifyPartnerBrandSubscription } = await itm.mutation({
|
|
461
|
+
verifyPartnerBrandSubscription: {
|
|
462
|
+
__args: {
|
|
463
|
+
input: {
|
|
464
|
+
verificationToken:
|
|
465
|
+
createPartnerBrandSubscription.verificationToken,
|
|
466
|
+
code,
|
|
467
|
+
},
|
|
468
|
+
},
|
|
469
|
+
uid: true,
|
|
470
|
+
isActive: true,
|
|
471
|
+
subscribedAt: true,
|
|
472
|
+
},
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
console.log(verifyPartnerBrandSubscription.uid);
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
When OTP is required, `createPartnerBrandSubscription` returns `verificationRequired: true`, `subscription: null`, and a non-null `verificationToken`. Pass that token into `verifyPartnerBrandSubscription` together with the one-time code sent to the phone number.
|
|
479
|
+
|
|
480
|
+
This is the recommended mode when:
|
|
481
|
+
|
|
482
|
+
- The subscription starts from a public signup form.
|
|
483
|
+
- You want to prove the user controls the submitted phone number.
|
|
484
|
+
- Your compliance flow requires explicit OTP confirmation before the subscription is created.
|
|
485
|
+
|
|
486
|
+
### Full OTP Example
|
|
487
|
+
|
|
488
|
+
This is the full two-step flow most integrators will want to implement from a server route or server action.
|
|
489
|
+
|
|
490
|
+
```typescript
|
|
491
|
+
import { createITMPartnerClient } from '@itm-studio/partner-sdk';
|
|
492
|
+
|
|
493
|
+
function createRequestScopedITM(request: Request) {
|
|
494
|
+
return createITMPartnerClient({
|
|
495
|
+
token: process.env.ITM_PARTNER_TOKEN!,
|
|
496
|
+
headers: () => ({
|
|
497
|
+
...(request.headers.get('x-forwarded-for')
|
|
498
|
+
? { 'x-forwarded-for': request.headers.get('x-forwarded-for')! }
|
|
499
|
+
: {}),
|
|
500
|
+
...(request.headers.get('user-agent')
|
|
501
|
+
? { 'user-agent': request.headers.get('user-agent')! }
|
|
502
|
+
: {}),
|
|
503
|
+
}),
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
export async function startOtpSubscription(request: Request) {
|
|
508
|
+
const itm = createRequestScopedITM(request);
|
|
509
|
+
|
|
510
|
+
const { createPartnerBrandSubscription } = await itm.mutation({
|
|
511
|
+
createPartnerBrandSubscription: {
|
|
512
|
+
__args: {
|
|
513
|
+
input: {
|
|
514
|
+
phoneNumber: '+14155550112',
|
|
515
|
+
requireOtpVerification: true,
|
|
516
|
+
fullName: 'Otp User',
|
|
517
|
+
email: 'otp@example.com',
|
|
518
|
+
listNames: ['Members', 'SMS'],
|
|
519
|
+
compliance: {
|
|
520
|
+
pageUrl: 'https://example.com/join',
|
|
521
|
+
submissionMethod: 'partner_sdk',
|
|
522
|
+
submittedAt: new Date().toISOString(),
|
|
523
|
+
timezone: 'America/New_York',
|
|
524
|
+
},
|
|
525
|
+
},
|
|
526
|
+
},
|
|
527
|
+
verificationRequired: true,
|
|
528
|
+
verificationToken: true,
|
|
529
|
+
subscription: {
|
|
530
|
+
uid: true,
|
|
531
|
+
},
|
|
532
|
+
},
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
if (!createPartnerBrandSubscription.verificationRequired) {
|
|
536
|
+
return {
|
|
537
|
+
status: 'subscribed',
|
|
538
|
+
subscriptionUid: createPartnerBrandSubscription.subscription?.uid ?? null,
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
return {
|
|
543
|
+
status: 'otp_required',
|
|
544
|
+
verificationToken: createPartnerBrandSubscription.verificationToken,
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
export async function finishOtpSubscription(
|
|
549
|
+
request: Request,
|
|
550
|
+
verificationToken: string,
|
|
551
|
+
code: string,
|
|
552
|
+
) {
|
|
553
|
+
const itm = createRequestScopedITM(request);
|
|
554
|
+
|
|
555
|
+
const { verifyPartnerBrandSubscription } = await itm.mutation({
|
|
556
|
+
verifyPartnerBrandSubscription: {
|
|
557
|
+
__args: {
|
|
558
|
+
input: {
|
|
559
|
+
verificationToken,
|
|
560
|
+
code,
|
|
561
|
+
},
|
|
562
|
+
},
|
|
563
|
+
uid: true,
|
|
564
|
+
isActive: true,
|
|
565
|
+
subscribedAt: true,
|
|
566
|
+
},
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
return verifyPartnerBrandSubscription;
|
|
570
|
+
}
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
### Common Integration Notes
|
|
574
|
+
|
|
575
|
+
- Create the ITM client inside the incoming request when you need compliance backfill from headers.
|
|
576
|
+
- Persist the OTP `verificationToken` only for the duration of the signup flow. Treat it as short-lived state, not a durable identifier.
|
|
577
|
+
- Do not attempt to verify an OTP token with a different partner token than the one that created it.
|
|
578
|
+
- If you are building a browser form, post to your own backend first, then have your backend call the ITM Partner SDK. Do not call the SDK directly from the browser.
|
|
579
|
+
- If you need to associate the user with CRM-style segments on subscribe, send `listNames` during the initial create call. Those lists are created on demand.
|
|
580
|
+
|
|
298
581
|
### Media Upload Flow
|
|
299
582
|
|
|
300
583
|
Uploading media (e.g. cover images) is a two-step process:
|
package/dist/index.d.mts
CHANGED
|
@@ -162,6 +162,13 @@ interface PartnerCustomer {
|
|
|
162
162
|
tickets: Ticket[];
|
|
163
163
|
__typename: 'PartnerCustomer';
|
|
164
164
|
}
|
|
165
|
+
interface PartnerMomentStats {
|
|
166
|
+
ticketsCount: Scalars['Int'];
|
|
167
|
+
waitlistCount: Scalars['Int'];
|
|
168
|
+
externalRsvpCount: Scalars['Int'];
|
|
169
|
+
ticketRsvpRequestsCount: Scalars['Int'];
|
|
170
|
+
__typename: 'PartnerMomentStats';
|
|
171
|
+
}
|
|
165
172
|
interface MomentCollectionLink {
|
|
166
173
|
uid: Scalars['ID'];
|
|
167
174
|
url: Scalars['String'];
|
|
@@ -260,11 +267,24 @@ interface GetBrandEchoesForUserResponse {
|
|
|
260
267
|
nextCursor: (Scalars['String'] | null);
|
|
261
268
|
__typename: 'GetBrandEchoesForUserResponse';
|
|
262
269
|
}
|
|
270
|
+
interface BrandSubscription {
|
|
271
|
+
uid: Scalars['ID'];
|
|
272
|
+
isActive: Scalars['Boolean'];
|
|
273
|
+
subscribedAt: Scalars['DateTime'];
|
|
274
|
+
createdAt: Scalars['DateTime'];
|
|
275
|
+
updatedAt: Scalars['DateTime'];
|
|
276
|
+
__typename: 'BrandSubscription';
|
|
277
|
+
}
|
|
263
278
|
interface Query {
|
|
264
279
|
/** Get paginated moments for the brand associated with the partner token. */
|
|
265
280
|
getPartnerMomentsForBrand: GetPublicMomentsResponse;
|
|
266
281
|
/** Get a single moment by slug. */
|
|
267
282
|
getPartnerMoment: (Moment | null);
|
|
283
|
+
/**
|
|
284
|
+
* Get cached partner-facing counts for a moment.
|
|
285
|
+
* Only returns stats for moments owned by the authenticated partner's brand.
|
|
286
|
+
*/
|
|
287
|
+
getPartnerMomentStats: (PartnerMomentStats | null);
|
|
268
288
|
/** Get paginated tickets for a moment. */
|
|
269
289
|
getPartnerTicketsForMoment: GetTicketsResponse;
|
|
270
290
|
/**
|
|
@@ -315,6 +335,12 @@ interface MediaAsset {
|
|
|
315
335
|
updatedAt: Scalars['DateTime'];
|
|
316
336
|
__typename: 'MediaAsset';
|
|
317
337
|
}
|
|
338
|
+
interface CreatePartnerBrandSubscriptionResponse {
|
|
339
|
+
subscription: (BrandSubscription | null);
|
|
340
|
+
verificationRequired: Scalars['Boolean'];
|
|
341
|
+
verificationToken: (Scalars['String'] | null);
|
|
342
|
+
__typename: 'CreatePartnerBrandSubscriptionResponse';
|
|
343
|
+
}
|
|
318
344
|
interface Mutation {
|
|
319
345
|
/**
|
|
320
346
|
* Get a presigned S3 URL for direct file upload.
|
|
@@ -326,11 +352,18 @@ interface Mutation {
|
|
|
326
352
|
* Call after uploading to S3 via the presigned URL from getPartnerUploadUrl.
|
|
327
353
|
*/
|
|
328
354
|
createPartnerMediaAsset: MediaAsset;
|
|
355
|
+
/**
|
|
356
|
+
* Subscribe a user to the authenticated partner brand.
|
|
357
|
+
* Set requireOtpVerification to true to start a two-step OTP flow.
|
|
358
|
+
*/
|
|
359
|
+
createPartnerBrandSubscription: CreatePartnerBrandSubscriptionResponse;
|
|
329
360
|
/**
|
|
330
361
|
* Create a moment with optional venue and ticket tiers in one atomic operation.
|
|
331
362
|
* When type is IRL, the venue field is required.
|
|
332
363
|
*/
|
|
333
364
|
createPartnerMoment: Moment;
|
|
365
|
+
/** Complete a partner brand subscription that was created with requireOtpVerification=true. */
|
|
366
|
+
verifyPartnerBrandSubscription: BrandSubscription;
|
|
334
367
|
__typename: 'Mutation';
|
|
335
368
|
}
|
|
336
369
|
interface CurrencyGenqlSelection {
|
|
@@ -484,6 +517,14 @@ interface PartnerCustomerGenqlSelection {
|
|
|
484
517
|
__typename?: boolean | number;
|
|
485
518
|
__scalar?: boolean | number;
|
|
486
519
|
}
|
|
520
|
+
interface PartnerMomentStatsGenqlSelection {
|
|
521
|
+
ticketsCount?: boolean | number;
|
|
522
|
+
waitlistCount?: boolean | number;
|
|
523
|
+
externalRsvpCount?: boolean | number;
|
|
524
|
+
ticketRsvpRequestsCount?: boolean | number;
|
|
525
|
+
__typename?: boolean | number;
|
|
526
|
+
__scalar?: boolean | number;
|
|
527
|
+
}
|
|
487
528
|
interface MomentCollectionLinkGenqlSelection {
|
|
488
529
|
uid?: boolean | number;
|
|
489
530
|
url?: boolean | number;
|
|
@@ -595,6 +636,15 @@ interface GetBrandEchoesForUserResponseGenqlSelection {
|
|
|
595
636
|
__typename?: boolean | number;
|
|
596
637
|
__scalar?: boolean | number;
|
|
597
638
|
}
|
|
639
|
+
interface BrandSubscriptionGenqlSelection {
|
|
640
|
+
uid?: boolean | number;
|
|
641
|
+
isActive?: boolean | number;
|
|
642
|
+
subscribedAt?: boolean | number;
|
|
643
|
+
createdAt?: boolean | number;
|
|
644
|
+
updatedAt?: boolean | number;
|
|
645
|
+
__typename?: boolean | number;
|
|
646
|
+
__scalar?: boolean | number;
|
|
647
|
+
}
|
|
598
648
|
interface QueryGenqlSelection {
|
|
599
649
|
/** Get paginated moments for the brand associated with the partner token. */
|
|
600
650
|
getPartnerMomentsForBrand?: (GetPublicMomentsResponseGenqlSelection & {
|
|
@@ -613,6 +663,15 @@ interface QueryGenqlSelection {
|
|
|
613
663
|
slug: Scalars['String'];
|
|
614
664
|
};
|
|
615
665
|
});
|
|
666
|
+
/**
|
|
667
|
+
* Get cached partner-facing counts for a moment.
|
|
668
|
+
* Only returns stats for moments owned by the authenticated partner's brand.
|
|
669
|
+
*/
|
|
670
|
+
getPartnerMomentStats?: (PartnerMomentStatsGenqlSelection & {
|
|
671
|
+
__args: {
|
|
672
|
+
momentSlug: Scalars['String'];
|
|
673
|
+
};
|
|
674
|
+
});
|
|
616
675
|
/** Get paginated tickets for a moment. */
|
|
617
676
|
getPartnerTicketsForMoment?: (GetTicketsResponseGenqlSelection & {
|
|
618
677
|
__args: {
|
|
@@ -713,6 +772,44 @@ interface CreatePartnerMomentInput {
|
|
|
713
772
|
/** Ticket tiers to create along with the moment. */
|
|
714
773
|
ticketTiers?: (CreatePartnerTicketTierInput[] | null);
|
|
715
774
|
}
|
|
775
|
+
interface SubscriptionComplianceInput {
|
|
776
|
+
browserName?: (Scalars['String'] | null);
|
|
777
|
+
browserVersion?: (Scalars['String'] | null);
|
|
778
|
+
deviceType?: (Scalars['String'] | null);
|
|
779
|
+
geoAccuracy?: (Scalars['Float'] | null);
|
|
780
|
+
geoCity?: (Scalars['String'] | null);
|
|
781
|
+
geoCountry?: (Scalars['String'] | null);
|
|
782
|
+
geoLatitude?: (Scalars['Float'] | null);
|
|
783
|
+
geoLongitude?: (Scalars['Float'] | null);
|
|
784
|
+
geoRegion?: (Scalars['String'] | null);
|
|
785
|
+
ipAddress?: (Scalars['String'] | null);
|
|
786
|
+
language?: (Scalars['String'] | null);
|
|
787
|
+
osName?: (Scalars['String'] | null);
|
|
788
|
+
osVersion?: (Scalars['String'] | null);
|
|
789
|
+
pageUrl?: (Scalars['String'] | null);
|
|
790
|
+
referrerUrl?: (Scalars['String'] | null);
|
|
791
|
+
screenHeight?: (Scalars['Int'] | null);
|
|
792
|
+
screenWidth?: (Scalars['Int'] | null);
|
|
793
|
+
submissionMethod?: (Scalars['String'] | null);
|
|
794
|
+
submittedAt?: (Scalars['DateTime'] | null);
|
|
795
|
+
timezone?: (Scalars['String'] | null);
|
|
796
|
+
userAgent?: (Scalars['String'] | null);
|
|
797
|
+
}
|
|
798
|
+
interface CreatePartnerBrandSubscriptionInput {
|
|
799
|
+
compliance?: (SubscriptionComplianceInput | null);
|
|
800
|
+
email?: (Scalars['String'] | null);
|
|
801
|
+
/** Optional full name. If provided, include first and last name. */
|
|
802
|
+
fullName?: (Scalars['String'] | null);
|
|
803
|
+
/** Optional brand list names to attach the subscribed user to. Missing lists are created automatically. */
|
|
804
|
+
listNames?: (Scalars['String'][] | null);
|
|
805
|
+
/** E.164 phone number (for example +14155551234) */
|
|
806
|
+
phoneNumber: Scalars['String'];
|
|
807
|
+
requireOtpVerification?: (Scalars['Boolean'] | null);
|
|
808
|
+
}
|
|
809
|
+
interface VerifyPartnerBrandSubscriptionInput {
|
|
810
|
+
code: Scalars['String'];
|
|
811
|
+
verificationToken: Scalars['String'];
|
|
812
|
+
}
|
|
716
813
|
/**
|
|
717
814
|
* A presigned S3 upload URL and the generated filename.
|
|
718
815
|
* Returned by getPartnerUploadUrl.
|
|
@@ -745,6 +842,13 @@ interface MediaAssetGenqlSelection {
|
|
|
745
842
|
__typename?: boolean | number;
|
|
746
843
|
__scalar?: boolean | number;
|
|
747
844
|
}
|
|
845
|
+
interface CreatePartnerBrandSubscriptionResponseGenqlSelection {
|
|
846
|
+
subscription?: BrandSubscriptionGenqlSelection;
|
|
847
|
+
verificationRequired?: boolean | number;
|
|
848
|
+
verificationToken?: boolean | number;
|
|
849
|
+
__typename?: boolean | number;
|
|
850
|
+
__scalar?: boolean | number;
|
|
851
|
+
}
|
|
748
852
|
interface MutationGenqlSelection {
|
|
749
853
|
/**
|
|
750
854
|
* Get a presigned S3 URL for direct file upload.
|
|
@@ -767,6 +871,15 @@ interface MutationGenqlSelection {
|
|
|
767
871
|
dimensions: DimensionsInput;
|
|
768
872
|
};
|
|
769
873
|
});
|
|
874
|
+
/**
|
|
875
|
+
* Subscribe a user to the authenticated partner brand.
|
|
876
|
+
* Set requireOtpVerification to true to start a two-step OTP flow.
|
|
877
|
+
*/
|
|
878
|
+
createPartnerBrandSubscription?: (CreatePartnerBrandSubscriptionResponseGenqlSelection & {
|
|
879
|
+
__args: {
|
|
880
|
+
input: CreatePartnerBrandSubscriptionInput;
|
|
881
|
+
};
|
|
882
|
+
});
|
|
770
883
|
/**
|
|
771
884
|
* Create a moment with optional venue and ticket tiers in one atomic operation.
|
|
772
885
|
* When type is IRL, the venue field is required.
|
|
@@ -776,6 +889,12 @@ interface MutationGenqlSelection {
|
|
|
776
889
|
input: CreatePartnerMomentInput;
|
|
777
890
|
};
|
|
778
891
|
});
|
|
892
|
+
/** Complete a partner brand subscription that was created with requireOtpVerification=true. */
|
|
893
|
+
verifyPartnerBrandSubscription?: (BrandSubscriptionGenqlSelection & {
|
|
894
|
+
__args: {
|
|
895
|
+
input: VerifyPartnerBrandSubscriptionInput;
|
|
896
|
+
};
|
|
897
|
+
});
|
|
779
898
|
__typename?: boolean | number;
|
|
780
899
|
__scalar?: boolean | number;
|
|
781
900
|
}
|
|
@@ -838,6 +957,9 @@ declare const generateMutationOp: (fields: MutationGenqlSelection & {
|
|
|
838
957
|
* Default ITM backend production API endpoint.
|
|
839
958
|
*/
|
|
840
959
|
declare const DEFAULT_API_URL = "https://itm-backend-production.up.railway.app/graphql";
|
|
960
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
961
|
+
type ITMPartnerHeadersObject = Record<string, string>;
|
|
962
|
+
type ITMPartnerHeaders = ITMPartnerHeadersObject | (() => MaybePromise<ITMPartnerHeadersObject | undefined>);
|
|
841
963
|
interface ITMPartnerClientConfig {
|
|
842
964
|
/**
|
|
843
965
|
* Partner API token (from backstage: Settings > Partner API).
|
|
@@ -851,8 +973,10 @@ interface ITMPartnerClientConfig {
|
|
|
851
973
|
baseUrl?: string;
|
|
852
974
|
/**
|
|
853
975
|
* Additional headers to include on every request.
|
|
976
|
+
* A function is useful for request-scoped values like `x-forwarded-for`
|
|
977
|
+
* and `user-agent` when proxying end-user traffic through your server.
|
|
854
978
|
*/
|
|
855
|
-
headers?:
|
|
979
|
+
headers?: ITMPartnerHeaders;
|
|
856
980
|
}
|
|
857
981
|
type ITMPartnerClient = Client;
|
|
858
982
|
/**
|
|
@@ -885,4 +1009,4 @@ type ITMPartnerClient = Client;
|
|
|
885
1009
|
*/
|
|
886
1010
|
declare function createITMPartnerClient(config: ITMPartnerClientConfig): ITMPartnerClient;
|
|
887
1011
|
|
|
888
|
-
export { type CreatePartnerMomentInput, type CreatePartnerTicketTierInput, type Currency, DEFAULT_API_URL, type Dimensions, type DimensionsInput, type Echo, type EchoMediaAsset, type EchoType, type GetBrandEchoesForUserResponse, type GetPartnerCustomersResponse, type GetPublicMomentsResponse, type GetTicketsResponse, type ITMPartnerClient, type ITMPartnerClientConfig, type MediaAsset, type MediaAssetUploadUrl, type MerchPurchase, type Moment, type MomentCategory, type MomentCollection, type MomentCollectionLink, type MomentDiscountCodeUsage, type MomentSortOrder, type MomentStatus, type MomentSubcategory, type MomentType, type Mutation, type PartnerCustomer, type Payment, type PaymentStatus, type Query, type ThirdPartyEchoType, type Ticket, type TicketExtension, type TicketExtensionStatus, type TicketTier, type User, type Venue, type VenueInput, createITMPartnerClient, everything, generateMutationOp, generateQueryOp };
|
|
1012
|
+
export { type BrandSubscription, type CreatePartnerBrandSubscriptionInput, type CreatePartnerBrandSubscriptionResponse, type CreatePartnerMomentInput, type CreatePartnerTicketTierInput, type Currency, DEFAULT_API_URL, type Dimensions, type DimensionsInput, type Echo, type EchoMediaAsset, type EchoType, type GetBrandEchoesForUserResponse, type GetPartnerCustomersResponse, type GetPublicMomentsResponse, type GetTicketsResponse, type ITMPartnerClient, type ITMPartnerClientConfig, type ITMPartnerHeaders, type ITMPartnerHeadersObject, type MediaAsset, type MediaAssetUploadUrl, type MerchPurchase, type Moment, type MomentCategory, type MomentCollection, type MomentCollectionLink, type MomentDiscountCodeUsage, type MomentSortOrder, type MomentStatus, type MomentSubcategory, type MomentType, type Mutation, type PartnerCustomer, type PartnerMomentStats, type Payment, type PaymentStatus, type Query, type SubscriptionComplianceInput, type ThirdPartyEchoType, type Ticket, type TicketExtension, type TicketExtensionStatus, type TicketTier, type User, type Venue, type VenueInput, type VerifyPartnerBrandSubscriptionInput, createITMPartnerClient, everything, generateMutationOp, generateQueryOp };
|