certificates.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. const express = require('express');
  2. const validator = require('../../../lib/validator');
  3. const jwtdecode = require('../../../lib/express/jwt-decode');
  4. const internalCertificate = require('../../../internal/certificate');
  5. const apiValidator = require('../../../lib/validator/api');
  6. let router = express.Router({
  7. caseSensitive: true,
  8. strict: true,
  9. mergeParams: true
  10. });
  11. /**
  12. * /api/nginx/certificates
  13. */
  14. router
  15. .route('/')
  16. .options((req, res) => {
  17. res.sendStatus(204);
  18. })
  19. .all(jwtdecode())
  20. /**
  21. * GET /api/nginx/certificates
  22. *
  23. * Retrieve all certificates
  24. */
  25. .get((req, res, next) => {
  26. validator({
  27. additionalProperties: false,
  28. properties: {
  29. expand: {
  30. $ref: 'definitions#/definitions/expand'
  31. },
  32. query: {
  33. $ref: 'definitions#/definitions/query'
  34. }
  35. }
  36. }, {
  37. expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null),
  38. query: (typeof req.query.query === 'string' ? req.query.query : null)
  39. })
  40. .then((data) => {
  41. return internalCertificate.getAll(res.locals.access, data.expand, data.query);
  42. })
  43. .then((rows) => {
  44. res.status(200)
  45. .send(rows);
  46. })
  47. .catch(next);
  48. })
  49. /**
  50. * POST /api/nginx/certificates
  51. *
  52. * Create a new certificate
  53. */
  54. .post((req, res, next) => {
  55. apiValidator({$ref: 'endpoints/certificates#/links/1/schema'}, req.body)
  56. .then((payload) => {
  57. req.setTimeout(900000); // 15 minutes timeout
  58. return internalCertificate.create(res.locals.access, payload);
  59. })
  60. .then((result) => {
  61. res.status(201)
  62. .send(result);
  63. })
  64. .catch(next);
  65. });
  66. /**
  67. * Specific certificate
  68. *
  69. * /api/nginx/certificates/123
  70. */
  71. router
  72. .route('/:certificate_id')
  73. .options((req, res) => {
  74. res.sendStatus(204);
  75. })
  76. .all(jwtdecode())
  77. /**
  78. * GET /api/nginx/certificates/123
  79. *
  80. * Retrieve a specific certificate
  81. */
  82. .get((req, res, next) => {
  83. validator({
  84. required: ['certificate_id'],
  85. additionalProperties: false,
  86. properties: {
  87. certificate_id: {
  88. $ref: 'definitions#/definitions/id'
  89. },
  90. expand: {
  91. $ref: 'definitions#/definitions/expand'
  92. }
  93. }
  94. }, {
  95. certificate_id: req.params.certificate_id,
  96. expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null)
  97. })
  98. .then((data) => {
  99. return internalCertificate.get(res.locals.access, {
  100. id: parseInt(data.certificate_id, 10),
  101. expand: data.expand
  102. });
  103. })
  104. .then((row) => {
  105. res.status(200)
  106. .send(row);
  107. })
  108. .catch(next);
  109. })
  110. /**
  111. * PUT /api/nginx/certificates/123
  112. *
  113. * Update and existing certificate
  114. */
  115. .put((req, res, next) => {
  116. apiValidator({$ref: 'endpoints/certificates#/links/2/schema'}, req.body)
  117. .then((payload) => {
  118. payload.id = parseInt(req.params.certificate_id, 10);
  119. return internalCertificate.update(res.locals.access, payload);
  120. })
  121. .then((result) => {
  122. res.status(200)
  123. .send(result);
  124. })
  125. .catch(next);
  126. })
  127. /**
  128. * DELETE /api/nginx/certificates/123
  129. *
  130. * Update and existing certificate
  131. */
  132. .delete((req, res, next) => {
  133. internalCertificate.delete(res.locals.access, {id: parseInt(req.params.certificate_id, 10)})
  134. .then((result) => {
  135. res.status(200)
  136. .send(result);
  137. })
  138. .catch(next);
  139. });
  140. /**
  141. * Upload Certs
  142. *
  143. * /api/nginx/certificates/123/upload
  144. */
  145. router
  146. .route('/:certificate_id/upload')
  147. .options((req, res) => {
  148. res.sendStatus(204);
  149. })
  150. .all(jwtdecode())
  151. /**
  152. * POST /api/nginx/certificates/123/upload
  153. *
  154. * Upload certificates
  155. */
  156. .post((req, res, next) => {
  157. if (!req.files) {
  158. res.status(400)
  159. .send({error: 'No files were uploaded'});
  160. } else {
  161. internalCertificate.upload(res.locals.access, {
  162. id: parseInt(req.params.certificate_id, 10),
  163. files: req.files
  164. })
  165. .then((result) => {
  166. res.status(200)
  167. .send(result);
  168. })
  169. .catch(next);
  170. }
  171. });
  172. /**
  173. * Renew LE Certs
  174. *
  175. * /api/nginx/certificates/123/renew
  176. */
  177. router
  178. .route('/:certificate_id/renew')
  179. .options((req, res) => {
  180. res.sendStatus(204);
  181. })
  182. .all(jwtdecode())
  183. /**
  184. * POST /api/nginx/certificates/123/renew
  185. *
  186. * Renew certificate
  187. */
  188. .post((req, res, next) => {
  189. req.setTimeout(900000); // 15 minutes timeout
  190. internalCertificate.renew(res.locals.access, {
  191. id: parseInt(req.params.certificate_id, 10)
  192. })
  193. .then((result) => {
  194. res.status(200)
  195. .send(result);
  196. })
  197. .catch(next);
  198. });
  199. /**
  200. * Validate Certs before saving
  201. *
  202. * /api/nginx/certificates/validate
  203. */
  204. router
  205. .route('/validate')
  206. .options((req, res) => {
  207. res.sendStatus(204);
  208. })
  209. .all(jwtdecode())
  210. /**
  211. * POST /api/nginx/certificates/validate
  212. *
  213. * Validate certificates
  214. */
  215. .post((req, res, next) => {
  216. if (!req.files) {
  217. res.status(400)
  218. .send({error: 'No files were uploaded'});
  219. } else {
  220. internalCertificate.validate({
  221. files: req.files
  222. })
  223. .then((result) => {
  224. res.status(200)
  225. .send(result);
  226. })
  227. .catch(next);
  228. }
  229. });
  230. module.exports = router;