svc_default

This commit is contained in:
msyu
2024-11-15 16:00:40 +03:00
parent 43eca3da56
commit 34e914fd7e
4 changed files with 140 additions and 9 deletions
+1 -1
View File
@@ -71,7 +71,7 @@
//variables.framework.docs={};
variables.framework.docs.APIName="Deck API";
variables.framework.docs.APIVersion="0.020";
variables.framework.docs.APIVersion="0.021";
variables.framework.globalHeaders = structNew();
variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location";
+51 -3
View File
@@ -182,17 +182,18 @@
<cfargument name="descr" type="string" required=false default="" hint="type:varchar (no cleanup here!)"/>
<!--- ****** проверка уникальности --->
<cftry>
<cftry>
<cfset checkDisplayName(arguments.displayName, arguments.usrId, arguments.instanceUid)/><!--- как идея - офорить как обертку, возвращающую то же значение. Но будет соблазн еще оттримить иначе пофиксить, а это уже избыточная функция и должно усложнить название --->
<cfset this.helper.keyExistsAndValid(arguments, "instanceUid", "guid")/>
<cfquery name="local.qSave">
update instance set
dt_updated=<cfqueryparam cfsqltype="cf_sql_timestamp" value="#Now()#" />
,updater_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.usrId#" />
<cfif structKeyExists(arguments,"displayName")>
,display_name=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.displayName#" />
,display_name=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.displayName#" />
</cfif>
<cfif structKeyExists(arguments,"descr")>
,descr=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.descr#" />
,descr=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.descr#" />
</cfif>
where instance_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceUid#" />;
--select @@rowcount as cnt;
@@ -209,5 +210,52 @@
<cfreturn noData().withStatus(204, "No Content") />
</cffunction>
<!--- <cffunction name="checkDisplayName" access="public" hint="возвращает пустую строку при успешной проверке, иначе описание ошибки">
<cfargument name="display_name"/>
<cfargument name="usr_id"/>
<cfargument name="instance_uid"/>
<cfif len(arguments.display_name) LT 3>
<cfthrow type="invalidParamValue" message="Имя должно быть не короче 3 символов"/>/>
<cfelseif len(arguments.display_name) GT 80>
<cfthrow type="invalidParamValue" message="Имя должно быть не длиннее 80 символов"/>/>
<cfelse>
<cfquery name="qUniqueDisplayName">
select count(*) as cnt from instance e
join specification_item i on (e.specification_item_id=i.specification_item_id)
join specification s on (i.specification_id=s.specification_id)
join contract d on (s.contract_id=d.contract_id)
join contragent k on (d.contragent_id=k.contragent_id)
join usr u on (k.contragent_id=u.contragent_id)
where u.usr_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.usr_id#/>
AND lower(e.display_name)=lower(<cfqueryparam cfsqltype="cf_sql_varchar" value=#arguments.display_name#/>)
AND e.instance_uid <> <cfqueryparam cfsqltype="cf_sql_other" value=#arguments.instance_uid#/>
</cfquery>
<cfif qUniqueDisplayName.cnt GT 0>
<cfthrow type="invalidParamValue" message="Имя должно быть уникальным"/><!--- *** в пределах контракта/спецификации --->
</cfif>
</cfif>
</cffunction> ---><!--- *** оказывается, я независимо реализовал почти точно такую же функцию для POST, и забыл --->
<!--- неудобно бегать из одного компонента в соседний при том, что разделение ответственности между ними получается довольно странное
Решил, что логичнее повесить проверки уникальности и генерацию дефолтов на коллекцию, тем более и связей так меньше --->
<cffunction name="checkDisplayName">
<cfargument name="displayName" required=true/>
<cfargument name="usrId" type="numeric" required=true/>
<cfargument name="instanceUid" type="guid" required=true/>
<cfset CreateObject("component", "instance_ls").checkDisplayName(arguments.displayName, arguments.usrId, arguments.instanceUid)/>
</cffunction>
<!--- <cffunction name="generateDefaultName">
<cfargument name="service_id" type="numeric"/>
<cfreturn CreateObject("component", "instance_ls").generateDefaultName(arguments.service_id)/>
</cffunction> --->
</cfcomponent>
+52 -5
View File
@@ -155,14 +155,18 @@
<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="instanceUid" type="string" required=false default="" hint="type:guid)"/> --->
<!--- <cfargument name="usrUid" type="string" required=true hint="type:guid"/>
<cfargument name="companyUid" type="string" required=true hint="type:guid"/> --->
<!--- оказывается, их можно и не декларировать --->
<cfset local={}/>
<cfset local.instanceUid=#createGUID()#/>
<!--- <cfdump var=#arguments#/><cfabort/> --->
<!--- <cfif structKeyExists(arguments,"instanceUid")>
<cfset local.instanceUid=arguments.instanceUid/>
<cfelse> --->
<cfset local.instanceUid=#createGUID()#/>
<!--- </cfif> --->
<cftry>
<cfset this.helper.keyExistsAndValid(arguments, "serviceId", "integer")/>
@@ -214,19 +218,22 @@
/>
</cffunction>
<cffunction name="checkDisplayName">
<cfargument name="displayName" required=true/>
<cfargument name="usrId" type="numeric" required=true/>
<cfargument name="instanceUid" type="guid" required=true/>
<cfset var display_name=trim(lcase(arguments.displayName))/>
<cfset var local={}/>
<cfset var display_name=trim(lcase(arguments.displayName))/>
<cfif len(display_name) LT 3>
<cfthrow type="InvalidParamValue" message="Instance Display Name too short" detail="Имя должно быть не короче 3 символов"/>
<cfelseif len(display_name) GT 80>
<cfthrow type="InvalidParamValue" message="Instance Display Name too long" detail="Имя должно быть не длиннее 80 символов"/>
<cfelse>
<cfquery name="qUniqueDisplayName">
<cfquery name="local.qUniqueDisplayName">
select count(*) as cnt from instance e
join specification_item i on (e.specification_item_id=i.specification_item_id)
join specification s on (i.specification_id=s.specification_id)
@@ -237,10 +244,50 @@
AND lower(e.display_name)=lower(<cfqueryparam cfsqltype="cf_sql_varchar" value=#arguments.displayName#/>)
AND e.instance_uid <> <cfqueryparam cfsqltype="cf_sql_other" value=#arguments.instanceUid#/>
</cfquery>
<cfif qUniqueDisplayName.cnt GT 0>
<cfif local.qUniqueDisplayName.cnt GT 0>
<cfthrow type="InvalidParamValue" message="Instance Display Name not unique" detail="Имя экземпляра должно быть уникальным в рамках договора"/>
</cfif>
</cfif>
</cffunction>
<cffunction name="generateDefaultName" returnType="string">
<!--- *** Это некорректно, потому что имя может содержать пробелы и т.п. --->
<!--- *** Неуклюже и медленно --->
<!--- Эти валидации и генерации занимают удивительно много рабочего времени --->
<cfargument name="service_id" type="numeric"/>
<cfargument name="usr_id" type="numeric"/>
<cfset var local={}/>
<cfquery name="local.qSvc">
select svc from svc where svc_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.service_id#/>
</cfquery>
<cfquery name="local.qInst">
select display_name
from instance e
join specification_item i on (e.specification_item_id=i.specification_item_id)
join specification s on (i.specification_id=s.specification_id)
join contract d on (s.contract_id=d.contract_id)
join contragent k on (d.contragent_id=k.contragent_id)
join usr u on (k.contragent_id=u.contragent_id)
where u.usr_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.usr_id#/>
AND lower(e.display_name) like lower(<cfqueryparam cfsqltype="cf_sql_varchar" value="#local.qSvc.svc#%"/>)
AND service_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.service_id#/>
</cfquery>
<cfset var prefixLen=len(local.qSvc.svc)+1/>
<cfset var i=1/>
<cfloop query="local.qInst">
<cfif len(local.qInst.display_name) GT prefixLen>
<cfset var suffix=right(local.qInst.display_name, len(local.qInst.display_name)-prefixLen)/>
<cfif isValid("integer",suffix)>
<cfset i=(i GT int(suffix))?i:int(suffix)/>
</cfif>
</cfif>
</cfloop>
<cfreturn "#local.qSvc.svc#-#i+1#"/>
</cffunction>
</cfcomponent>
+36
View File
@@ -0,0 +1,36 @@
<cfcomponent extends="taffy.core.resource" taffy:uri="/services/{svcId}/default" hint="template for default instance (экспериментальный)">
<cfsilent>
<cfimport prefix="m" taglib="../lib"/>
<cfset this.helper=CreateObject("component","lib.rest_api_helper")/>
</cfsilent>
<cffunction name="get" hint="Шаблон экземпляра"><!--- *** TODO проверка принадлежности тенанту --->
<cfargument name="svcId" type="string" required=true hint="type:integer"/>
<cfargument name="usrId" type="string" required=true hint="type:integer"/><!--- arguments.usrId неявно вбрасывается из Application.cfm --->
<cftry>
<cfset this.helper.validateField(arguments, "svcId", "integer")/>
<cfcatch type="invalidParamValue">
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
</cfcatch>
</cftry>
<cfset var out = {
"svcId":"#arguments.svcId#",
"displayName":"#generateDefaultName(arguments.svcId,arguments.usrId)#",
"descr":""
}/>
<cfset "out.queryDurationMs"=getTickCount() - request.startTickCount/>
<cfset "out.runDurationMs"=getTickCount() - request.startTickCount/>
<cfreturn representationOf(out) />
</cffunction>
<!--- хотя такая зависимость очень не нравится своим направлением, как бы задом наперед--->
<cffunction name="generateDefaultName">
<cfargument name="service_id" type="numeric"/>
<cfargument name="usr_id" type="numeric"/>
<cfreturn CreateObject("component", "instance_ls").generateDefaultName(arguments.service_id,arguments.usr_id)/>
</cffunction>
</cfcomponent>