195 instance_operation validate-cfs
This commit is contained in:
@@ -236,7 +236,67 @@
|
||||
<cfreturn representationOf(out) />
|
||||
</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>
|
||||
Reference in New Issue
Block a user