certificates.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  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. return internalCertificate.create(res.locals.access, payload);
  58. })
  59. .then((result) => {
  60. res.status(201)
  61. .send(result);
  62. })
  63. .catch(next);
  64. });
  65. /**
  66. * Specific certificate
  67. *
  68. * /api/nginx/certificates/123
  69. */
  70. router
  71. .route('/:certificate_id')
  72. .options((req, res) => {
  73. res.sendStatus(204);
  74. })
  75. .all(jwtdecode())
  76. /**
  77. * GET /api/nginx/certificates/123
  78. *
  79. * Retrieve a specific certificate
  80. */
  81. .get((req, res, next) => {
  82. validator({
  83. required: ['certificate_id'],
  84. additionalProperties: false,
  85. properties: {
  86. certificate_id: {
  87. $ref: 'definitions#/definitions/id'
  88. },
  89. expand: {
  90. $ref: 'definitions#/definitions/expand'
  91. }
  92. }
  93. }, {
  94. certificate_id: req.params.certificate_id,
  95. expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null)
  96. })
  97. .then((data) => {
  98. return internalCertificate.get(res.locals.access, {
  99. id: parseInt(data.certificate_id, 10),
  100. expand: data.expand
  101. });
  102. })
  103. .then((row) => {
  104. res.status(200)
  105. .send(row);
  106. })
  107. .catch(next);
  108. })
  109. /**
  110. * PUT /api/nginx/certificates/123
  111. *
  112. * Update and existing certificate
  113. */
  114. .put((req, res, next) => {
  115. apiValidator({$ref: 'endpoints/certificates#/links/2/schema'}, req.body)
  116. .then((payload) => {
  117. payload.id = parseInt(req.params.certificate_id, 10);
  118. return internalCertificate.update(res.locals.access, payload);
  119. })
  120. .then((result) => {
  121. res.status(200)
  122. .send(result);
  123. })
  124. .catch(next);
  125. })
  126. /**
  127. * DELETE /api/nginx/certificates/123
  128. *
  129. * Update and existing certificate
  130. */
  131. .delete((req, res, next) => {
  132. internalCertificate.delete(res.locals.access, {id: parseInt(req.params.certificate_id, 10)})
  133. .then((result) => {
  134. res.status(200)
  135. .send(result);
  136. })
  137. .catch(next);
  138. });
  139. /**
  140. * Upload Certs
  141. *
  142. * /api/nginx/certificates/123/upload
  143. */
  144. router
  145. .route('/:certificate_id/upload')
  146. .options((req, res) => {
  147. res.sendStatus(204);
  148. })
  149. .all(jwtdecode())
  150. /**
  151. * POST /api/nginx/certificates/123/upload
  152. *
  153. * Upload certificates
  154. */
  155. .post((req, res, next) => {
  156. if (!req.files) {
  157. res.status(400)
  158. .send({error: 'No files were uploaded'});
  159. } else {
  160. internalCertificate.upload(res.locals.access, {
  161. id: parseInt(req.params.certificate_id, 10),
  162. files: req.files
  163. })
  164. .then((result) => {
  165. res.status(200)
  166. .send(result);
  167. })
  168. .catch(next);
  169. }
  170. });
  171. /**
  172. * Renew LE Certs
  173. *
  174. * /api/nginx/certificates/123/renew
  175. */
  176. router
  177. .route('/:certificate_id/renew')
  178. .options((req, res) => {
  179. res.sendStatus(204);
  180. })
  181. .all(jwtdecode())
  182. /**
  183. * POST /api/nginx/certificates/123/renew
  184. *
  185. * Renew certificate
  186. */
  187. .post((req, res, next) => {
  188. internalCertificate.renew(res.locals.access, {
  189. id: parseInt(req.params.certificate_id, 10)
  190. })
  191. .then((result) => {
  192. res.status(200)
  193. .send(result);
  194. })
  195. .catch(next);
  196. });
  197. /**
  198. * Validate Certs before saving
  199. *
  200. * /api/nginx/certificates/validate
  201. */
  202. router
  203. .route('/validate')
  204. .options((req, res) => {
  205. res.sendStatus(204);
  206. })
  207. .all(jwtdecode())
  208. /**
  209. * POST /api/nginx/certificates/validate
  210. *
  211. * Validate certificates
  212. */
  213. .post((req, res, next) => {
  214. if (!req.files) {
  215. res.status(400)
  216. .send({error: 'No files were uploaded'});
  217. } else {
  218. internalCertificate.validate({
  219. files: req.files
  220. })
  221. .then((result) => {
  222. res.status(200)
  223. .send(result);
  224. })
  225. .catch(next);
  226. }
  227. });
  228. module.exports = router;