endpoints.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. const http = require("http");
  2. const convertFileFormat = require("../src/fileFormatConverter");
  3. const httpServer = require("../src/httpServer");
  4. const parseURL = require("../src/parseURL");
  5. const languages = require("../src/languages");
  6. const jsl = require("svjsl");
  7. const fs = require("fs-extra");
  8. const settings = require("../settings");
  9. jsl.unused(http);
  10. const meta = {
  11. "name": "Endpoints",
  12. "desc": "Returns a list of all endpoints and how to use them",
  13. "usage": {
  14. "method": "GET",
  15. "url": `${settings.info.docsURL}/endpoints`,
  16. "supportedParams": [
  17. "format"
  18. ]
  19. }
  20. };
  21. /**
  22. * Calls this endpoint
  23. * @param {http.IncomingMessage} req The HTTP server request
  24. * @param {http.ServerResponse} res The HTTP server response
  25. * @param {Array<String>} url URL path array gotten from the URL parser module
  26. * @param {Object} params URL query params gotten from the URL parser module
  27. * @param {String} format The file format to respond with
  28. */
  29. const call = (req, res, url, params, format) => {
  30. jsl.unused([req, url, params]);
  31. let endpointList = [];
  32. let lang = (params && params["lang"]) ? params["lang"] : settings.languages.defaultLanguage;
  33. try
  34. {
  35. fs.readdir(settings.endpoints.dirPath, (err, files) => {
  36. if(!err)
  37. {
  38. files.forEach(f => {
  39. if(f.endsWith(".js"))
  40. {
  41. let fileMeta = require(`./${f}`).meta;
  42. if(jsl.isEmpty(fileMeta))
  43. return epError(res, format, `Couldn't find metadata object of endpoint "${f.replace(".js", "")}"`);
  44. if(jsl.isEmpty(fileMeta.unlisted) && !jsl.isEmpty(fileMeta.usage))
  45. {
  46. if(format != "xml")
  47. {
  48. endpointList.push({
  49. name: fileMeta.name,
  50. description: fileMeta.desc,
  51. usage: {
  52. method: fileMeta.usage.method,
  53. url: fileMeta.usage.url,
  54. supportedParams: fileMeta.usage.supportedParams
  55. }
  56. });
  57. }
  58. else if(format == "xml")
  59. {
  60. endpointList.push({
  61. name: fileMeta.name,
  62. description: fileMeta.desc,
  63. usage: {
  64. method: fileMeta.usage.method,
  65. url: fileMeta.usage.url,
  66. supportedParams: {"param": fileMeta.usage.supportedParams}
  67. }
  68. });
  69. }
  70. }
  71. }
  72. });
  73. endpointList.push({
  74. name: "Submit",
  75. description: `Used to submit a joke to be added to ${settings.info.name}`,
  76. usage: {
  77. method: "POST",
  78. url: `${settings.info.docsURL}/submit`,
  79. supportedParams: [
  80. "dry-run"
  81. ]
  82. }
  83. });
  84. if(format == "xml")
  85. endpointList = { "endpoint": endpointList};
  86. return httpServer.pipeString(res, convertFileFormat.auto(format, endpointList), parseURL.getMimeTypeFromFileFormatString(format));
  87. }
  88. else return epError(res, format, err);
  89. });
  90. }
  91. catch(err)
  92. {
  93. return epError(res, format, err, lang);
  94. }
  95. };
  96. const epError = (res, format, err, lang) => {
  97. let errObj = {};
  98. let errFromRegistry = require("../data/errorMessages")["100"];
  99. if(errFromRegistry == undefined)
  100. throw new Error(`Couldn't find errorMessages module or Node is using an outdated, cached version`);
  101. if(!lang || languages.isValidLang(lang) !== true)
  102. lang = settings.languages.defaultLanguage;
  103. if(format != "xml")
  104. {
  105. errObj = {
  106. "error": true,
  107. "internalError": true,
  108. "code": 100,
  109. "message": errFromRegistry.errorMessage[lang] || errFromRegistry.errorMessage[settings.languages.defaultLanguage],
  110. "causedBy": errFromRegistry.causedBy[lang] || errFromRegistry.causedBy[settings.languages.defaultLanguage],
  111. "additionalInfo": err,
  112. "timestamp": new Date().getTime()
  113. }
  114. }
  115. else if(format == "xml")
  116. {
  117. errObj = {
  118. "error": true,
  119. "internalError": true,
  120. "code": 100,
  121. "message": errFromRegistry.errorMessage[lang] || errFromRegistry.errorMessage[settings.languages.defaultLanguage],
  122. "causedBy": { "cause": (errFromRegistry.causedBy[lang] || errFromRegistry.causedBy[settings.languages.defaultLanguage]) },
  123. "additionalInfo": err,
  124. "timestamp": new Date().getTime()
  125. }
  126. }
  127. httpServer.pipeString(res, convertFileFormat.auto(format, errObj), parseURL.getMimeTypeFromFileFormatString(format), 500);
  128. };
  129. module.exports = { meta, call };