195 instance_operation validate-cfs

This commit is contained in:
2025-12-16 18:29:59 +03:00
parent 18257719e3
commit 46f7a78ba2
6 changed files with 105 additions and 6 deletions
+60
View File
@@ -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>