Files
SQL/RESTAPI/Functions/GENERATE_DBML_INLINE.sql

178 lines
6.7 KiB
SQL

SET PATH *LIBL ;
CREATE OR REPLACE FUNCTION RESTAPI.GENERATE_DBML_INLINE (
INAPPVER VARCHAR(10) ,
INAPPNAME VARCHAR(128) )
RETURNS CLOB(2147483647)
LANGUAGE SQL
SPECIFIC RESTAPI.GENERATE_DBML_INLINE
NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
DBGVIEW = *SOURCE ,
DECRESULT = (31, 31, 00) ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *OWNER ,
SRTSEQ = *HEX
BEGIN
DECLARE V_RESULT CLOB ( 2 G ) ;
WITH
-- 1) endpoints you want (one-time maintenance here)
ENDPOINTS ( APPVER , APPNAME , APPFUNC , PATH_TEMPLATE , HTTP_METHOD ,
CONSUMES , PRODUCES , SUCCESS_CODE ) AS (
VALUES ( INAPPVER , INAPPNAME , 'assignUserRoles' ,
'/sailPoint/users/mapics/{envId}/{userName}/roles/assign' ,
'POST' , '*/*' , 'application/json' , '200' ) , ( INAPPVER ,
INAPPNAME , 'changeIbmIUser' ,
'/sailPoint/users/ibmi/{authorizationName}/change' ,
'POST' , '*/*' , 'application/json' , '200' ) , ( INAPPVER ,
INAPPNAME , 'createIbmIUser' ,
'/sailPoint/users/ibmi/create' , 'POST' , '*/*' ,
'application/json' , '201' ) , ( INAPPVER , INAPPNAME ,
'createMapicsUser' ,
'/sailPoint/users/mapics/{envId}/create' , 'POST' ,
'*/*' , 'application/json' , '201' ) , ( INAPPVER ,
INAPPNAME , 'disableIbmIUser' ,
'/sailPoint/users/ibmi/{authorizationName}/disable' ,
'POST' , '*/*' , 'application/json' , '200' ) , ( INAPPVER ,
INAPPNAME , 'enableIbmIUser' ,
'/sailPoint/users/ibmi/{authorizationName}/enable' ,
'POST' , '*/*' , 'application/json' , '200' ) , ( INAPPVER ,
INAPPNAME , 'getAllAppUsers' ,
'/sailPoint/users/mapics/{envId}' , 'POST' , '*/*' ,
'application/json' , '200' ) , ( INAPPVER , INAPPNAME ,
'getAllMapicsRoles' ,
'/sailPoint/roles/mapics/{envId}' , 'POST' , '*/*' ,
'application/json' , '200' ) , ( INAPPVER , INAPPNAME ,
'getAllUsers' , '/sailPoint/users/all' , 'POST' , '*/*' ,
'application/json' , '200' ) , ( INAPPVER , INAPPNAME ,
'getAppUserInfo' ,
'/sailPoint/users/mapics/{envId}/{userName}' , 'POST' ,
'*/*' , 'application/json' , '200' ) , ( INAPPVER ,
INAPPNAME , 'getIbmIUserInfo' ,
'/sailPoint/users/ibmi/{userName}' , 'POST' , '*/*' ,
'application/json' , '200' ) , ( INAPPVER , INAPPNAME ,
'removeUserRoles' ,
'/sailPoint/users/mapics/{envId}/{userName}/roles/remove' ,
'POST' , '*/*' , 'application/json' , '200' )
) ,
-- 2) placeholders discovered in your SQL
PARAMS AS (
SELECT P . APPVER , P . APPNAME , P . APPFUNC , P . APPPARAM , P . PARAMPOS
FROM TABLE (
RESTAPI . GET_PARAM_PLACEHOLDERS (
INAPPVER , INAPPNAME , NULL )
) AS P
) ,
-- 3) nice path label renames (optional, one-time)
PARAM_RENAME ( APPFUNC , APPPARAM , RESTNAME ) AS (
VALUES ( 'assignUserRoles' , 'envid' , 'envId' ) ,
( 'assignUserRoles' , 'userName' , 'userName' ) ,
( 'removeUserRoles' , 'envid' , 'envId' ) ,
( 'removeUserRoles' , 'userName' , 'userName' ) ,
( 'createMapicsUser' , 'envid' , 'envId' ) ,
( 'getAllAppUsers' , 'environment' , 'envId' ) ,
( 'getAllMapicsRoles' , 'envid' , 'envId' ) ,
( 'getAppUserInfo' , 'environment' , 'envId' ) ,
( 'getAppUserInfo' , 'nameOrId' , 'userName' ) ,
( 'getIbmIUserInfo' , 'nameOrId' , 'userName' )
) ,
-- 4) param location + final REST name (no aggregates here)
PL AS (
SELECT P . APPVER , P . APPNAME , P . APPFUNC , P . APPPARAM , P . PARAMPOS ,
COALESCE ( R . RESTNAME , P . APPPARAM ) AS RESTNAME ,
CASE
WHEN
LOCATE (
'{' || UPPER ( COALESCE ( R . RESTNAME , P . APPPARAM ) )
|| '}' , UPPER ( E . PATH_TEMPLATE ) ) > 0
THEN 'PATH'
WHEN UPPER ( P . APPPARAM ) = 'INENVLIST' THEN 'QUERY'
ELSE 'FORM'
END AS LOCATION
FROM PARAMS P
JOIN ENDPOINTS E
ON E . APPVER = P . APPVER
AND E . APPNAME = P . APPNAME
AND E . APPFUNC = P . APPFUNC
LEFT JOIN PARAM_RENAME R
ON R . APPFUNC = P . APPFUNC
AND UPPER ( R . APPPARAM ) = UPPER ( P . APPPARAM )
) ,
-- 5) pre-aggregate the Json_Object parameter list (avoids nested aggregates)
PARAM_STR AS (
SELECT P . APPVER , P . APPNAME , P . APPFUNC ,
LISTAGG (
'''' || P . APPPARAM || ''':' || '?' , ', ' )
WITHIN GROUP ( ORDER BY P . PARAMPOS ) AS PARAMS_TXT
FROM PARAMS P
GROUP BY P . APPVER , P . APPNAME , P . APPFUNC
) ,
-- 6) pre-aggregate the <data .../> XML per program (avoids nested aggregates)
DATA_XML AS (
SELECT PL . APPVER , PL . APPNAME , PL . APPFUNC ,
XMLAGG ( XMLELEMENT ( NAME "data" ,
XMLATTRIBUTES ( '1208' AS "ccsid" , PL . APPPARAM AS "name" ,
'true' AS "nullable" , '2147483647' AS "precision" ,
CASE
WHEN PL . LOCATION = 'PATH' THEN PL . RESTNAME
END AS "restInPathParam" ,
CASE
WHEN PL . LOCATION = 'QUERY' THEN PL . RESTNAME
END AS "restInQueryParam" ,
CASE
WHEN PL . LOCATION = 'FORM' THEN PL . RESTNAME
END AS "restInFormParam" , 'CLOB' AS "type" ,
'input' AS "usage" ) ) ORDER BY PL . PARAMPOS )
AS DATA_FRAGMENT
FROM PL PL
GROUP BY PL . APPVER , PL . APPNAME , PL . APPFUNC
)
SELECT XMLSERIALIZE ( CONTENT XMLELEMENT ( NAME "dbml" , XMLATTRIBUTES (
'/v1' AS "restUriPathTemplate" , '1.0' AS "version" ) , XMLAGG (
XMLELEMENT ( NAME "program" , XMLATTRIBUTES ( '' AS "errormessage" ,
'*NONE' AS "httpheaders" , '500' AS "httpstatusonfailure" ,
E . SUCCESS_CODE AS "httpstatusonsuccess" , 'get' ||
UPPER ( SUBSTR ( E . APPFUNC , 1 , 1 ) ) || SUBSTR ( E . APPFUNC , 2 ) ||
'Input' AS "inputWrapperIdentifier" , 'get' ||
UPPER ( SUBSTR ( E . APPFUNC , 1 , 1 ) ) || SUBSTR ( E . APPFUNC , 2 ) AS
"name" , 'get' || UPPER ( SUBSTR ( E . APPFUNC , 1 , 1 ) ) ||
SUBSTR ( E . APPFUNC , 2 ) || 'Result' AS
"outputWrapperIdentifier" , 'media-resource' AS "querytype" ,
E . CONSUMES AS "restConsumes" , E . HTTP_METHOD AS
"restHttpRequestMethod" , E . PRODUCES AS "restProduces" ,
E . PATH_TEMPLATE AS "restUriPathTemplate" , '*ERRORS' AS
"returnsqlstate" , 'true' AS "treatwarningaserror" , '*TRAILING'
AS "trimmode" , 'false' AS "wrapInputParams" , 'true' AS
"wrapOutputParam" )
, XMLELEMENT ( NAME "sql" , XMLATTRIBUTES (
'Values Restapi.Execute_Sql(''' || E . APPVER || ''',''' ||
E . APPNAME || ''',''' || E . APPFUNC ||
''', Cast(Json_Object(' || COALESCE ( PS . PARAMS_TXT , '' ) ||
' ) As Varchar(10240) CCSID 37))' AS "statement" )
, DX . DATA_FRAGMENT ) ) ORDER BY E . APPFUNC ) ) AS CLOB ( 2 G ) )
INTO V_RESULT
FROM ENDPOINTS E
LEFT JOIN PARAM_STR PS
ON PS . APPVER = E . APPVER
AND PS . APPNAME = E . APPNAME
AND PS . APPFUNC = E . APPFUNC
LEFT JOIN DATA_XML DX
ON DX . APPVER = E . APPVER
AND DX . APPNAME = E . APPNAME
AND DX . APPFUNC = E . APPFUNC ;
RETURN V_RESULT ;
END ;
GRANT ALTER , EXECUTE
ON SPECIFIC FUNCTION RESTAPI.GENERATE_DBML_INLINE
TO AMAPICS WITH GRANT OPTION ;
GRANT EXECUTE
ON SPECIFIC FUNCTION RESTAPI.GENERATE_DBML_INLINE
TO PUBLIC ;