1 | 'use strict'
|
2 |
|
3 | class ScheduleEvents {
|
4 | constructor (aws, region) {
|
5 |
|
6 | this.lambda = new aws.Lambda({
|
7 | region: region,
|
8 | apiVersion: '2015-03-31'
|
9 | })
|
10 | this.cloudwatchevents = new aws.CloudWatchEvents({
|
11 | apiVersion: '2015-10-07'
|
12 | })
|
13 | }
|
14 |
|
15 | _ruleDescription (params) {
|
16 | if ('ScheduleDescription' in params && params.ScheduleDescription != null) {
|
17 | return `${params.ScheduleDescription}`
|
18 | }
|
19 | return `${params.ScheduleName} - ${params.ScheduleExpression}`
|
20 | }
|
21 |
|
22 | _functionName (params) {
|
23 | return params.FunctionArn.split(':').pop()
|
24 | }
|
25 |
|
26 | _putRulePrams (params) {
|
27 | return {
|
28 | Name: params.ScheduleName,
|
29 | Description: this._ruleDescription(params),
|
30 | State: params.ScheduleState,
|
31 | ScheduleExpression: params.ScheduleExpression
|
32 | }
|
33 | }
|
34 |
|
35 | _putRule (params) {
|
36 |
|
37 | return new Promise((resolve, reject) => {
|
38 | const _params = this._putRulePrams(params)
|
39 | this.cloudwatchevents.putRule(_params, (err, rule) => {
|
40 | if (err) reject(err)
|
41 | resolve(rule)
|
42 | })
|
43 | })
|
44 | }
|
45 |
|
46 | _addPermissionParams (params) {
|
47 | return {
|
48 | Action: 'lambda:InvokeFunction',
|
49 | FunctionName: this._functionName(params),
|
50 | Principal: 'events.amazonaws.com',
|
51 | SourceArn: params.RuleArn,
|
52 | StatementId: params.ScheduleName
|
53 | }
|
54 | }
|
55 |
|
56 | _addPermission (params) {
|
57 | return new Promise((resolve, reject) => {
|
58 | const _params = this._addPermissionParams(params)
|
59 | this.lambda.addPermission(_params, (err, data) => {
|
60 | if (err) {
|
61 | if (err.code !== 'ResourceConflictException') reject(err)
|
62 |
|
63 | resolve('Permission already set')
|
64 | }
|
65 | resolve(data)
|
66 | })
|
67 | })
|
68 | }
|
69 |
|
70 | _putTargetsParams (params) {
|
71 | return {
|
72 | Rule: params.ScheduleName,
|
73 | Targets: [{
|
74 | Arn: params.FunctionArn,
|
75 | Id: this._functionName(params),
|
76 | Input: params.hasOwnProperty('Input') ? JSON.stringify(params.Input) : ''
|
77 | }]
|
78 | }
|
79 | }
|
80 |
|
81 | _putTargets (params) {
|
82 | return new Promise((resolve, reject) => {
|
83 | const _params = this._putTargetsParams(params)
|
84 | this.cloudwatchevents.putTargets(_params, (err, data) => {
|
85 |
|
86 | if (err) reject(err)
|
87 | resolve(data)
|
88 | })
|
89 | })
|
90 | }
|
91 |
|
92 | add (params) {
|
93 | return Promise.resolve().then(() => {
|
94 | return this._putRule(params)
|
95 | }).then(rule => {
|
96 | return this._addPermission(Object.assign(params, rule))
|
97 | }).then(data => {
|
98 | return this._putTargets(params)
|
99 | })
|
100 | }
|
101 | }
|
102 |
|
103 | module.exports = ScheduleEvents
|