-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathshared-workflow.js
118 lines (115 loc) · 4.28 KB
/
shared-workflow.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Copyright 2014 Pedro P. Candel <[email protected]>. All rights reserved.
// This is shared by api.js and module.js examples
// This is not really needed, but javascriptlint will complain otherwise:
var restify = require('restify');
var workflow = module.exports = {
name: 'Sample workflow using gist API',
chain: [ {
name: 'Post gist',
timeout: 30,
retry: 1,
body: function (job, cb) {
if (!job.params.login || !job.params.password) {
return cb('No login/password provided');
}
var client = restify.createJSONClient({
url: 'https://api.github.com'
});
client.basicAuth(job.params.login, job.params.password);
return client.post('/gists', {
'description': 'a gist created using node-workflow',
'public': false,
'files': {
'example.json': {
'content': JSON.stringify({
foo: 'bar',
bar: 'baz'
})
}
}
}, function (err, req, res, obj) {
if (err) {
return cb(err.name + ': ' + err.body.message);
} else {
job.gist_id = obj.id;
return cb(null, 'Gist created: ' + obj.html_url);
}
});
}
}, {
name: 'Get starred gist',
timeout: 60,
retry: 2,
body: function (job, cb) {
if (!job.params.login || !job.params.password) {
return cb('No login/password provided');
}
if (!job.gist_id) {
return cb('Unknown gist id');
}
var client = restify.createJSONClient({
url: 'https://api.github.com'
});
client.basicAuth(job.params.login, job.params.password);
return client.get(
'/gists/' + job.gist_id + '/star',
function (err, req, res, obj) {
// Indeed, there should be an error here, which will triger
// our fallback, where we'll add the star to our gist
if (err) {
return cb(err);
} else {
// It shouldn't be starred, but ...
return cb(null, 'What!?, gist was already starred');
}
});
},
fallback: function (err, job, cb) {
if (err.statusCode && err.statusCode === 404) {
// We know how to fix this: star it!:
var client = restify.createJSONClient({
url: 'https://api.github.com'
});
client.basicAuth(job.params.login, job.params.password);
return client.put(
'/gists/' + job.gist_id + '/star', {},
function (err, req, res, obj) {
if (err) {
return cb(err);
} else {
return cb(null, 'Gist starred!.');
}
});
} else {
return cb(err);
}
}
}],
timeout: 180,
onerror: [ {
name: 'Delete gist if exists',
body: function (job, cb) {
if (!job.params.login || !job.params.password) {
return cb('No login/password provided');
}
// If we created a gist and something failed later, let's remove it:
if (job.gist_id) {
var client = restify.createJSONClient({
url: 'https://api.github.com'
});
client.basicAuth(job.params.login, job.params.password);
return client.del(
'/gists/' + job.gist_id,
function (err, req, res, obj) {
if (err) {
return cb(err);
} else {
return cb('Cleanup done');
}
});
} else {
return cb('Nothing to cleanup');
}
}
}]
};