| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 | const express             = require('express');const validator           = require('../../../lib/validator');const jwtdecode           = require('../../../lib/express/jwt-decode');const internalCertificate = require('../../../internal/certificate');const apiValidator        = require('../../../lib/validator/api');let router = express.Router({	caseSensitive: true,	strict:        true,	mergeParams:   true});/** * /api/nginx/certificates */router	.route('/')	.options((req, res) => {		res.sendStatus(204);	})	.all(jwtdecode())	/**	 * GET /api/nginx/certificates	 *	 * Retrieve all certificates	 */	.get((req, res, next) => {		validator({			additionalProperties: false,			properties:           {				expand: {					$ref: 'definitions#/definitions/expand'				},				query: {					$ref: 'definitions#/definitions/query'				}			}		}, {			expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null),			query:  (typeof req.query.query === 'string' ? req.query.query : null)		})			.then((data) => {				return internalCertificate.getAll(res.locals.access, data.expand, data.query);			})			.then((rows) => {				res.status(200)					.send(rows);			})			.catch(next);	})	/**	 * POST /api/nginx/certificates	 *	 * Create a new certificate	 */	.post((req, res, next) => {		apiValidator({$ref: 'endpoints/certificates#/links/1/schema'}, req.body)			.then((payload) => {				req.setTimeout(900000); // 15 minutes timeout				return internalCertificate.create(res.locals.access, payload);			})			.then((result) => {				res.status(201)					.send(result);			})			.catch(next);	});/** * Specific certificate * * /api/nginx/certificates/123 */router	.route('/:certificate_id')	.options((req, res) => {		res.sendStatus(204);	})	.all(jwtdecode())	/**	 * GET /api/nginx/certificates/123	 *	 * Retrieve a specific certificate	 */	.get((req, res, next) => {		validator({			required:             ['certificate_id'],			additionalProperties: false,			properties:           {				certificate_id: {					$ref: 'definitions#/definitions/id'				},				expand: {					$ref: 'definitions#/definitions/expand'				}			}		}, {			certificate_id: req.params.certificate_id,			expand:         (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null)		})			.then((data) => {				return internalCertificate.get(res.locals.access, {					id:     parseInt(data.certificate_id, 10),					expand: data.expand				});			})			.then((row) => {				res.status(200)					.send(row);			})			.catch(next);	})	/**	 * PUT /api/nginx/certificates/123	 *	 * Update and existing certificate	 */	.put((req, res, next) => {		apiValidator({$ref: 'endpoints/certificates#/links/2/schema'}, req.body)			.then((payload) => {				payload.id = parseInt(req.params.certificate_id, 10);				return internalCertificate.update(res.locals.access, payload);			})			.then((result) => {				res.status(200)					.send(result);			})			.catch(next);	})	/**	 * DELETE /api/nginx/certificates/123	 *	 * Update and existing certificate	 */	.delete((req, res, next) => {		internalCertificate.delete(res.locals.access, {id: parseInt(req.params.certificate_id, 10)})			.then((result) => {				res.status(200)					.send(result);			})			.catch(next);	});/** * Upload Certs * * /api/nginx/certificates/123/upload */router	.route('/:certificate_id/upload')	.options((req, res) => {		res.sendStatus(204);	})	.all(jwtdecode())	/**	 * POST /api/nginx/certificates/123/upload	 *	 * Upload certificates	 */	.post((req, res, next) => {		if (!req.files) {			res.status(400)				.send({error: 'No files were uploaded'});		} else {			internalCertificate.upload(res.locals.access, {				id:    parseInt(req.params.certificate_id, 10),				files: req.files			})				.then((result) => {					res.status(200)						.send(result);				})				.catch(next);		}	});/** * Renew LE Certs * * /api/nginx/certificates/123/renew */router	.route('/:certificate_id/renew')	.options((req, res) => {		res.sendStatus(204);	})	.all(jwtdecode())	/**	 * POST /api/nginx/certificates/123/renew	 *	 * Renew certificate	 */	.post((req, res, next) => {		req.setTimeout(900000); // 15 minutes timeout		internalCertificate.renew(res.locals.access, {			id: parseInt(req.params.certificate_id, 10)		})			.then((result) => {				res.status(200)					.send(result);			})			.catch(next);	});/** * Download LE Certs * * /api/nginx/certificates/123/download */router	.route('/:certificate_id/download')	.options((req, res) => {		res.sendStatus(204);	})	.all(jwtdecode())	/**	 * GET /api/nginx/certificates/123/download	 *	 * Renew certificate	 */	.get((req, res, next) => {		internalCertificate.download({			id: parseInt(req.params.certificate_id, 10)		})			.then((result) => {				res.status(200)					.download(result.fileName);			})			.catch(next);	});/** * Validate Certs before saving * * /api/nginx/certificates/validate */router	.route('/validate')	.options((req, res) => {		res.sendStatus(204);	})	.all(jwtdecode())	/**	 * POST /api/nginx/certificates/validate	 *	 * Validate certificates	 */	.post((req, res, next) => {		if (!req.files) {			res.status(400)				.send({error: 'No files were uploaded'});		} else {			internalCertificate.validate({				files: req.files			})				.then((result) => {					res.status(200)						.send(result);				})				.catch(next);		}	});module.exports = router;
 |