111 instance.uptime (detail) fix
This commit is contained in:
@@ -0,0 +1,280 @@
|
||||
<cfcomponent extends="taffy.core.resource" taffy:uri="/instanceOperationCfsParams/{instanceOperationCfsParamUid}/subparams">
|
||||
<!--- забавно, что мы организуем эндпойнт коллекции только ради операции создания. Список (коллекция) отдельно не используется, а выгружается в составе более высокоуровневых сущностей --->
|
||||
|
||||
|
||||
<cfsilent>
|
||||
<cfimport prefix="m" taglib="../lib"/>
|
||||
<cfset this.helper=CreateObject("component","lib.rest_api_helper")/>
|
||||
</cfsilent>
|
||||
|
||||
|
||||
<cffunction name="post" hint="CFS параметр операции инстанса">
|
||||
<cfargument name="instanceOperationCfsParamUid" type="string" required=true hint="type:guid"/>
|
||||
<cfargument name="subparam" type="string" required=true hint="type:string"/>
|
||||
<!--- arguments.specificationId injected implicitly --->
|
||||
<cftry>
|
||||
<cfset this.helper.validateField(arguments, "instanceOperationCfsParamUid", "guid")/>
|
||||
<cfcatch type="invalidParamValue">
|
||||
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
|
||||
<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">
|
||||
select count(*) as cnt
|
||||
from instance_operation_cfs_param iop
|
||||
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>
|
||||
|
||||
<cfif local.qCfsParam.recordCount EQ 0>
|
||||
<cfreturn representationOf(this.helper.formatMessage("Not Found")).withStatus(404)/>
|
||||
</cfif>
|
||||
|
||||
<cfif len(local.qCfsParam.func)><!--- приоритет отдается функции перед списком значений--->
|
||||
<cfset var args = {
|
||||
"functionName":"#func#",
|
||||
"svcId":#local.qInstanceOperation.service_id#,
|
||||
"contractId":#arguments.contractId#
|
||||
}/> <!--- если появятся новые аргументы у новых функций, будем добавлять их сюда --->
|
||||
<cfset local.qCfsParam.value_list=generateValueList(argumentCollection=#args#)/> <!--- можно перечислить именованные аргументы обычным порядком, но с коллекцией потенциально более гибко --->
|
||||
<!--- <cfdump var=#local.qCfsParam#/><cfabort/> --->
|
||||
<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 local.qCfsParam.data_type EQ "map">
|
||||
<cfset processMap(local.qCfsParam)/><!--- query passed by reference --->
|
||||
</cfif>
|
||||
|
||||
<cfset var out=structNew("linked")/>
|
||||
<cfset "out.queryDurationMs"=getTickCount() - request.startTickCount/>
|
||||
|
||||
<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 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>
|
||||
Reference in New Issue
Block a user