082 availableResourceRealms

This commit is contained in:
msyu
2025-04-07 22:29:03 +03:00
parent 498abdc060
commit 9692b6c101
7 changed files with 153 additions and 10 deletions
+1 -1
View File
@@ -51,7 +51,7 @@
//variables.framework.docs={};
variables.framework.docs.APIName="Deck API";
variables.framework.docs.APIVersion="0.081";
variables.framework.docs.APIVersion="0.082";
variables.framework.globalHeaders = structNew();
variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location";
+28
View File
@@ -161,6 +161,25 @@
AND 1=0
</cfif>
order by so.svc_operation_id
</cfquery>
<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>
<m:field>r.resource_realm_type_id</m:field>
<m:field>r.resource_realm</m:field>
</m:field_set>
from resource_realm r
join resource_realm_type t on (r.resource_realm_type_id=t.resource_realm_type_id)
/*left outer join resource_realm p on (r.parent_id=p.resource_realm_id)*/
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#/>
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=#qInstance.service_id#/>
order by 1
</cfquery>
<cfset var out=structNew("linked")/>
@@ -265,6 +284,11 @@
<cfloop query=#local.qAvailableOperation#>
<cfset arrayAppend(out.instance.availableOperations, this.helper.appendRecord(structNew("linked"), "", local.availableOperationTitleMap, local.qAvailableOperation, this.helper.snake2camel))/>
</cfloop>
<cfset "out.instance.availableResourceRealms"=[]/>
<cfloop query=#local.qAvailableResourceRealm#>
<cfset arrayAppend(out.instance.availableResourceRealms, this.helper.appendRecord(structNew("linked"), "", local.realmTitleMap, local.qAvailableResourceRealm, this.helper.snake2camel))/>
</cfloop>
<cfset "out.runDurationMs"=getTickCount() - request.startTickCount/>
<!--- <cfdump var=#local.qCurrentState#/>
@@ -277,6 +301,7 @@
<cffunction name="patch">
<cfargument name="instanceUid" type="string" required=true hint="type:guid"/>
<cfargument name="displayName" type="string" required=false hint="type:string"/>
<cfargument name="resourceRealmId" type="string" required=false hint="type:integer"/>
<cfargument name="descr" type="string" required=false default="" hint="type:varchar (no cleanup here!)"/>
<!--- ****** проверка уникальности --->
@@ -290,6 +315,9 @@
<cfif structKeyExists(arguments,"displayName")>
,display_name=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.displayName#" />
</cfif>
<cfif structKeyExists(arguments,"displayName")>
,resource_realm_id=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.resourceRealmId#" />
</cfif>
<cfif structKeyExists(arguments,"descr")>
,descr=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.descr#" />
</cfif>
+47 -4
View File
@@ -16,17 +16,60 @@
</cfcatch>
</cftry>
<cfset var instance = {
<cfquery name="local.qSvc" result="local.result">
select
<m:field_set titleMapOut="local.realmTitleMap" lengthOut="local.realmFieldCount">
<m:field>s.svc_id</m:field>
<m:field>s.svc</m:field>
<m:field>s.descr</m:field>
<m:field>s.man</m:field>
</m:field_set>
from svc s
where s.svc_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.svcId#/>
order by 1
</cfquery>
<!--- <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>
<m:field>r.resource_realm_type_id</m:field>
<m:field>r.resource_realm</m:field>
</m:field_set>
from resource_realm r
join resource_realm_type t on (r.resource_realm_type_id=t.resource_realm_type_id)
/*left outer join resource_realm p on (r.parent_id=p.resource_realm_id)*/
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#/>
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> --->
<!--- <cfset var instance = {
"svcId":"#arguments.svcId*1#",
"displayName":"#generateDefaultName(arguments.svcId,arguments.usrId)#",
"descr":""
}/>
}/> --->
<cfset var out = structNew("linked")/>
<cfset "out.instance.svcId"="#arguments.svcId*1#"/>
<cfset "out.instance.svc"="#local.qSvc.svc#"/>
<cfset "out.instance.displayName"="#generateDefaultName(arguments.svcId,arguments.usrId)#"/>
<cfset "out.instance.descr"="#local.qSvc.descr#"/>
<cfset "out.instance.man"="#local.qSvc.man#"/>
<!--- <cfset var out = structCopy(svc)/> ---><!--- *** иначе, видимо, циклическая ссылка, если мы еще скопируем это внутрь структуры --->
<cfset "out.instance" = instance/>
<!--- <cfset "out.instance" = instance/> --->
<!--- <cfset "out.instance.availableResourceRealms"=[]/>
<cfloop query=#local.qAvailableResourceRealm#>
<cfset arrayAppend(out.instance.availableResourceRealms, this.helper.appendRecord(structNew("linked"), "", local.realmTitleMap, local.qAvailableResourceRealm, this.helper.snake2camel))/>
</cfloop> --->
<cfset "out.queryDurationMs"=getTickCount() - request.startTickCount/>
<cfset "out.runDurationMs"=getTickCount() - request.startTickCount/>
+28 -4
View File
@@ -32,6 +32,7 @@
"is_deleted"={prefix="inr", type="string"},<!--- not bool --->
"suspended"={prefix="inr", type="string"},<!--- not bool --->
"resourceRealm"={prefix="inr", type="string"},
"resourceRealmId"={prefix="inr", type="integer"},
"is_test"={prefix="inr", type="boolean"},
"is_auxiliary"={prefix="inr", type="boolean"},
"explained_status"={prefix="inr", type="string"},
@@ -134,6 +135,8 @@
<m:field>e.instance_uid::text as instance_uid</m:field>
<m:field>e.display_name</m:field>
<m:field>e.service_id</m:field>
<m:field>e.resource_realm_id</m:field>
<m:field>r.resource_realm</m:field>
<m:field>e.specification_item_id</m:field>
<m:field formatter=#request.castToBool#>e.is_auxiliary</m:field>
<m:field>d.contract_id</m:field>
@@ -159,7 +162,7 @@
<m:field formatter=#request.castToBool#>(select st.is_test from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) as is_test</m:field>
<m:field formatter=#request.castToBool#>coalesce((select st.instance_data->>'isDeleted' from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1),'false') as is_deleted</m:field><!--- attention it is not bool in state --->
<m:field formatter=#request.castToBool#>(select st.instance_data->>'suspended' from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) as suspended</m:field>
<m:field>(select cast(st.instance_data->>'params' as json)->>'resourceRealm' from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) as resourceRealm</m:field>
<!--- <m:field>(select cast(st.instance_data->>'params' as json)->>'resourceRealm' from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) as resourceRealm</m:field> --->
<m:field>(select to_char(st.dt_state, 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZHTZM') from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) as dt_state</m:field>
<m:field>
(case
@@ -290,6 +293,7 @@
<cfargument name="displayName" type="string" required=true hint="type:string"/>
<cfargument name="serviceId" type="string" required=true hint="type:integer"/>
<cfargument name="descr" type="string" required=false default="" hint="type:varchar (no cleanup here!)"/>
<cfargument name="resourceRealmId" type="string" required=false default="-1" hint="type:integer"/>
<!--- <cfargument name="instanceUid" type="string" required=false default="" hint="type:guid)"/> --->
<!--- <cfargument name="usrUid" type="string" required=true hint="type:guid"/>
@@ -303,9 +307,11 @@
<cfset local.instanceUid=#createGUID()#/>
<!--- </cfif> --->
<!--- ****** проверка доступности платформы ***** --->
<cftry>
<cfset this.helper.keyExistsAndValid(arguments, "serviceId", "integer")/>
<cfset checkDisplayName(arguments.displayName, arguments.usrId, local.instanceUid)/>
<cfset checkResourceRealmId(arguments.resourceRealmId, arguments.usrId, arguments.serviceId)/>
<!--- делаем вставку в спецификацию и таблицу экземпляров --->
<cfquery name="local.qSpecItem">
@@ -313,7 +319,7 @@
(specification_id, specification_item, svc_id, quantity, price, dt_created, creator_id, dt_updated, updater_id)
values
(
<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.specificationId#" />
<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.specificationId#" />
,<cfqueryparam cfsqltype="cf_sql_varchar" value=""/>
,<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.serviceId#" />
,<cfqueryparam cfsqltype="cf_sql_integer" value="1" /> <!--- это типично для всех PAYG --->
@@ -327,13 +333,14 @@
<cfquery name="local.qSave">
insert into instance
(instance_uid, display_name, service_id, specification_item_id, descr, dt_created, creator_id, dt_updated, updater_id)
(instance_uid, display_name, service_id, specification_item_id, resource_realm_id, descr, dt_created, creator_id, dt_updated, updater_id)
values
(
<cfqueryparam cfsqltype="cf_sql_other" value="#local.instanceUid#" />
,<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.displayName#"/>
,<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.serviceId#" />
,<cfqueryparam cfsqltype="cf_sql_integer" value="#local.qSpecItem.specification_item_id#" />
,<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.resourceRealmId#" />
,<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.descr#" />
,<cfqueryparam cfsqltype="cf_sql_timestamp" value="#Now()#" />
,<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.usrId#" />
@@ -351,10 +358,27 @@
.withHeaders({location: "./#local.instanceUid#"})
.withStatus(201, "Created")
/>
</cffunction>
<cffunction name="checkResourceRealmId">
<cfargument name="resourceRealmId" type="numeric" required=true/>
<cfargument name="usrId" type="numeric" required=true/>
<cfset var local={}/>
<cfif NOT resourceRealmId GT 0>
<cfthrow type="InvalidParamValue" message="resource realm undefined" detail="Не выбрана ресурсная платформа"/>
</cfif>
Проверить соответствие сервису
Проверить доступ (это предварительная проверка! настоящая проверка перед запуском операции)
<cfreturn/>
</cffunction>
<cffunction name="checkDisplayName">
<cfargument name="displayName" required=true/>
<cfargument name="usrId" type="numeric" required=true/>
+24
View File
@@ -130,6 +130,25 @@
null=#!isValid('integer',local.qInstanceOperation.svc_operation_id)#/>
order by sop.sort, sop.svc_operation_cfs_param_id
</cfquery>
<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>
<m:field>r.resource_realm_type_id</m:field>
<m:field>r.resource_realm</m:field>
</m:field_set>
from resource_realm r
join resource_realm_type t on (r.resource_realm_type_id=t.resource_realm_type_id)
/*left outer join resource_realm p on (r.parent_id=p.resource_realm_id)*/
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#/>
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=#local.qInstanceOperation.service_id#/>
order by 1
</cfquery>
<cfset "out.queryDurationMs"=getTickCount() - request.startTickCount/>
@@ -149,6 +168,11 @@
<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"=[]/>
<cfloop query=#local.qAvailableResourceRealm#>
<cfset arrayAppend(out.instanceOperation.availableResourceRealms, this.helper.appendRecord(structNew("linked"), "", local.realmTitleMap, local.qAvailableResourceRealm, this.helper.snake2camel))/>
</cfloop>
<cfset "out.runDurationMs"=getTickCount() - request.startTickCount/>
<cfreturn representationOf(out) />
</cffunction>
@@ -73,6 +73,25 @@
<cfreturn representationOf(this.helper.formatMessage("Not Found")).withStatus(404)/>
</cfif>
<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>
<m:field>r.resource_realm_type_id</m:field>
<m:field>r.resource_realm</m:field>
</m:field_set>
from resource_realm r
join resource_realm_type t on (r.resource_realm_type_id=t.resource_realm_type_id)
/*left outer join resource_realm p on (r.parent_id=p.resource_realm_id)*/
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#/>
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=#local.qSvcOperation.svc_id#/>
order by 1
</cfquery>
<cfset var out=structNew("linked")/>
<cfset "out.queryDurationMs"=getTickCount() - request.startTickCount/>
@@ -86,6 +105,11 @@
<cfset var rec = this.helper.appendRecord(structNew("linked"), "", local.cfsParamMap, local.qCfsParam, this.helper.snake2camel)/>
<cfset arrayAppend(out.svcOperation.cfsParams, rec)/>
</cfloop>
<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>
<cfset "out.runDurationMs"=getTickCount() - request.startTickCount/>
<cfreturn representationOf(out) />
+1 -1
View File
@@ -5,7 +5,7 @@
<cfset this.helper=CreateObject("component","lib.rest_api_helper")/>
</cfsilent>
<cffunction name="get" hint="Шаблон экземпляра"><!--- *** TODO проверка принадлежности тенанту --->
<cffunction name="get" hint="DEPRECATED. Шаблон экземпляра"><!--- *** TODO проверка принадлежности тенанту --->
<cfargument name="svcId" type="string" required=true hint="type:integer"/>
<!--- <cfargument name="usrId" type="string" /> ---><!--- arguments.usrId неявно инжектируется из Application.cfm --->