forked from robburger/citizen
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodules.js
128 lines (107 loc) · 3.1 KB
/
modules.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
119
120
121
122
123
124
125
126
127
128
const { Router } = require('express');
const multiparty = require('multiparty');
const logger = require('../lib/logger');
const { parseHcl } = require('../lib/util');
const { saveModule, hasModule } = require('../lib/storage');
const { save, getLatestVersion, findOne } = require('../lib/store');
const router = Router();
// register a module with version
router.post('/:namespace/:name/:provider/:version', (req, res, next) => {
const {
namespace,
name,
provider,
version,
} = req.params;
const destPath = `${namespace}/${name}/${provider}/${version}`;
let tarball;
let filename;
let owner = '';
const form = new multiparty.Form();
form.on('error', (err) => {
logger.error(`Error parsing form: ${err.stack}`);
next(err);
});
form.on('part', async (part) => {
part.on('error', (err) => {
logger.error(`Error parsing form: ${err.stack}`);
next(err);
});
const ownerBuf = [];
const file = [];
part.on('data', (buffer) => {
if (!part.filename && part.name === 'owner') {
ownerBuf.push(buffer);
}
if (part.filename) {
file.push(buffer);
}
});
part.on('end', async () => {
if (!part.filename && part.name === 'owner') {
owner = Buffer.concat(ownerBuf).toString();
}
if (part.filename) {
({ filename } = part);
tarball = Buffer.concat(file);
}
});
});
form.on('close', async () => {
try {
const exist = await hasModule(`${destPath}/${filename}`);
if (exist) {
const error = new Error('Module exist');
error.status = 409;
error.message = `${destPath} is already exist.`;
return next(error);
}
const fileResult = await saveModule(`${destPath}/${filename}`, tarball);
const definition = await parseHcl(name, tarball);
const metaResult = await save({
namespace,
name,
provider,
version,
owner,
location: `${destPath}/${filename}`,
definition,
});
if (fileResult && metaResult) {
return res.status(201).render('modules/register', {
id: destPath,
owner,
namespace,
name,
provider,
version,
published_at: new Date(),
});
}
return next(new Error());
} catch (e) {
logger.error(e);
return next(e);
}
});
form.parse(req);
});
// https://www.terraform.io/docs/registry/api.html#get-a-specific-module
router.get('/:namespace/:name/:provider/:version', async (req, res, next) => {
const options = { ...req.params };
const module = await findOne(options);
if (!module) {
return next();
}
return res.render('modules/module', module);
});
// https://www.terraform.io/docs/registry/api.html#latest-version-for-a-specific-module-provider
router.get('/:namespace/:name/:provider', async (req, res, next) => {
const options = { ...req.params };
const module = await getLatestVersion(options);
if (!module) {
return next();
}
return res.render('modules/latest-version', module);
});
module.exports = router;