11import { ExpressionType } from './ExpressionType.js' ;
2+ import { jsonExtract , jsonExtractFromRecord } from './sql_functions.js' ;
23import { ParameterValueSet , SqliteValue } from './types.js' ;
34
45export interface SqlParameterFunction {
56 readonly debugName : string ;
6- call : ( parameters : ParameterValueSet ) => SqliteValue ;
7+ call : ( parameters : ParameterValueSet , ... args : SqliteValue [ ] ) => SqliteValue ;
78 getReturnType ( ) : ExpressionType ;
9+ parameterCount : number ;
810 /** request.user_id(), request.jwt(), token_parameters.* */
911 usesAuthenticatedRequestParameters : boolean ;
1012 /** request.parameters(), user_parameters.* */
@@ -13,23 +15,83 @@ export interface SqlParameterFunction {
1315 documentation : string ;
1416}
1517
16- const request_parameters : SqlParameterFunction = {
17- debugName : 'request.parameters' ,
18- call ( parameters : ParameterValueSet ) {
19- return parameters . rawUserParameters ;
20- } ,
21- getReturnType ( ) {
22- return ExpressionType . TEXT ;
23- } ,
24- detail : 'Unauthenticated request parameters as JSON' ,
25- documentation :
26- 'Returns parameters passed by the client as a JSON string. These parameters are not authenticated - any value can be passed in by the client.' ,
27- usesAuthenticatedRequestParameters : false ,
28- usesUnauthenticatedRequestParameters : true
29- } ;
18+ /**
19+ * Defines a `parameters` function and a `parameter` function.
20+ *
21+ * The `parameters` function extracts a JSON object from the {@link ParameterValueSet} while the `parameter` function
22+ * takes a second argument (a JSON path or a single key) to extract.
23+ */
24+ export function parameterFunctions ( options : {
25+ schema : string ;
26+ extractJsonString : ( v : ParameterValueSet ) => string ;
27+ extractJsonParsed : ( v : ParameterValueSet ) => any ;
28+ sourceDescription : string ;
29+ sourceDocumentation : string ;
30+ usesAuthenticatedRequestParameters : boolean ;
31+ usesUnauthenticatedRequestParameters : boolean ;
32+ } ) {
33+ const allParameters : SqlParameterFunction = {
34+ debugName : `${ options . schema } .parameters` ,
35+ parameterCount : 0 ,
36+ call ( parameters : ParameterValueSet ) {
37+ return options . extractJsonString ( parameters ) ;
38+ } ,
39+ getReturnType ( ) {
40+ return ExpressionType . TEXT ;
41+ } ,
42+ detail : options . sourceDescription ,
43+ documentation : `Returns ${ options . sourceDocumentation } ` ,
44+ usesAuthenticatedRequestParameters : options . usesAuthenticatedRequestParameters ,
45+ usesUnauthenticatedRequestParameters : options . usesUnauthenticatedRequestParameters
46+ } ;
47+
48+ const extractParameter : SqlParameterFunction = {
49+ debugName : `${ options . schema } .parameter` ,
50+ parameterCount : 1 ,
51+ call ( parameters : ParameterValueSet , path ) {
52+ const parsed = options . extractJsonParsed ( parameters ) ;
53+ if ( typeof path == 'string' ) {
54+ if ( path . startsWith ( '$.' ) ) {
55+ return jsonExtractFromRecord ( parsed , path , '->>' ) ;
56+ } else {
57+ return parsed [ path ] ;
58+ }
59+ }
60+
61+ return null ;
62+ } ,
63+ getReturnType ( ) {
64+ return ExpressionType . ANY ;
65+ } ,
66+ detail : `Extract value from ${ options . sourceDescription } ` ,
67+ documentation : `Returns an extracted value (via the key as the second argument) from ${ options . sourceDocumentation } ` ,
68+ usesAuthenticatedRequestParameters : options . usesAuthenticatedRequestParameters ,
69+ usesUnauthenticatedRequestParameters : options . usesUnauthenticatedRequestParameters
70+ } ;
71+
72+ return { parameters : allParameters , parameter : extractParameter } ;
73+ }
74+
75+ export function globalRequestParameterFunctions ( schema : string ) {
76+ return parameterFunctions ( {
77+ schema,
78+ extractJsonString : function ( v : ParameterValueSet ) : string {
79+ return v . rawUserParameters ;
80+ } ,
81+ extractJsonParsed : function ( v : ParameterValueSet ) {
82+ return v . userParameters ;
83+ } ,
84+ sourceDescription : 'Unauthenticated request parameters as JSON' ,
85+ sourceDocumentation :
86+ 'parameters passed by the client as a JSON string. These parameters are not authenticated - any value can be passed in by the client.' ,
87+ usesAuthenticatedRequestParameters : false ,
88+ usesUnauthenticatedRequestParameters : true
89+ } ) ;
90+ }
3091
3192export const request_jwt : SqlParameterFunction = {
3293 debugName : 'request.jwt' ,
94+ parameterCount : 0 ,
3395 call ( parameters : ParameterValueSet ) {
3496 return parameters . rawTokenPayload ;
3597 } ,
@@ -44,6 +106,7 @@ export const request_jwt: SqlParameterFunction = {
44106
45107export const request_user_id : SqlParameterFunction = {
46108 debugName : 'request.user_id' ,
109+ parameterCount : 0 ,
47110 call ( parameters : ParameterValueSet ) {
48111 return parameters . userId ;
49112 } ,
@@ -56,8 +119,8 @@ export const request_user_id: SqlParameterFunction = {
56119 usesUnauthenticatedRequestParameters : false
57120} ;
58121
59- export const REQUEST_FUNCTIONS_NAMED = {
60- parameters : request_parameters ,
122+ const REQUEST_FUNCTIONS_NAMED = {
123+ ... globalRequestParameterFunctions ( 'request' ) ,
61124 jwt : request_jwt ,
62125 user_id : request_user_id
63126} ;
0 commit comments