195 instance_operation validate-cfs
This commit is contained in:
+1
-1
@@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
//variables.framework.docs={};
|
//variables.framework.docs={};
|
||||||
variables.framework.docs.APIName="svc-api";
|
variables.framework.docs.APIName="svc-api";
|
||||||
variables.framework.docs.APIVersion="0.193"; /*$ git config --global --unset user.password*/
|
variables.framework.docs.APIVersion="0.195"; /*$ git config --global --unset user.password*/
|
||||||
|
|
||||||
variables.framework.globalHeaders = structNew();
|
variables.framework.globalHeaders = structNew();
|
||||||
variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location";
|
variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location";
|
||||||
|
|||||||
@@ -284,7 +284,10 @@
|
|||||||
left outer join contragent k on (c.contragent_id=k.contragent_id)
|
left outer join contragent k on (c.contragent_id=k.contragent_id)
|
||||||
where
|
where
|
||||||
p.param_value=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.instanceUid#"/>
|
p.param_value=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.instanceUid#"/>
|
||||||
AND r.svc_id=(select i.service_id from instance i where i.instance_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceUid#" null=#!isValid('guid',arguments.instanceUid)#/>)
|
AND r.svc_id=(select i.service_id
|
||||||
|
from instance i
|
||||||
|
where i.instance_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceUid#" null=#!isValid('guid',arguments.instanceUid)#/>
|
||||||
|
)
|
||||||
</cfquery>
|
</cfquery>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -152,6 +152,8 @@
|
|||||||
<m:field>i.price</m:field>
|
<m:field>i.price</m:field>
|
||||||
<m:field>v.svc</m:field>
|
<m:field>v.svc</m:field>
|
||||||
<m:field>v.code</m:field>
|
<m:field>v.code</m:field>
|
||||||
|
<m:field>v.resource_realm_type_id</m:field>
|
||||||
|
<!--- <m:field>p.param_value as resource_realm</m:field> --->
|
||||||
<m:field>e.updater_id</m:field>
|
<m:field>e.updater_id</m:field>
|
||||||
<m:field>u.login as updater_login</m:field>
|
<m:field>u.login as updater_login</m:field>
|
||||||
<m:field>u.shortname as updater_shortname</m:field>
|
<m:field>u.shortname as updater_shortname</m:field>
|
||||||
@@ -228,6 +230,7 @@
|
|||||||
from instance_operation o join (select instance_uid, max(dt_submit) as dt_submit from instance_operation group by 1
|
from instance_operation o join (select instance_uid, max(dt_submit) as dt_submit from instance_operation group by 1
|
||||||
) lastv on (o.instance_uid=lastv.instance_uid AND o.dt_submit=lastv.dt_submit)
|
) lastv on (o.instance_uid=lastv.instance_uid AND o.dt_submit=lastv.dt_submit)
|
||||||
) io on (e.instance_uid=io.instance_uid)
|
) io on (e.instance_uid=io.instance_uid)
|
||||||
|
<!--- left outer join instance_cfs_param p on (e.instance_uid=p.instance_uid AND p.param='resourceRealm') --->
|
||||||
where s.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/>
|
where s.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/>
|
||||||
<cfif len(arguments.search)>
|
<cfif len(arguments.search)>
|
||||||
AND (
|
AND (
|
||||||
@@ -266,7 +269,8 @@
|
|||||||
left outer join (select o.instance_operation_uid, o.instance_uid, o.operation, o.dt_submit, o.submit_result, o.dt_start, o.dt_finish, o.is_successful
|
left outer join (select o.instance_operation_uid, o.instance_uid, o.operation, o.dt_submit, o.submit_result, o.dt_start, o.dt_finish, o.is_successful
|
||||||
from instance_operation o join (select instance_uid, max(dt_submit) as dt_submit from instance_operation group by 1) lastv
|
from instance_operation o join (select instance_uid, max(dt_submit) as dt_submit from instance_operation group by 1) lastv
|
||||||
on (o.instance_uid=lastv.instance_uid AND o.dt_submit=lastv.dt_submit) ) io
|
on (o.instance_uid=lastv.instance_uid AND o.dt_submit=lastv.dt_submit) ) io
|
||||||
on (e.instance_uid=io.instance_uid)
|
on (e.instance_uid=io.instance_uid)
|
||||||
|
<!--- left outer join instance_cfs_param p on (e.instance_uid=p.instance_uid AND p.param='resourceRealm') --->
|
||||||
where s.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/><!--- *** make project entity --->
|
where s.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/><!--- *** make project entity --->
|
||||||
<!--- u.usr_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.usrId#/> --->
|
<!--- u.usr_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.usrId#/> --->
|
||||||
<cfif len(arguments.search)>
|
<cfif len(arguments.search)>
|
||||||
|
|||||||
@@ -236,7 +236,67 @@
|
|||||||
<cfreturn representationOf(out) />
|
<cfreturn representationOf(out) />
|
||||||
</cffunction>
|
</cffunction>
|
||||||
|
|
||||||
|
|
||||||
|
<!--- *** копия кода из deck-tool inst_op.cfc, коллекции статических методов операции инстанса --->
|
||||||
|
<cffunction name="validateCfsParams" returntype="string">
|
||||||
|
<cfargument name="instanceOperationUid" type="guid" required="true"/>
|
||||||
|
<!--- проверить CFS параметры в совокупности. Нужно, поскольку параметры не всегда могут быть проверены по одному,
|
||||||
|
пример - проверка уникальности парамера в рамках платформы, которая сама представлена параметром операции --->
|
||||||
|
<!--- пока сюда попали только две проверки уникальности --->
|
||||||
|
<cfset var local={}/>
|
||||||
|
<cfquery name="local.qSvcOperationParam">
|
||||||
|
select sop.svc_operation_cfs_param_id, sop.svc_operation_cfs_param, sop.unique_scope
|
||||||
|
from svc_operation_cfs_param sop
|
||||||
|
join instance_operation_cfs_param iop on (sop.svc_operation_cfs_param_id=iop.svc_operation_cfs_param_id)
|
||||||
|
where iop.instance_operation_uid = <cfqueryparam cfsqltype="CF_SQL_OTHER" value=#arguments.instanceOperationUid#/>
|
||||||
|
</cfquery>
|
||||||
|
<cfquery name="local.qInstance">
|
||||||
|
select io.instance_uid
|
||||||
|
from instance_operation io
|
||||||
|
join instance_operation_cfs_param iop on (io.instance_operation_uid=iop.instance_operation_uid)
|
||||||
|
where iop.instance_operation_uid = <cfqueryparam cfsqltype="CF_SQL_OTHER" value=#arguments.instanceOperationUid#/>
|
||||||
|
</cfquery>
|
||||||
|
|
||||||
|
<cfloop query="local.qSvcOperationParam">
|
||||||
|
<cfswitch expression=#local.qSvcOperationParam.unique_scope#>
|
||||||
|
<cfcase value="parent">
|
||||||
|
<!--- сверяем параметр операции с параметрами инстансов --->
|
||||||
|
<cfquery name="local.qUnique">
|
||||||
|
SELECT p.param_value, sp.svc_operation_cfs_param, re.display_name
|
||||||
|
FROM instance_operation o
|
||||||
|
JOIN instance_operation_cfs_param p on (o.instance_operation_uid=p.instance_operation_uid)
|
||||||
|
--JOIN svc s on (e.service_id=s.svc_id)
|
||||||
|
-- svc_operation_cfs_param нужен, чтобы убрать совпадение параметра с самим собой, это не является ошибкой
|
||||||
|
-- остается непонятным, будет ли работать проверка между create/modify, у них разные id, а в параметрах инстанса одно и то же
|
||||||
|
-- возможно, следует сравнивать просто по имени
|
||||||
|
--join instance_operation_cfs_param op on (p.instance_operation_cfs_param_uid=op.instance_operation_cfs_param_uid)
|
||||||
|
join svc_operation_cfs_param sp on (p.svc_operation_cfs_param_id=sp.svc_operation_cfs_param_id)
|
||||||
|
|
||||||
|
JOIN instance_operation_cfs_param p2 on (p.instance_operation_uid=p2.instance_operation_uid) -- sibling params
|
||||||
|
JOIN instance re on (p2.param_value=re.instance_uid::text /*не проверяем тип параметра - ссылка, не проверяем соответствие теп*/) -- referenced instance
|
||||||
|
-- down back
|
||||||
|
LEFT OUTER JOIN instance_cfs_param p3 on (re.instance_uid::text=p3.param_value /*добавить селективности*/) -- referencing params from sibling instance
|
||||||
|
LEFT OUTER JOIN instance_cfs_param p4 on (p3.instance_uid=p4.instance_uid AND sp.svc_operation_cfs_param=p4.param) -- same param names from sibling instance
|
||||||
|
|
||||||
|
WHERE p.param_value=p4.param_value
|
||||||
|
AND p.instance_operation_uid=<cfqueryparam cfsqltype="cf_sql_other" value=#arguments.instanceOperationUid#/>
|
||||||
|
AND p.svc_operation_cfs_param_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#local.qSvcOperationParam.svc_operation_cfs_param_id#/>
|
||||||
|
AND p4.instance_uid <> <cfqueryparam cfsqltype="cf_sql_other" value=#qInstance.instance_uid# null=#!isValid("guid",qInstance.instance_uid)#/>
|
||||||
|
AND (select cast(st.instance_data->>'isDeleted' as boolean) from instance_state st where st.instance_uid=p4.instance_uid order by version desc limit 1) IS NOT TRUE
|
||||||
|
</cfquery>
|
||||||
|
<cfif qUnique.recordCount GT 0>
|
||||||
|
<cfreturn '#local.qUnique.svc_operation_cfs_param# = "#local.qUnique.param_value#" is not unique in the parent instance (#local.qUnique.display_name#) scope'/>
|
||||||
|
<!--- *** неточность: мы показываем только первую коллизию, нет полной уверенности, что рядом не окажется второй, хотя представить себе такую ситуацию достаточно сложно --->
|
||||||
|
</cfif>
|
||||||
|
<!--- <cfdump var=#qUnique#/><cfabort/> --->
|
||||||
|
</cfcase>
|
||||||
|
<cfdefaultcase></cfdefaultcase>
|
||||||
|
</cfswitch>
|
||||||
|
</cfloop>
|
||||||
|
<cfreturn ""/>
|
||||||
|
<!--- некрасиво, но просто - пустое сообщение об ошибке означает успешную проверку (изящнее не придумал) --->
|
||||||
|
|
||||||
|
</cffunction>
|
||||||
|
|
||||||
|
|
||||||
</cfcomponent>
|
</cfcomponent>
|
||||||
@@ -88,9 +88,14 @@
|
|||||||
</cfif>
|
</cfif>
|
||||||
</cfloop><!--- <cfdump var=#local.qCheckCfsParams#/><cfabort/> --->
|
</cfloop><!--- <cfdump var=#local.qCheckCfsParams#/><cfabort/> --->
|
||||||
|
|
||||||
<!--- ***** тут должен быть контроль доступа на уровне параметров. Желательно по максимуму параноидальный --->
|
<!--- ***** тут должен быть контроль доступа на уровне параметров. Желательно по максимуму параноидальный --->
|
||||||
<!--- ***** или при сабмите. Может быть, и на уровне RFS параметров тоже --->
|
<!--- ***** или при сабмите. Может быть, и на уровне RFS параметров тоже --->
|
||||||
<cfset checkCfsResourceRealmAccess(arguments.instanceOperationUid)/>
|
<cfset checkCfsResourceRealmAccess(arguments.instanceOperationUid)/><!--- *** можно этот метод отдать операции инстанса --->
|
||||||
|
|
||||||
|
<cfset var validationMessage = createObject("component","instance_operation").validateCfsParams(arguments.instanceOperationUid)/>
|
||||||
|
<cfif len(validationMessage)>
|
||||||
|
<cfthrow type="inconsistentCfsParams" message="Some CFS parameters are incompatible" detail="#validationMessage#"/>
|
||||||
|
</cfif>
|
||||||
|
|
||||||
<cfset generateRfsParams(arguments.instanceOperationUid, arguments.usrId, arguments.contragentId, arguments.contractId)/><!--- *** кроме usr_id остальные параметры избыточны - информация есть у инстанса --->
|
<cfset generateRfsParams(arguments.instanceOperationUid, arguments.usrId, arguments.contragentId, arguments.contractId)/><!--- *** кроме usr_id остальные параметры избыточны - информация есть у инстанса --->
|
||||||
|
|
||||||
@@ -103,6 +108,9 @@
|
|||||||
<cfcatch type="invalidParamValue">
|
<cfcatch type="invalidParamValue">
|
||||||
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
|
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
|
||||||
</cfcatch>
|
</cfcatch>
|
||||||
|
<cfcatch type="inconsistentCfsParams">
|
||||||
|
<cfreturn representationOf(this.helper.formatException(cfcatch,'Inconsistent CFS parameters')).withStatus(422)/>
|
||||||
|
</cfcatch>
|
||||||
<cfcatch type="missingDependency">
|
<cfcatch type="missingDependency">
|
||||||
<cfreturn representationOf(this.helper.formatException(cfcatch,"Missing Dependency")).withStatus(424)/>
|
<cfreturn representationOf(this.helper.formatException(cfcatch,"Missing Dependency")).withStatus(424)/>
|
||||||
</cfcatch>
|
</cfcatch>
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<cfcomponent extends="taffy.core.resource" taffy:uri="/instanceOperations/{instanceOperationUid}/validate-cfs">
|
||||||
|
|
||||||
|
<cfsilent>
|
||||||
|
<cfimport prefix="m" taglib="../lib"/>
|
||||||
|
<cfset this.helper=CreateObject("component","lib.rest_api_helper")/><!---*** странно, почему мы его видим?---><!---вынести в апп?--->
|
||||||
|
</cfsilent>
|
||||||
|
|
||||||
|
|
||||||
|
<cffunction name="get" hint="Проверка корректности CFS">
|
||||||
|
<cfargument name="instanceOperationUid" type="string" required=true hint="type:guid"/>
|
||||||
|
|
||||||
|
<!--- <cfset var local={}/> --->
|
||||||
|
|
||||||
|
<!--- *** мы не проверяем доступ к инстансу и существование инстанса 2DO --->
|
||||||
|
|
||||||
|
<cfset var validationMessage = createObject("component","instance_operation").validateCfsParams(arguments.instanceOperationUid)/>
|
||||||
|
<cfif len(validationMessage)>
|
||||||
|
<cfreturn representationOf(this.helper.formatMessage("Inconsistent CFS parameters", #validationMessage#)).withStatus(422)/>
|
||||||
|
</cfif>
|
||||||
|
|
||||||
|
<cfreturn noData().withStatus(204, "OK") />
|
||||||
|
</cffunction>
|
||||||
|
|
||||||
|
</cfcomponent>
|
||||||
Reference in New Issue
Block a user