Skip to content

Commit 54b3c2c

Browse files
author
Pieter
committed
Include function message trigger for NATS event
1 parent f430907 commit 54b3c2c

File tree

3 files changed

+106
-15
lines changed

3 files changed

+106
-15
lines changed

deploy/lib/deployTriggers.js

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,13 @@ module.exports = {
4343

4444
deletePreviousTriggersForApplication(application) {
4545
// Delete and re-create every triggers...
46-
const deleteTriggersPromises = application.currentTriggers.map((trigger) =>
47-
this.deleteTrigger(trigger.id)
46+
const deleteTriggersPromises = application.currentTriggers.map((trigger) => {
47+
if ('schedule' in trigger) {
48+
this.deleteCronTrigger(trigger.id)
49+
} else {
50+
this.deleteMessageTrigger(trigger.id)
51+
}
52+
}
4853
);
4954

5055
return Promise.all(deleteTriggersPromises);
@@ -65,11 +70,20 @@ module.exports = {
6570
return [];
6671
}
6772

68-
const createTriggersPromises = serverlessApp.events.map((event) =>
69-
this.createTrigger(application.id, isFunction, {
70-
schedule: event.schedule.rate,
71-
args: event.schedule.input || {},
72-
})
73+
const createTriggersPromises = serverlessApp.events.map((event) => {
74+
if ('schedule' in event) {
75+
this.createCronTrigger(application.id, isFunction, {
76+
schedule: event.schedule.rate,
77+
args: event.schedule.input || {},
78+
})
79+
}
80+
if ('nats' in event) {
81+
this.createMessageTrigger(application.id, {
82+
name: event.nats.name,
83+
scw_nats_config: event.nats.scw_nats_config,
84+
})
85+
}
86+
}
7387
);
7488

7589
return Promise.all(createTriggersPromises);

shared/api/triggers.js

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,28 @@
33
const { manageError } = require("./utils");
44

55
module.exports = {
6-
listTriggersForApplication(applicationId, isFunction) {
7-
let triggersUrl = `crons?function_id=${applicationId}`;
6+
async listTriggersForApplication(applicationId, isFunction) {
7+
let cronTriggersUrl = `crons?function_id=${applicationId}`;
88
if (!isFunction) {
9-
triggersUrl = `crons?container_id=${applicationId}`;
9+
cronTriggersUrl = `crons?container_id=${applicationId}`;
1010
}
11-
return this.apiManager
12-
.get(triggersUrl)
11+
const cronTriggers = await this.apiManager
12+
.get(cronTriggersUrl)
1313
.then((response) => response.data.crons)
1414
.catch(manageError);
15+
16+
const messageTriggers = await this.apiManager
17+
.get(`triggers?function_id=${applicationId}`)
18+
.then((response) => response.data.triggers)
19+
.catch(manageError);
20+
21+
return [
22+
...cronTriggers,
23+
...messageTriggers
24+
]
1525
},
1626

17-
createTrigger(applicationId, isFunction, params) {
27+
createCronTrigger(applicationId, isFunction, params) {
1828
let payload = {
1929
...params,
2030
function_id: applicationId,
@@ -32,18 +42,37 @@ module.exports = {
3242
.catch(manageError);
3343
},
3444

35-
updateTrigger(triggerId, params) {
45+
createMessageTrigger(applicationId, params) {
46+
let payload = {
47+
...params,
48+
function_id: applicationId,
49+
};
50+
51+
return this.apiManager
52+
.post("triggers", payload)
53+
.then((response) => response.data)
54+
.catch(manageError);
55+
},
56+
57+
updateCronTrigger(triggerId, params) {
3658
const updateUrl = `crons/${triggerId}`;
3759
return this.apiManager
3860
.patch(updateUrl, params)
3961
.then((response) => response.data)
4062
.catch(manageError);
4163
},
4264

43-
deleteTrigger(triggerId) {
65+
deleteCronTrigger(triggerId) {
4466
return this.apiManager
4567
.delete(`crons/${triggerId}`)
4668
.then((response) => response.data)
4769
.catch(manageError);
4870
},
71+
72+
deleteMessageTrigger(triggerId) {
73+
return this.apiManager
74+
.delete(`triggers/${triggerId}`)
75+
.then((response) => response.data)
76+
.catch(manageError);
77+
},
4978
};

shared/validate.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,22 @@ const cronScheduleRegex = new RegExp(
2929
/^((((\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*) ?){5,7})$/
3030
);
3131

32+
const triggerNameRegex = new RegExp(
33+
/^([a-zA-Z0-9-]){2,100}$/
34+
)
35+
36+
const triggerNatsAccountIdRegex = new RegExp(
37+
/^([A-Z0-9]){56}$/
38+
)
39+
40+
const triggerNatsProjectIdRegex = new RegExp(
41+
/^([a-z0-9]){8}-([a-z0-9]){4}-([a-z0-9]){4}-([a-z0-9]){4}-([a-z0-9]){12}$/
42+
)
43+
44+
const triggerNatsSubjectRegex = new RegExp(
45+
/^([a-z\*>.]){1,100}$/
46+
)
47+
3248
const TRIGGERS_VALIDATION = {
3349
schedule: (trigger) => {
3450
if (!trigger.rate || !cronScheduleRegex.test(trigger.rate)) {
@@ -37,6 +53,38 @@ const TRIGGERS_VALIDATION = {
3753
);
3854
}
3955
},
56+
nats: (trigger) => {
57+
if (!trigger.name || !triggerNameRegex.test(trigger.name)) {
58+
throw new Error(
59+
`Trigger Schedule is invalid: ${trigger.name}, name is invalid, should match regex: ${triggerNameRegex.toString()}`
60+
);
61+
}
62+
if (!trigger.scw_nats_config) {
63+
throw new Error(
64+
`Trigger Schedule is invalid: ${trigger.name}, scw_nats_config is missing`
65+
);
66+
}
67+
if (!trigger.scw_nats_config.subject ||!triggerNatsSubjectRegex.test(trigger.scw_nats_config.subject)) {
68+
throw new Error(
69+
`Trigger Schedule is invalid: ${trigger.name}, scw_nats_config.subject is invalid, should match regex: ${triggerNatsSubjectRegex.toString()}`
70+
);
71+
}
72+
if (!trigger.scw_nats_config.mnq_nats_account_id ||!triggerNatsAccountIdRegex.test(trigger.scw_nats_config.mnq_nats_account_id)) {
73+
throw new Error(
74+
`Trigger Schedule is invalid: ${trigger.name}, scw_nats_config.mnq_nats_account_id is invalid, should match regex: ${triggerNatsAccountIdRegex.toString()}`
75+
);
76+
}
77+
if (!trigger.scw_nats_config.mnq_project_id ||!triggerNatsProjectIdRegex.test(trigger.scw_nats_config.mnq_project_id)) {
78+
throw new Error(
79+
`Trigger Schedule is invalid: ${trigger.name}, scw_nats_config.mnq_project_id is invalid, should match regex: ${triggerNatsProjectIdRegex.toString()}`
80+
);
81+
}
82+
if (!trigger.scw_nats_config.mnq_region ||!REGION_LIST.includes(trigger.scw_nats_config.mnq_region)) {
83+
throw new Error(
84+
`Trigger Schedule is invalid: ${trigger.name}, scw_nats_config.region is unknown}`
85+
);
86+
}
87+
}
4088
};
4189

4290
module.exports = {

0 commit comments

Comments
 (0)