resourceRealm refactoring
This commit is contained in:
@@ -112,6 +112,7 @@
|
||||
<m:field>sop.data_type</m:field>
|
||||
<m:field formatter=#function(x){return listToArray(x);}#>sop.value_list</m:field>
|
||||
<m:field>sop.ref_svc_id</m:field>
|
||||
<m:field>sop.func</m:field>
|
||||
<m:field formatter=#request.castToBool#>sop.is_required</m:field>
|
||||
<m:field>sop.default_value</m:field>
|
||||
<m:field>sop.regex</m:field>
|
||||
@@ -134,7 +135,19 @@
|
||||
order by sop.sort, sop.svc_operation_cfs_param_id
|
||||
</cfquery>
|
||||
|
||||
<cfquery name="local.qAvailableResourceRealm" result="local.result">
|
||||
<cfloop query="local.qCfsParam">
|
||||
<cfif len(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>
|
||||
</cfloop>
|
||||
|
||||
<!--- <cfquery name="local.qAvailableResourceRealm" result="local.result">
|
||||
select
|
||||
<m:field_set titleMapOut="local.realmTitleMap" lengthOut="local.realmFieldCount">
|
||||
<m:field>r.resource_realm_id</m:field>
|
||||
@@ -152,7 +165,7 @@
|
||||
join svc s on r.resource_realm_type_id=s.resource_realm_type_id
|
||||
where s.svc_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#local.qInstanceOperation.service_id#/>
|
||||
order by 1
|
||||
</cfquery>
|
||||
</cfquery> --->
|
||||
|
||||
<cfset "out.queryDurationMs"=getTickCount() - request.startTickCount/>
|
||||
|
||||
@@ -172,13 +185,53 @@
|
||||
|
||||
<cfset "out.instanceOperation.state"=(local.qState.recordCount GT 0) ? this.helper.appendRecord(structNew("linked"), "", local.stateTitleMap, local.qState, this.helper.snake2camel) : {}/>
|
||||
|
||||
<cfset "out.instanceOperation.availableResourceRealms"=[]/>
|
||||
<!--- <cfset "out.instanceOperation.availableResourceRealms"=[]/>
|
||||
<cfloop query=#local.qAvailableResourceRealm#>
|
||||
<cfset arrayAppend(out.instanceOperation.availableResourceRealms, this.helper.appendRecord(structNew("linked"), "", local.realmTitleMap, local.qAvailableResourceRealm, this.helper.snake2camel))/>
|
||||
</cfloop>
|
||||
</cfloop> --->
|
||||
|
||||
<cfset "out.runDurationMs"=getTickCount() - request.startTickCount/>
|
||||
<cfreturn representationOf(out) />
|
||||
</cffunction>
|
||||
|
||||
<!--- *** дублируются --->
|
||||
<cffunction name="getAvailableResourceRealms" returnType="string">
|
||||
<cfargument name="svcId"/>
|
||||
<cfargument name="contractId"/>
|
||||
|
||||
<cfset var local={}/>
|
||||
|
||||
<cfquery name="local.qAvailableResourceRealm"><!--- *** distinct халява, но придумывать корректную формулировку времени мало --->
|
||||
select distinct r.resource_realm
|
||||
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 1
|
||||
</cfquery> <!--- <cfdump var=#arguments#/> cfdump здесь провоцирует NPE --->
|
||||
<cfreturn valueList(local.qAvailableResourceRealm.resource_realm)/>
|
||||
</cffunction>
|
||||
|
||||
|
||||
<cffunction name="generateValueList" returntype="string">
|
||||
<cfargument name="functionName" type="string" required="true"/>
|
||||
<!--- остальные атрибуты необязательные, в argumentCollection (еще вопрос, насколько безопасно объявлять один из аргументов без остальных) --->
|
||||
|
||||
<cfswitch expression=#arguments.functionName#>
|
||||
<cfcase value="getAvailableResourceRealms">
|
||||
<cfreturn getAvailableResourceRealms(arguments.svcId, arguments.contractId)/>
|
||||
</cfcase>
|
||||
<cfcase value="getSampleList"><!--- for debug --->
|
||||
<cfreturn "dummy1,dummy2"/>
|
||||
</cfcase>
|
||||
<cfdefaultcase>
|
||||
<cfreturn "function not found"/>
|
||||
</cfdefaultcase>
|
||||
</cfswitch>
|
||||
</cffunction>
|
||||
|
||||
</cfcomponent>
|
||||
@@ -8,7 +8,9 @@
|
||||
|
||||
<cffunction name="get" hint="Шаблон операции экземпляра"><!--- *** TODO проверка принадлежности тенанту --->
|
||||
<cfargument name="svcOperationId" type="string" required=true hint="type:integer"/>
|
||||
<!--- <cfargument name="usrId" type="string" hint="type:integer; no need to provide this argument in request, it is injected by IAM"/> ---><!--- arguments.usrId неявно инжектируется из Application.cfm --->
|
||||
<!--- <cfargument name="usrId" type="string" hint="type:integer; no need to provide this argument in request, it is injected by IAM"/> ---><!--- arguments.usrId неявно инжектируется из Application.cfm, также contractId, contragentId ... --->
|
||||
|
||||
|
||||
|
||||
<cftry>
|
||||
<cfset this.helper.validateField(arguments, "svcOperationId", "integer")/>
|
||||
@@ -40,6 +42,7 @@
|
||||
<m:field>p.label</m:field>
|
||||
<m:field>p.data_type</m:field>
|
||||
<m:field formatter=#function(x){return listToArray(x);}#>p.value_list</m:field>
|
||||
<m:field <!--- formatter=#function(x){return listToArray(generateValueList(x));}# --->>p.func</m:field><!--- *** отчаявшись сделать красиво --->
|
||||
<m:field>p.ref_svc_id</m:field>
|
||||
<m:field formatter=#request.castToBool#>p.is_required</m:field>
|
||||
<m:field>p.default_value</m:field><!--- can be overridden bu default_compute --->
|
||||
@@ -73,8 +76,24 @@
|
||||
<cfreturn representationOf(this.helper.formatMessage("Not Found")).withStatus(404)/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="local.qAvailableResourceRealm" result="local.result">
|
||||
select
|
||||
|
||||
<cfloop query="local.qCfsParam">
|
||||
<cfif len(func)><!--- приоритет отдается функции перед списком значений--->
|
||||
<cfset var args = {
|
||||
"functionName":"#func#",
|
||||
"svcId":#local.qSvcOperation.svc_id#,
|
||||
"contractId":#arguments.contractId#
|
||||
}/> <!--- если появятся новые аргументы у новых функций, будем добавлять их сюда --->
|
||||
<cfset local.qCfsParam.value_list=generateValueList(argumentCollection=#args#)/> <!--- можно перечислить именованные аргументы обычным порядком, но с коллекцией потенциально более гибко --->
|
||||
<!--- <cfdump var=#local.qCfsParam#/><cfabort/> --->
|
||||
</cfif>
|
||||
</cfloop>
|
||||
|
||||
<cfset queryDeleteColumn(local.qCfsParam, "func")/>
|
||||
|
||||
|
||||
<!--- <cfquery name="local.qAvailableResourceRealm" result="local.result">
|
||||
select distinct /***халява*/
|
||||
<m:field_set titleMapOut="local.realmTitleMap" lengthOut="local.realmFieldCount">
|
||||
<m:field>r.resource_realm_id</m:field>
|
||||
<m:field>r.resource_realm_type_id</m:field>
|
||||
@@ -91,7 +110,7 @@
|
||||
join svc s on r.resource_realm_type_id=s.resource_realm_type_id
|
||||
where s.svc_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#local.qSvcOperation.svc_id#/>
|
||||
order by 1
|
||||
</cfquery>
|
||||
</cfquery> --->
|
||||
|
||||
<cfset var out=structNew("linked")/>
|
||||
<cfset "out.queryDurationMs"=getTickCount() - request.startTickCount/>
|
||||
@@ -107,13 +126,17 @@
|
||||
<cfset arrayAppend(out.svcOperation.cfsParams, rec)/>
|
||||
</cfloop>
|
||||
|
||||
<cfset "out.svcOperation.availableResourceRealms"=[]/>
|
||||
<!--- <cfset "out.svcOperation.availableResourceRealms"=[]/>
|
||||
<cfloop query=#local.qAvailableResourceRealm#>
|
||||
<cfset arrayAppend(out.svcOperation.availableResourceRealms, this.helper.appendRecord(structNew("linked"), "", local.realmTitleMap, local.qAvailableResourceRealm, this.helper.snake2camel))/>
|
||||
</cfloop>
|
||||
</cfloop> --->
|
||||
|
||||
<cfset "out.runDurationMs"=getTickCount() - request.startTickCount/>
|
||||
<cfreturn representationOf(out) />
|
||||
|
||||
|
||||
|
||||
|
||||
</cffunction>
|
||||
|
||||
<!--- *** выглядит ужасно, но красивый вариант не придумывается ряд месяцев --->
|
||||
@@ -140,5 +163,67 @@
|
||||
</cfswitch>
|
||||
|
||||
</cffunction>
|
||||
|
||||
|
||||
<!--- <cffunction name="getAvailableResourceRealms" returnType="string">
|
||||
<cfargument name="svcId" type="numeric">
|
||||
<cfargument name="contractId" type="numeric">
|
||||
|
||||
<cfset var local={}/>
|
||||
|
||||
<cfquery name="local.qAvailableResourceRealm"><!--- *** distinct халява, но придумывать корректную формулировку времени мало --->
|
||||
select distinct r.resource_realm
|
||||
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# />
|
||||
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#/>
|
||||
order by 1
|
||||
</cfquery>
|
||||
<cfreturn valueList(local.qAvailableResourceRealm.resource_realm)/><!--- пишут, что есть valueToArray --->
|
||||
</cffunction> --->
|
||||
|
||||
<cffunction name="getAvailableResourceRealms" returnType="string">
|
||||
<cfargument name="svcId"/>
|
||||
<cfargument name="contractId"/>
|
||||
|
||||
<cfset var local={}/>
|
||||
|
||||
<cfquery name="local.qAvailableResourceRealm"><!--- *** distinct халява, но придумывать корректную формулировку времени мало --->
|
||||
select distinct r.resource_realm
|
||||
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 1
|
||||
</cfquery> <!--- <cfdump var=#arguments#/> cfdump здесь провоцирует NPE --->
|
||||
<cfreturn valueList(local.qAvailableResourceRealm.resource_realm)/>
|
||||
</cffunction>
|
||||
|
||||
|
||||
<cffunction name="generateValueList" returntype="string">
|
||||
<cfargument name="functionName" type="string" required="true"/>
|
||||
<!--- остальные атрибуты необязательные, в argumentCollection (еще вопрос, насколько безопасно объявлять один из аргументов без остальных) --->
|
||||
|
||||
<cfswitch expression=#arguments.functionName#>
|
||||
<cfcase value="getAvailableResourceRealms">
|
||||
<cfreturn getAvailableResourceRealms(arguments.svcId, arguments.contractId)/>
|
||||
</cfcase>
|
||||
<cfcase value="getSampleList"><!--- for debug --->
|
||||
<cfreturn "dummy1,dummy2"/>
|
||||
</cfcase>
|
||||
<cfdefaultcase>
|
||||
<cfreturn "function not found"/>
|
||||
</cfdefaultcase>
|
||||
</cfswitch>
|
||||
</cffunction>
|
||||
|
||||
|
||||
</cfcomponent>
|
||||
Reference in New Issue
Block a user