111 subparam fixes

This commit is contained in:
msyu
2025-05-23 14:53:02 +03:00
parent 4d6f111d3d
commit d078e64cfe
2 changed files with 79 additions and 279 deletions
@@ -78,28 +78,26 @@
<!--- нужна проверка на изоляцию тенантов ---> <!--- нужна проверка на изоляцию тенантов --->
<cfquery name="local.qCheckExistence" result="local.result"> <cfquery name="local.qCheckExistence" result="local.result">
select ios.instance_operation_cfs_subparam select count(*) as cnt
from instance_operation_cfs_subparam ios from instance_operation_cfs_subparam ios
where ios.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/> where ios.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
AND ios.instance_operation_cfs_subparam=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.subparam#"/> AND ios.instance_operation_cfs_subparam=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.subparam#"/>
</cfquery> </cfquery>
<cfif local.qCheck.recordCount EQ 0> <cfif local.qCheckExistence.cnt EQ 0>
<cfreturn representationOf(this.helper.formatMessage("Not Found", "Subparameter specified does not exist")).withStatus(404)/> <cfreturn representationOf(this.helper.formatMessage("Not Found", "Subparameter specified does not exist")).withStatus(404)/>
</cfif> </cfif>
<cfquery name="local.qCheckAccess" result="local.result"> <cfquery name="local.qCheckAccess" result="local.result">
select iop.instance_operation_cfs_subparam select count(*) as cnt
from instance_operation_cfs_subparam ios from instance_operation_cfs_param iop
join instance_operation_cfs_param iop on (ios.instance_operation_cfs_param_uid=iop.instance_operation_cfs_param_uid)
join instance_operation io on (iop.instance_operation_uid=io.instance_operation_uid) join instance_operation io on (iop.instance_operation_uid=io.instance_operation_uid)
join instance e on (io.instance_uid=e.instance_uid) join instance e on (io.instance_uid=e.instance_uid)
join specification_item si on (e.specification_item_id=si.specification_item_id) join specification_item si on (e.specification_item_id=si.specification_item_id)
where ios.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/> where iop.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
AND ios.instance_operation_cfs_subparam=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.subparam#"/>
AND si.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/> AND si.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/>
</cfquery> </cfquery>
<cfif local.qCheckAccess.recordCount EQ 0> <cfif local.qCheckAccess.cnt EQ 0>
<cfreturn representationOf(this.helper.formatMessage("Not Accessible", "Subparameter specified is not accessible by the current user")).withStatus(403)/> <cfreturn representationOf(this.helper.formatMessage("Not Accessible", "CFS parameter specified is not accessible by the current user")).withStatus(403)/>
</cfif> </cfif>
<cfquery name="local.qSave"> <cfquery name="local.qSave">
@@ -120,12 +118,12 @@
<cffunction name="put" hint="запись метаданных субпараметра CFS-параметра операции инстанса"> <cffunction name="put" hint="запись метаданных субпараметра CFS-параметра операции инстанса">
<cfargument name="instanceOperationCfsParamUid" type="string" required=true hint="type:guid"/> <cfargument name="instanceOperationCfsParamUid" type="string" required=true hint="type:guid"/>
<cfargument name="subparam" type="string" required=true hint="type:string"/> <cfargument name="subparam" type="string" required=true hint="type:string"/>
<cfargument name="isSensitive" type="boolean" required=false default=false hint="type:boolean"/>
<cfargument name="isSensitive" type="boolean" required=true/>
<cfargument name="note" type="string" required=false default=""/> <!--- *** XSS!!! ---> <cfargument name="note" type="string" required=false default=""/> <!--- *** XSS!!! --->
<cftry> <cftry>
<cfset this.helper.validateField(arguments, "instanceOperationCfsParamUid", "guid")/> <cfset this.helper.validateField(arguments, "instanceOperationCfsParamUid", "guid")/>
<cfset this.helper.validateField(arguments, "isSensitive", "boolean")/>
<!--- *** Нужна проверка, что операция не была выполнена, иначе она становится архивной ---> <!--- *** Нужна проверка, что операция не была выполнена, иначе она становится архивной --->
<cfcatch type="invalidParamValue"> <cfcatch type="invalidParamValue">
@@ -135,29 +133,27 @@
<cfset var local={}/> <cfset var local={}/>
<cfquery name="local.qCheckExistence" result="local.result">
select iop.instance_operation_cfs_subparam
from instance_operation_cfs_subparam iop
where iop.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
AND iop.instance_operation_cfs_subparam=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.subparam#"/>
</cfquery>
<cfif local.qCheck.recordCount EQ 0>
<cfreturn representationOf(this.helper.formatMessage("Not Found", "Subparameter specified does not exist")).withStatus(404)/>
</cfif>
<cfquery name="local.qCheckAccess" result="local.result"> <cfquery name="local.qCheckAccess" result="local.result">
select iop.instance_operation_cfs_subparam select count(*) as cnt
from instance_operation_cfs_subparam ios from instance_operation_cfs_param iop
join instance_operation_cfs_param iop on (ios.instance_operation_cfs_param_uid=iop.instance_operation_cfs_param_uid)
join instance_operation io on (iop.instance_operation_uid=io.instance_operation_uid) join instance_operation io on (iop.instance_operation_uid=io.instance_operation_uid)
join instance e on (io.instance_uid=e.instance_uid) join instance e on (io.instance_uid=e.instance_uid)
join specification_item si on (e.specification_item_id=si.specification_item_id) join specification_item si on (e.specification_item_id=si.specification_item_id)
where iop.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/> where iop.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
AND iop.instance_operation_cfs_subparam=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.subparam#"/>
AND si.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/> AND si.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/>
</cfquery> </cfquery>
<cfif local.qCheckAccess.recordCount EQ 0> <cfif local.qCheckAccess.cnt EQ 0>
<cfreturn representationOf(this.helper.formatMessage("Not Accessible", "Subparameter specified is not accessible by the current user")).withStatus(403)/> <cfreturn representationOf(this.helper.formatMessage("Not Accessible", "Instance CFS parameter not found or access denied")).withStatus(404)/>
</cfif>
<cfquery name="local.qCheckExistence" result="local.result">
select count(*) as cnt
from instance_operation_cfs_subparam iop
where iop.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
AND iop.instance_operation_cfs_subparam=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.subparam#"/>
</cfquery>
<cfif local.qCheckExistence.cnt EQ 0>
<cfreturn representationOf(this.helper.formatMessage("Not Found", "Subparameter specified does not exist")).withStatus(404)/>
</cfif> </cfif>
<cfquery name="local.qSave" result="local.result"> <cfquery name="local.qSave" result="local.result">
@@ -167,7 +163,7 @@
,is_sensitive=<cfqueryparam cfsqltype="cf_sql_bit" value="#arguments.isSensitive#" /> ,is_sensitive=<cfqueryparam cfsqltype="cf_sql_bit" value="#arguments.isSensitive#" />
,note=<cfqueryparam cfsqltype="cf_sql_varchar" value="#htmlEditFormat(arguments.note)#" /> <!--- *** XSS!!! ---> ,note=<cfqueryparam cfsqltype="cf_sql_varchar" value="#htmlEditFormat(arguments.note)#" /> <!--- *** XSS!!! --->
where instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/> where instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
AND iop.instance_operation_cfs_subparam=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.subparam#"/> AND instance_operation_cfs_subparam=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.subparam#"/>
</cfquery> </cfquery>
<!--- *** проверить существование - 404 ---> <!--- *** проверить существование - 404 --->
<cfreturn noData().withStatus(204, "No Content") /> <cfreturn noData().withStatus(204, "No Content") />
@@ -8,12 +8,21 @@
</cfsilent> </cfsilent>
<cffunction name="post" hint="CFS параметр операции инстанса"> <cffunction name="post" hint="создание метаданных субпараметра CFS параметра операции инстанса">
<cfargument name="instanceOperationCfsParamUid" type="string" required=true hint="type:guid"/> <cfargument name="instanceOperationCfsParamUid" type="string" required=true hint="type:guid"/>
<cfargument name="subparam" type="string" required=true hint="type:string"/> <cfargument name="subparam" type="string" required=true hint="type:string"/>
<cfargument name="isSensitive" type="boolean" required=false default=false hint="type:boolean"/>
<cfargument name="note" type="string" required=false default="" hint="type:string"/>
<!--- arguments.specificationId injected implicitly ---> <!--- arguments.specificationId injected implicitly --->
<!--- <cfargument name="instanceOperationCfsParamUid" type="string" required=true hint="type:guid"/>
<cfargument name="subparam" type="string" required=true hint="type:string"/>
<cfargument name="isSensitive" type="boolean" required=true/>
<cfargument name="note" type="string" required=false default=""/> --->
<cftry> <cftry>
<cfset this.helper.validateField(arguments, "instanceOperationCfsParamUid", "guid")/> <cfset this.helper.validateField(arguments, "instanceOperationCfsParamUid", "guid")/>
<cfset this.helper.validateField(arguments, "isSensitive", "boolean")/>
<cfcatch type="invalidParamValue"> <cfcatch type="invalidParamValue">
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/> <cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
</cfcatch> </cfcatch>
@@ -21,260 +30,55 @@
<cfset local={}/> <cfset local={}/>
<cfquery name="local.qCheckDup" result="local.result">
select instance_operation_cfs_subparam from
from instance_operation_cfs_subparam s
where iop.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
AND si.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/>
</cfquery>
<cfquery name="local.qCheckAccess" result="local.result"> <cfquery name="local.qCheckAccess" result="local.result">
select count(*) as cnt select count(*) as cnt
from instance_operation_cfs_param iop from instance_operation_cfs_param iop
join instance_operation io on (iop.instance_operation_uid=io.instance_operation_uid)
join instance e on (io.instance_uid=e.instance_uid)
join specification_item si on (e.specification_item_id=si.specification_item_id)
where iop.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/> where iop.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
AND si.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/> AND si.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/>
</cfquery> </cfquery>
<cfif local.qCheckAccess.cnt EQ 0>
<cfif local.qCfsParam.recordCount EQ 0> <cfreturn representationOf(this.helper.formatMessage("Instance CFS parameter not found or access denied")).withStatus(404)/>
<cfreturn representationOf(this.helper.formatMessage("Not Found")).withStatus(404)/>
</cfif> </cfif>
<cfif len(local.qCfsParam.func)><!--- приоритет отдается функции перед списком значений---> <cfquery name="local.qCheckDuplicates" result="local.result">
<cfset var args = { select count(*) as cnt
"functionName":"#func#", from instance_operation_cfs_subparam ios
"svcId":#local.qInstanceOperation.service_id#, where ios.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
"contractId":#arguments.contractId# AND ios.instance_operation_cfs_subparam=<cfqueryparam cfsqltype="cf_sql_varchar" value=#arguments.subparam#/>
}/> <!--- если появятся новые аргументы у новых функций, будем добавлять их сюда ---> </cfquery>
<cfset local.qCfsParam.value_list=generateValueList(argumentCollection=#args#)/> <!--- можно перечислить именованные аргументы обычным порядком, но с коллекцией потенциально более гибко ---> <cfif local.qCheckDuplicates.cnt GT 0>
<!--- <cfdump var=#local.qCfsParam#/><cfabort/> ---> <cfreturn representationOf(this.helper.formatMessage("Subparameter already exists")).withStatus(400)/>
<cfif len(trim(local.qCfsParam.value_list)) AND listLen(local.qCfsParam.value_list) EQ 1>
<cfset local.qCfsParam.default_value=local.qCfsParam.value_list/>
</cfif>
</cfif> </cfif>
<cfif local.qCfsParam.data_type EQ "map"> <cfquery name="local.qSave" result="local.result">
insert into instance_operation_cfs_subparam
(instance_operation_cfs_param_uid, instance_operation_cfs_subparam, is_sensitive, note, dt_created, creator_id, dt_updated, updater_id)
values
(
<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" />
,<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.subparam#" />
,<cfqueryparam cfsqltype="cf_sql_bit" value="#arguments.isSensitive#" />
,<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.note#" />
,<cfqueryparam cfsqltype="cf_sql_timestamp" value="#Now()#" />
,<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.usrId#" />
,<cfqueryparam cfsqltype="cf_sql_timestamp" value="#Now()#" />
,<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.usrId#" />
);
</cfquery>
<!--- <cfif local.qCfsParam.data_type EQ "map">
<cfset processMap(local.qCfsParam)/><!--- query passed by reference ---> <cfset processMap(local.qCfsParam)/><!--- query passed by reference --->
</cfif> </cfif> --->
<cfset var out=structNew("linked")/> <cfreturn noData()
<cfset "out.queryDurationMs"=getTickCount() - request.startTickCount/> .withStatus(201, "Created")
/>
<cfset "out.instanceOperationCfsParam" = this.helper.appendRecord(
structNew("linked"), "", local.titleMap, local.qCfsParam, this.helper.snake2camel
)/>
<cfset "out.runDurationMs"=getTickCount() - request.startTickCount/>
<cfreturn representationOf(out) />
</cffunction><!--- get ---> </cffunction><!--- get --->
<cffunction name="delete" hint="Удаление CFS параметра операции по ключу.">
<cfargument name="instanceOperationCfsParamUid" type="string" required=true hint="type:guid"/>
<cftry>
<cfset this.helper.validateField(arguments, "instanceOperationCfsParamUid", "guid")/>
<!--- *** Нужна проверка, что операция не была выполнена, иначе она становится архивной --->
<cfcatch type="invalidParamValue">
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
</cfcatch>
</cftry>
<cfset local={}/>
<cftry><!--- *** без проверок существования --->
<cfquery name="local.qCheck" result="local.result">
select
io.dt_submit, io.submit_result
from instance_operation_cfs_param iop
join instance_operation io on iop.instance_operation_uid=io.instance_operation_uid
where iop.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
</cfquery>
<cfif left(local.qCheck.submit_result,1) EQ "2"><!--- 201 etc --->
<cfreturn representationOf(this.helper.formatMessage("Operation already started", "Parameter deletion disabled for started operation")).withStatus(422)/>
</cfif>
<cfquery name="local.qSave">
delete from instance_operation_cfs_param
where instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
</cfquery>
<cfcatch type="any">
<cfreturn representationOf(this.helper.formatException(cfcatch, "Internal Error")).withStatus(500)/><!--- это не нужно показывать в продуктиве --->
</cfcatch>
</cftry>
<cfreturn noData().withStatus(204, "No Content") />
</cffunction><!--- delete --->
<cffunction name="put" hint="запись CFS параметра операции инстанса">
<cfargument name="instanceOperationCfsParamUid" type="string" required=true hint="type:guid"/>
<cfargument name="paramValue" type="string" required=true/>
<cfargument name="note" type="string" required=false default=""/>
<cfset var local={}/>
<cftry>
<cfset checkInstanceParam(arguments.instanceOperationCfsParamUid,arguments.paramValue)/>
<cfcatch type="invalidParamValue">
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
</cfcatch>
</cftry>
<cfquery name="local.qSave" result="local.result">
update instance_operation_cfs_param set
dt_created=<cfqueryparam cfsqltype="cf_sql_timestamp" value="#Now()#" />
,creator_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.usrId#" />
,param_value=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.paramValue#" />
,note=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.note#" />
where instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
</cfquery>
<!--- *** проверить существование - 404 --->
<cfreturn noData().withStatus(204, "No Content") />
</cffunction><!--- put --->
<cffunction name="checkInstanceParam">
<cfargument name="instanceOperationCfsParamUid" type="guid" required=true/>
<cfargument name="paramValue" required=true/>
<cfset var local={}/>
<cfquery name="local.qCheck" result="local.result">
select svc_operation_cfs_param_id
from instance_operation_cfs_param
where instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationCfsParamUid#" null=#!isValid('guid',arguments.instanceOperationCfsParamUid)#/>
</cfquery>
<cfif local.qCheck.recordCount EQ 0>
<cfthrow type="invalidParamValue" message="Cannot find CFS parameter by instanceOperationCfsParamUid=#arguments.instanceOperationCfsParamUid#"/>
</cfif>
<cfset CreateObject("component", "instance_operation_cfs_param_ls").checkParam(local.qCheck.svc_operation_cfs_param_id, arguments.paramValue, arguments.instanceOperationCfsParamUid)/>
</cffunction>
<cffunction name="processMap" returntype="void" access="public">
<cfargument name="qParam" type="query" required=true/>
<cfset var map={}/>
<cftry>
<cfset map=deserializeJson(arguments.qParam.param_value)/>
<cfif !isStruct(map)>
<cfset map={}/>
</cfif>
<cfcatch type="any">
<cfrethrow/>
</cfcatch>
</cftry>
<cfquery name="local.qSubparam">
select
sp.svc_operation_cfs_param_id
,sp.svc_operation_cfs_subparam_id
,sp.svc_operation_cfs_subparam
,sp.label
,sp.data_type
,sp.value_list
,sp.is_required
,sp.descr
,sp.man
,sp.default_value
,sp.minlength
,sp.maxlength
,sp.regex
,sp.sort
,sp.is_sensitive
from svc_operation_cfs_subparam sp
where sp.svc_operation_cfs_param_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.qParam.svc_operation_cfs_param_id#"/>
order by sp.sort
</cfquery>
<!--- <cfdump var=#local.qSubparam#/><cfabort/> --->
<cfquery name="local.qInstSubparam">
select
sp.instance_operation_cfs_param_uid::text as instance_operation_cfs_param_uid
,sp.instance_operation_cfs_subparam
,sp.note
,sp.sort
,sp.is_sensitive
from instance_operation_cfs_subparam sp
where sp.instance_operation_cfs_param_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.qParam.instance_operation_cfs_param_uid#" null=#!isValid("guid",arguments.qParam.instance_operation_cfs_param_uid)#/>
order by sp.sort
</cfquery>
<cfset var mapDescriptor=structNew("linked")/>
<cfloop query="local.qSubparam">
<cfset structInsert(mapDescriptor, local.qSubparam.svc_operation_cfs_subparam,
{
"man":"#local.qSubparam.man#",
"isSensitive":#request.castToBool(local.qSubparam.is_sensitive)#,
"isModifiableDefinition":false
}, true
)
/>
<cfif local.qSubparam.is_sensitive AND structKeyExists(map,local.qSubparam.svc_operation_cfs_subparam)>
<cfset map["#local.qSubparam.svc_operation_cfs_subparam#"] = "********"/>
</cfif>
</cfloop>
<cfloop query="local.qInstSubparam">
<cfset structInsert(mapDescriptor, local.qInstSubparam.instance_operation_cfs_subparam,
{
"note":"#local.qInstSubparam.note#",
"isSensitive":#request.castToBool(local.qInstSubparam.is_sensitive)#,
"isModifiableDefinition":true
}, true
)
/>
<cfif local.qInstSubparam.is_sensitive AND structKeyExists(map,local.qInstSubparam.instance_operation_cfs_subparam)>
<cfset map["#local.qInstSubparam.instance_operation_cfs_subparam#"] = "********"/>
</cfif>
</cfloop>
<cfset arguments.qParam.data_descriptor = mapDescriptor/>
<cfset arguments.qParam.param_value = serializeJson(map)/>
</cffunction>
<cffunction name="generateValueList" returntype="string" access="public">
<cfargument name="functionName" type="string" required="true"/>
<!--- остальные атрибуты необязательные, в argumentCollection (еще вопрос, насколько безопасно объявлять один из аргументов без остальных) --->
<cfswitch expression=#arguments.functionName#>
<cfcase value="">
<cfreturn ""/>
</cfcase>
<cfcase value="getAvailableResourceRealms">
<cfreturn getAvailableResourceRealms(arguments.svcId, arguments.contractId)/><!--- *** неочевидно, но ожидаются в argumentCollection --->
</cfcase>
<cfcase value="getSampleList"><!--- for debug --->
<cfreturn "dummy1,dummy2"/>
</cfcase>
<cfdefaultcase>
<cfreturn "function not found"/>
</cfdefaultcase>
</cfswitch>
</cffunction>
<cffunction name="getAvailableResourceRealms" returnType="string" access="public">
<cfargument name="svcId"/>
<cfargument name="contractId"/>
<cfset var local={}/>
<cfquery name="local.qAvailableResourceRealm"><!--- *** distinct халява, но придумывать корректную формулировку времени мало --->
select distinct r.resource_realm, r.sort
from resource_realm r
join resource_realm_access a on
(r.resource_realm_id=a.resource_realm_id
AND (a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.contractId# null=#!isValid("integer", arguments.contractId)#/>
OR a.contract_id=0) /*0 means access to any contract*/
AND a.is_enabled)
join svc s on r.resource_realm_type_id=s.resource_realm_type_id
where s.svc_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.svcId# null=#!isValid("integer", arguments.svcId)#/>
order by r.sort, r.resource_realm
</cfquery> <!--- <cfdump var=#arguments#/> cfdump здесь провоцирует NPE --->
<cfreturn valueList(local.qAvailableResourceRealm.resource_realm)/>
</cffunction>
</cfcomponent> </cfcomponent>