This commit is contained in:
msyu
2025-03-13 17:46:49 +03:00
parent 6a9dbf19b4
commit 4ec5b2bf69
3 changed files with 101 additions and 45 deletions
+70 -34
View File
@@ -51,7 +51,7 @@
//variables.framework.docs={};
variables.framework.docs.APIName="Deck API";
variables.framework.docs.APIVersion="0.067";
variables.framework.docs.APIVersion="0.068";
variables.framework.globalHeaders = structNew();
variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location";
@@ -98,7 +98,28 @@
<cfreturn (arguments.x NEQ 0)/><!--- при сериализации дает false/true --->
</cfif>
</cffunction>
<cfset request.castToBool=#castToBool#/>
<cfset request.castToBool=#castToBool#/>
<!--- <cffunction
name="getStand"
access="private"
returntype="string"
output="true">
<cftry>
<cfquery name=qConfig>
select value as stand from config
where name='STAND'
</cfquery>
<cfreturn qConfig.stand/>
<cfcatch type="ANY">
</cfcatch>
</cftry>
<cfreturn ""/>
</cffunction> --->
<cffunction name="onApplicationStart">
@@ -108,9 +129,38 @@
<cfset this.iamServiceUrl=locateIamService()/> <!--- ***при недоступности будет падать все --->
<cfreturn super.onApplicationStart() />
</cffunction>
<cffunction name="locateIamService"><!--- *** архитектурный колхоз --->
<cffunction name="locateIamService"><!--- *** архитектурный колхоз --->
<!--- почему-то мы не видим других функций, когда нас вызывают onApplicationStart. С другой стороны, а почем вообще должны вызывать без перезагрузки приложения --->
<cfset var stand=""/>
<cftry>
<cfquery name=qConfig>
select value as stand from config
where name='STAND'
</cfquery>
<cfset stand = qConfig.stand/>
<cfswitch expression=#stand#>
<cfcase value=",dev">
<cfreturn "https://deck-dev.ngcloud.ru/api/v1/user"/>
</cfcase>
<cfcase value="test">
<cfreturn "https://deck-test.ngcloud.ru/api/v1/user"/>
</cfcase>
<cfcase value="prod">
<cfreturn "https://deck.ngcloud.ru/api/v1/user"/>
</cfcase>
<cfdefaultcase><!--- proceed to the legacy locator ---></cfdefaultcase>
</cfswitch>
<cfcatch type="ANY">
<!--- do nothing, proceed to the legacy locator --->
</cfcatch>
</cftry>
<!--- вот если ничего не прописано, попробуем по-старинке --->
<cfloop list="https://deck-dev.ngcloud.ru/api/v1/user,https://deck-test.ngcloud.ru/api/v1/user,https://deck.ngcloud.ru/api/v1/user" index="serviceUrl"><!--- *** начиная с девелоперского --->
<cftry>
<cfhttp url=#serviceUrl# method="OPTIONS" result="resp" timeout=1/>
@@ -132,6 +182,8 @@
<cfreturn super.onRequest(template) />
</cffunction> --->
<cfscript>
function onTaffyRequest(verb, cfc, requestArguments, mimeExt, headers){
@@ -220,7 +272,19 @@
if (structIsEmpty(usrCustomerInfo)) return representationOf("User information not found").withStatus(404);
}
if (lCase(arguments.cfc) EQ 'notification_ls') { //*** костыль: для нотификаций можно адресоваться к пользователю без контракта
if (structIsEmpty(usrCustomerInfo)) {
arguments.requestArguments.usrId=-1; //Integer!
arguments.requestArguments.contragentId=-1; //Integer
arguments.requestArguments.contractId=-1; //Integer
arguments.requestArguments.specificationId=-1; //Integer
return true;
}
}
if (structIsEmpty(usrCustomerInfo)) return representationOf("Cannot find default specification for current user #result#").withStatus(422); //это создает довольно много лишних движений при отладке
arguments.requestArguments.usrId=usrCustomerInfo.usrId; //Integer!
arguments.requestArguments.contragentId=usrCustomerInfo.contragentId; //Integer
arguments.requestArguments.contractId=usrCustomerInfo.contractId; //Integer
@@ -271,35 +335,7 @@
вероятно, лучше сделать токен девайса
--->
<cffunction name="validatePin" access="private">
<cfargument name="authToken"/>
<cfargument name="issuedFor"/>
<cfargument name="verb"/>
<cfargument name="cfc"/> <!---для всех запросов, кроме GET,OPTIONS проверяем разрешенные CFC--->
<!---catch db issue--->
<cfquery name="qCheckToken">
select creator_id
from auth_token
where auth_token=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.authToken#" />
AND issued_for=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.issuedFor#" />
AND dt_valid_till > <cfqueryparam cfsqltype="cf_sql_timestamp" value="#Now()#" />
</cfquery>
<!---тут можно добавить защиту от перебора с блокировкой попыток (можно добавить поле-счетчик ошибок)--->
<!--- <cfdump var=#qCheckToken#/>--->
<cfif qCheckToken.recordCount GT 0>
<cfset request.usr_id=qCheckToken.creator_id /> <!---impersonate pin issuer--->
<cfif uCase(arguments.verb) EQ "GET" OR uCase(arguments.verb) EQ "OPTIONS">
<cfreturn true/>
<cfelseif listFind("work_order,maint,maint_ls,maint_op,maint_op_ls,work_order_engineer_signature,work_order_spare_ls,work_order_spare,work_order_doc,maint_start,maint_doc_ls,maint_op_spare,maint_op_spare_ls,maint_doc", lCase(arguments.cfc))>
<cfreturn true/>
</cfif>
</cfif>
<cfreturn false/>
</cffunction>
<cffunction name="checkAuth">
<!---https://www.sjoerdlangkemper.nl/2018/09/12/authorization-header-and-cors/--->
@@ -342,8 +378,8 @@
<cffunction name="getUsrCustomerInfo">
<cfargument name="usrUid"/>
<!--- глупейшее определение спецификации по умолчанию (надо переделать, чтобы создавалась, или вообще просто записывать факты без спеки). Но помним, что при постановке на тестирование цены еше не фиксированы --->
<!--- заметим, что у нас контрагент может быть определен параллельно, от IDP --->
<cfset local={}/>
@@ -805,7 +841,7 @@
</cfif>
<cfreturn true />
</cffunction>
</cffunction>
<!--- <cffunction name="checkForLocalDebug">
+18 -5
View File
@@ -128,7 +128,10 @@
<!--- поступим проще, по engine/generate_rfs_12.cfm --->
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "instanceUid", qSvcOperation.instance_uid)/>
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "operationUid", arguments.instanceOperationUid)/>
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "modifierId", #arguments.usrId#)/>
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "modifierId", arguments.usrId)/>
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "contragentId", arguments.contragentId)/>
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "contractId", arguments.contractId)/>
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "contragentCode", getContragentCode(arguments.contragentId))/>
<cfquery name="qWriteRfsFromCfsParams">
insert into instance_operation_param (instance_operation_uid,param,param_value)
@@ -187,8 +190,7 @@
set dt_submit=<cfqueryparam cfsqltype="cf_sql_timestamp" value=#now()#/>
,dt_start=null, dt_finish=null, submit_result='0'
where instance_operation_uid=<cfqueryparam cfsqltype="cf_sql_other" value=#arguments.instanceOperationUid#/>
</cfquery>
</cfquery>
<cftry>
@@ -254,8 +256,7 @@
<cfrethrow/><!--- пока не придумал --->
</cfcatch>
</cftry>
</cfif>
</cfif>
</cffunction>
<!--- *** судя по всему, RFS параметр не обязан быть специфицирован на сервисе (никак не проверяется) --->
@@ -304,5 +305,17 @@
</cfcatch>
</cftry>
</cffunction>
<cffunction name="getContragentCode">
<cfargument name="contragentId">
<cfquery name="qContragentCode">
select contragent_code
from contragent
where contragent_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.contragentId# null=#!isNumeric(arguments.contragentId)#/>
</cfquery>
<cfreturn #qContragentCode.contragent_code#/>
</cffunction>
</cfcomponent>
+13 -6
View File
@@ -7,10 +7,14 @@
<!---спецификация полей, пригодных для фильтрации (?и сортировки)--->
<cfset this.fieldsSpec={
dt_created={prefix="s", type="date"},
dt_updated={prefix="s", type="date"},
svc_id={prefix="s", type="integer"},
svc={prefix="s", type="string"}
dt_created={prefix="n", type="date"},
dt_updated={prefix="n", type="date"},
dt_show_from={prefix="n", type="date"},
dt_show_to={prefix="n", type="date"},
contragent_id={prefix="n", type="integer"},
timeout_sec={prefix="n", type="integer"},
external_uid={prefix="n", type="guid"},
external_code={prefix="n", type="string"}
}
/>
@@ -53,6 +57,8 @@
<m:field>n.notification_uid::text as notification_uid</m:field>
<m:field>n.notification</m:field>
<m:field>n.descr</m:field>
<m:field>n.url</m:field>
<m:field>n.timeout_sec</m:field>
<m:field>n.contragent_id</m:field>
<m:field>k.external_uid</m:field>
<!--- <m:field><cfqueryparam cfsqltype="cf_sql_other" value=#arguments.companyUid#/> as arguments_company_uid</m:field> --->
@@ -69,8 +75,9 @@
AND (k.external_uid = <cfqueryparam cfsqltype="cf_sql_other" value=#arguments.companyUid#/> OR n.contragent_id IS NULL)
order by dt_show_from desc
<!--- <m:order_build sortCollection=#this.helper.parseNumericOrder(local.titleMap, arguments.orderBy)# fieldCount=0/>--->
--limit #maxrows#
</cfquery>
limit #maxrows#
</cfquery>
<!--- <cfdump var=#local.qRead#/><cfabort/> --->
<cfquery name="local.qTotal">