088 instance_ls filtering and sorting fixed

This commit is contained in:
msyu
2025-04-09 16:47:15 +03:00
parent ce8a86f4f2
commit 70e4471893
2 changed files with 35 additions and 20 deletions
+1 -1
View File
@@ -51,7 +51,7 @@
//variables.framework.docs={};
variables.framework.docs.APIName="Deck API";
variables.framework.docs.APIVersion="0.087";
variables.framework.docs.APIVersion="0.088";
variables.framework.globalHeaders = structNew();
variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location";
+34 -19
View File
@@ -8,17 +8,19 @@
<!---спецификация полей, пригодных для фильтрации (?и сортировки)--->
<cfset this.fieldsSpec={
"instance_uid"={prefix="inr", type="guid"},
"dt_created"={prefix="inr", type="date"},
"dt_updated"={prefix="inr", type="date"},
"instance_config_dt_created"={prefix="inr", type="date"},
"instance_config_dt_updated"={prefix="inr", type="date"},
"display_name"={prefix="inr", type="string"},
"service_id"={prefix="inr", type="integer"},
"specification_item_id"={prefix="inr", type="integer"},
"contract_id"={prefix="inr", type="integer"},
"specification"={prefix="inr", type="string"},
"specification_id"={prefix="inr", type="integer"},
"contract_id"={prefix="inr", type="integer"},
"svc"={prefix="inr", type="string"},
"code"={prefix="inr", type="string"},
"updater_id"={prefix="inr", type="integer"},
"updater_shortname"={prefix="inr", type="string"},
"updater_login"={prefix="inr", type="string"},
"last_operation"={prefix="inr", type="string"},
"last_operation_uid"={prefix="inr", type="guid"},
"submit_result"={prefix="inr", type="string"},
@@ -31,11 +33,12 @@
"instance_state_uid"={prefix="inr", type="guid"},
"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"},
"resource_realm"={prefix="inr", type="string"},
"operation_is_in_progress"={prefix="inr", type="boolean"},
"is_test"={prefix="inr", type="boolean"},
"is_auxiliary"={prefix="inr", type="boolean"},
"explained_status"={prefix="inr", type="string"},
"dt_state"={prefix="inr", type="date"},
"version"={prefix="inr", type="integer"}
}
/>
@@ -59,17 +62,22 @@
<cfset var filter=this.helper.parseFilterParams(this.fieldsSpec)/>
<cfset var order=this.helper.parseOrderBy(this.fieldsSpec, arguments.orderBy)/>
<cfset local.fieldsToOutput=""/>
<cfloop collection=#this.fieldsSpec# item="fld">
<!--- <cfoutput>#this.helper.snake2camel(trim(fld))#</cfoutput> --->
<!--- *** в данном случае мы некорректно ограничиваем состав выводимых полей
полями, перечисленными в fieldSpec --->
<cfif listFind(arguments.fields, this.helper.snake2camel(trim(fld)))
OR structKeyExists(order,this.helper.snake2camel(trim(fld)))>
<cfset local.fieldsToOutput=listAppend(local.fieldsToOutput,trim(fld))/>
</cfif>
</cfloop>
<cfset local.fieldsToQueryFor=local.fieldsToOutput/>
<cfset local.fieldsToOutput=""/>
<!--- <cfif listLen(arguments.fields)> ---><!--- *** если идти от arguments.fields, будет лаконичнее --->
<cfloop collection=#this.fieldsSpec# item="fld">
<!--- <cfoutput>#this.helper.snake2camel(trim(fld))#</cfoutput> --->
<!--- *** в данном случае мы некорректно ограничиваем состав выводимых полей
полями, перечисленными в fieldSpec --->
<cfif listFind(arguments.fields, this.helper.snake2camel(trim(fld)))
OR len(arguments.fields) EQ 0
/* OR structKeyExists(order,this.helper.snake2camel(trim(fld))) */>
<cfset local.fieldsToOutput=listAppend(local.fieldsToOutput,trim(fld))/>
</cfif>
</cfloop>
<!--- </cfif> --->
<!--- <cfdump var=#local.fieldsToOutput#/><cfabort/> --->
<cfset local.fieldsToQueryFor = local.fieldsToOutput/>
<cfset local.fieldsShortList=""/>
<!--- теперь добавим в перечень полей, которые нужно оставить, поля для фильтрации и сортировки --->
@@ -112,6 +120,13 @@
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
</cfcatch>
</cftry>
<!--- *********** 2DO ShortList --->
<!---
<cfdump var=#order#/>
<cfdump var=#local.fieldsToQueryFor#/>
@@ -167,7 +182,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 resource_realm</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
@@ -287,8 +302,8 @@
<!---<cfset "out.sql"=#local.result.sql#/>--->
<cfreturn representationOf(out)/>
<cfcatch type="any">
<cfreturn representationOf(cfcatch.message).withStatus(500)/>
<cfcatch type="any"> <!--- {"message"=cfcatch.message, "detail"=cfcatch.detail} --->
<cfreturn representationOf(cfcatch).withStatus(500)/>
</cfcatch>
</cftry>
</cffunction>