@@ -33,12 +33,36 @@ export const BillingCallbackBody = z
3333 } ) ;
3434export type BillingCallbackBody = z . infer < typeof BillingCallbackBody > ;
3535
36- export const BillingCallbackHeaders = z . object ( {
37- [ BillingProtocolHeaders . protocol ] : z . enum ( Object . values ( BillingProtocol ) ) . optional ( ) ,
38- [ BillingProtocolHeaders . requestId ] : z . string ( ) . uuid ( ) . optional ( ) ,
39- [ BillingProtocolHeaders . attribution ] : z . string ( ) . max ( 8192 ) . optional ( ) ,
40- [ BillingProtocolHeaders . accountDecision ] : z . string ( ) . max ( 2048 ) . optional ( ) ,
41- } ) ;
36+ export const BillingCallbackHeaders = z
37+ . object ( {
38+ [ BillingProtocolHeaders . protocol ] : z . enum ( Object . values ( BillingProtocol ) ) . optional ( ) ,
39+ [ BillingProtocolHeaders . requestId ] : z . string ( ) . uuid ( ) . optional ( ) ,
40+ [ BillingProtocolHeaders . attribution ] : z . string ( ) . min ( 1 ) . max ( 8192 ) . optional ( ) ,
41+ [ BillingProtocolHeaders . accountDecision ] : z . string ( ) . min ( 1 ) . max ( 2048 ) . optional ( ) ,
42+ } )
43+ . superRefine ( ( headers , context ) => {
44+ const protocol = headers [ BillingProtocolHeaders . protocol ] ;
45+ const requestId = headers [ BillingProtocolHeaders . requestId ] ;
46+ const attribution = headers [ BillingProtocolHeaders . attribution ] ;
47+ const decision = headers [ BillingProtocolHeaders . accountDecision ] ;
48+ let valid = false ;
49+ switch ( protocol ) {
50+ case undefined :
51+ valid = ! requestId && ! attribution && ! decision ;
52+ break ;
53+ case BillingProtocol . attributed :
54+ valid = Boolean ( requestId && attribution && ! decision ) ;
55+ break ;
56+ case BillingProtocol . direct :
57+ valid = Boolean ( requestId && decision && ! attribution ) ;
58+ break ;
59+ case BillingProtocol . previous :
60+ valid = Boolean ( attribution && ! requestId && ! decision ) ;
61+ break ;
62+ }
63+ if ( ! valid )
64+ context . addIssue ( { code : "custom" , message : "Incomplete or conflicting billing protocol headers" } ) ;
65+ } ) ;
4266
4367export const BillingCallbackResult = z . object ( {
4468 success : z . boolean ( ) ,
0 commit comments