Skip to content

Commit 075921e

Browse files
committed
project skeleton
1 parent e523d52 commit 075921e

File tree

10 files changed

+112
-9
lines changed

10 files changed

+112
-9
lines changed

app.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
1-
const createError = require('http-errors');
21
const express = require('express');
2+
const fileUpload = require('express-fileupload');
3+
const createError = require('http-errors');
34
const logger = require('morgan');
4-
const errorHandler = require('./errors/handler');
5+
const requestLogger = require('./middleware/requestLogger');
6+
const errorHandler = require('./middleware/errorHandler');
57

68
const rootRouter = require('./routes/root');
9+
const dockerRouter = require('./routes/docker');
710

811
const app = express();
912

10-
11-
app.use(logger('dev'));
13+
// app.use(logger('dev'));
1214
app.use(express.json());
15+
app.use(fileUpload());
16+
app.use(requestLogger);
1317

1418
app.use('/', rootRouter);
19+
app.use('/docker', dockerRouter);
1520

1621
// catch 404 and forward to error handler
1722
app.use(function (req, res, next) {

controllers/DockerController.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
const log = require('../logger');
2+
const ValidationError = require('../errors/ValidationError');
3+
const DockerService = require('../services/DockerService');
4+
5+
module.exports = class DockerController {
6+
static async applyYaml(req, res, next) {
7+
try {
8+
const file = extractYaml(req.files);
9+
if (!file) {
10+
next(new ValidationError('no file provided'));
11+
return;
12+
}
13+
14+
const result = await DockerService.applyYaml(file.data.toString());
15+
res.json(result);
16+
} catch (e) {
17+
next(e);
18+
}
19+
}
20+
};
21+
22+
const mimetype = 'text/yaml';
23+
function extractYaml(files) {
24+
for (const name in files) {
25+
if (files.hasOwnProperty(name) && files[name].mimetype === mimetype) {
26+
log.info(`file found: ${name}`);
27+
return files[name];
28+
}
29+
}
30+
return null;
31+
}

errors/handler.js

Lines changed: 0 additions & 4 deletions
This file was deleted.

logger/format.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const {format} = require('winston');
2+
3+
module.exports = format.combine(
4+
format.colorize(),
5+
format.printf(info => `${new Date().toLocaleString()} -- ${info.level} : ${info.message}`)
6+
);

logger/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
const {createLogger, transports} = require('winston');
2+
const format = require('./format');
3+
4+
module.exports = createLogger({
5+
format: format,
6+
transports: [
7+
new transports.Console()
8+
]
9+
});

middleware/errorHandler.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const log = require('../logger');
2+
3+
module.exports = function (err, req, res, next) {
4+
res.status(err.status || 500);
5+
const message = err.message || err.constructor.name;
6+
log.error(message);
7+
res.json({message: message});
8+
};

middleware/requestLogger.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const log = require('../logger');
2+
3+
module.exports = function (req, res, next) {
4+
log.info(`${req.method} ${req.url}`);
5+
next()
6+
};

package.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,16 @@
99
},
1010
"dependencies": {
1111
"debug": "~2.6.9",
12+
"docker-client": "^1.38.1",
1213
"express": "~4.16.0",
14+
"express-fileupload": "^1.0.0",
1315
"http-errors": "~1.6.2",
1416
"morgan": "~1.9.0",
15-
"nconf": "latest"
17+
"nconf": "^0.10.0",
18+
"winston": "^3.1.0",
19+
"yaml": "^1.0.0"
20+
},
21+
"devDependencies": {
22+
"@types/node": "^10.12.0"
1623
}
1724
}

routes/docker.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const router = require('express').Router();
2+
const DockerController = require('../controllers/DockerController');
3+
4+
router.post('/compose/yaml', DockerController.applyYaml);
5+
6+
module.exports = router;

services/DockerService.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const log = require('../logger');
2+
const yaml = require('yaml');
3+
4+
module.exports = class DockerService {
5+
static applyYaml(fileContent) {
6+
const directives = yaml.parse(fileContent);
7+
return this.applyDirectives(directives);
8+
}
9+
10+
static async applyDirectives(directives) {
11+
const all = {
12+
...directives.services,
13+
...directives.volumes,
14+
...directives.networks
15+
};
16+
17+
for (const name in directives.services) {
18+
log.info(`service: ${name}`);
19+
}
20+
for (const name in directives.volumes) {
21+
log.info(`volume: ${name}`);
22+
}
23+
for (const name in directives.networks) {
24+
log.info(`network: ${name}`);
25+
}
26+
27+
return {ok: true}
28+
}
29+
};

0 commit comments

Comments
 (0)