@@ -2,7 +2,9 @@ import Scf from '../scf';
22import { TriggerManager } from './manager' ;
33import { CapiCredentials , RegionType } from './../interface' ;
44import BaseTrigger from './base' ;
5- import { HttpTriggerInputsParams , TriggerInputs , CreateTriggerReq } from './interface' ;
5+ import { HttpTriggerInputsParams , TriggerInputs , CreateTriggerReq , TriggerAction } from './interface' ;
6+ import { caseForObject } from '../../utils' ;
7+ import { getScfTriggerByName } from './utils' ;
68
79export default class HttpTrigger extends BaseTrigger < HttpTriggerInputsParams > {
810 credentials : CapiCredentials ;
@@ -15,31 +17,33 @@ export default class HttpTrigger extends BaseTrigger<HttpTriggerInputsParams> {
1517 }
1618
1719 getKey ( triggerInputs : CreateTriggerReq ) {
18- const triggerDesc = JSON . parse ( triggerInputs . TriggerDesc ! ) ;
19- const tempDest = JSON . stringify ( {
20- authType : triggerDesc ?. AuthType ,
21- enableIntranet : triggerDesc ?. NetConfig ?. EnableIntranet ,
22- enableExtranet : triggerDesc ?. NetConfig ?. EnableExtranet ,
23- } ) ;
24- return `http-${ tempDest } -${ triggerInputs . Qualifier } ` ;
20+ return `http-${ triggerInputs ?. TriggerName } ` ;
2521 }
2622
27- formatInputs ( { inputs } : { region : RegionType ; inputs : TriggerInputs < HttpTriggerInputsParams > } ) {
23+ formatInputs ( { inputs, action = 'CreateTrigger' } : { region : RegionType ; inputs : TriggerInputs < HttpTriggerInputsParams > , action ?: TriggerAction } ) {
2824 const { parameters } = inputs ;
25+ const triggerName = parameters ?. name || 'url-trigger' ;
26+ const { origins, headers, methods, exposeHeaders } = parameters ?. corsConfig || { }
2927 const triggerInputs : CreateTriggerReq = {
30- Action : 'CreateTrigger' ,
28+ Action : action ,
3129 FunctionName : inputs . functionName ,
3230 Namespace : inputs . namespace ,
33-
3431 Type : 'http' ,
3532 Qualifier : parameters ?. qualifier || '$DEFAULT' ,
36- TriggerName : parameters ?. name || 'url-trigger' ,
33+ TriggerName : triggerName ,
3734 TriggerDesc : JSON . stringify ( {
3835 AuthType : parameters ?. authType || 'NONE' ,
3936 NetConfig : {
4037 EnableIntranet : parameters ?. netConfig ?. enableIntranet ?? false ,
4138 EnableExtranet : parameters ?. netConfig ?. enableExtranet ?? false ,
4239 } ,
40+ CorsConfig : parameters ?. corsConfig ? caseForObject ( {
41+ ...parameters ?. corsConfig ,
42+ origins : typeof origins === 'string' ? origins ?. split ( ',' ) : origins ,
43+ methods : typeof methods === 'string' ? methods ?. split ( ',' ) : methods ,
44+ headers : typeof headers === 'string' ? headers ?. split ( ',' ) : headers ,
45+ exposeHeaders : typeof exposeHeaders === 'string' ? exposeHeaders ?. split ( ',' ) : exposeHeaders ,
46+ } , 'upper' ) : undefined
4347 } ) ,
4448 Enable : 'OPEN' ,
4549 } ;
@@ -61,12 +65,29 @@ export default class HttpTrigger extends BaseTrigger<HttpTriggerInputsParams> {
6165 region : RegionType ;
6266 inputs : TriggerInputs < HttpTriggerInputsParams > ;
6367 } ) {
64- const { triggerInputs } = this . formatInputs ( { region, inputs } ) ;
65- console . log ( `Creating ${ triggerInputs . Type } trigger ${ triggerInputs . TriggerName } ` ) ;
66- const { TriggerInfo } = await scf . request ( triggerInputs ) ;
67- TriggerInfo . Qualifier = TriggerInfo . Qualifier || triggerInputs . Qualifier ;
68-
69- return TriggerInfo ;
68+ // 查询当前触发器是否已存在
69+ const existTrigger = await getScfTriggerByName ( { scf, region, inputs } ) ;
70+ // 更新触发器
71+ if ( existTrigger ) {
72+ const { triggerInputs } = this . formatInputs ( { region, inputs, action : 'UpdateTrigger' } ) ;
73+ console . log ( `${ triggerInputs . Type } trigger ${ triggerInputs . TriggerName } is exist` )
74+ console . log ( `Updating ${ triggerInputs . Type } trigger ${ triggerInputs . TriggerName } ` ) ;
75+ try {
76+ // 更新触发器
77+ await scf . request ( triggerInputs ) ;
78+ // 更新成功后,查询最新的触发器信息
79+ const trigger = await getScfTriggerByName ( { scf, region, inputs } ) ;
80+ return trigger ;
81+ } catch ( error ) {
82+ return { }
83+ }
84+ } else { // 创建触发器
85+ const { triggerInputs } = this . formatInputs ( { region, inputs } ) ;
86+ console . log ( `Creating ${ triggerInputs . Type } trigger ${ triggerInputs . TriggerName } ` ) ;
87+ const { TriggerInfo } = await scf . request ( triggerInputs ) ;
88+ TriggerInfo . Qualifier = TriggerInfo . Qualifier || triggerInputs . Qualifier ;
89+ return TriggerInfo ;
90+ }
7091 }
7192
7293 async delete ( {
0 commit comments