PageRenderTime 35ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/liquidfeedback/lfapi/lfapi.js

https://gitlab.com/fuzzynemesis/hajaannu
JavaScript | 140 lines | 99 code | 32 blank | 9 comment | 13 complexity | 24c6a29939235f260e792a9d1c017e52 MD5 | raw file
Possible License(s): Apache-2.0
  1. #!/usr/bin/env node
  2. var main = require('./lfapi/main.js');
  3. var config = main.config;
  4. var db = main.db;
  5. var config = require('./config.js');
  6. var http = require('http');
  7. var url = require('url');
  8. var qs = require('querystring');
  9. // Add includes method to Arrays
  10. Array.prototype.includes = function (val) {
  11. for (var i=0; i < this.length; i++) if (this[i] === val) return true;
  12. return false;
  13. };
  14. // Member sessions, stored value is member_id
  15. var sessions = { };
  16. // create http server
  17. var server = http.createServer(function (req, res, params) {
  18. req.setEncoding('utf8');
  19. // parse get params
  20. var url_info = url.parse(req.url, true);
  21. var params = url_info.query;
  22. req.params = params;
  23. req.current_access_level = config.public_access_level;
  24. req.current_member_id;
  25. req.sessions = sessions;
  26. // pick cookies from http headers
  27. var cookies = {};
  28. if (req.headers.cookie) {
  29. req.headers.cookie.split(';').forEach(function (cookie) {
  30. var parts = cookie.split('=');
  31. cookies[parts[0].trim()] = (parts[1] || '' ).trim();
  32. });
  33. };
  34. var body = '';
  35. req.on('data', function (data) {
  36. body += data;
  37. });
  38. req.on('end', function () {
  39. var post_params = qs.parse(body);
  40. for (key in post_params) {
  41. params[key] = post_params[key];
  42. };
  43. console.log(req.socket._idleStart, req.socket.remoteAddress, req.current_member_id, req.current_access_level, req.method, url_info.pathname, url_info.query);
  44. // session handling
  45. if (params.session_key) {
  46. if (sessions[params.session_key]) {
  47. req.current_member_id = sessions[params.session_key];
  48. req.current_access_level = 'member'
  49. } else {
  50. main.respond('json', null, req, res, 'forbidden', 'Invalid session key');
  51. }
  52. }
  53. if (['POST', 'DELETE'].includes(params.http_method)) {
  54. req.method = params.http_method;
  55. }
  56. var routes;
  57. switch(req.method) {
  58. case 'HEAD':
  59. routes = main.get;
  60. var routing_target = routes[url_info.pathname]
  61. if (routing_target) {
  62. res.writeHead(
  63. 200,
  64. {
  65. 'Content-Type': "application/json; charset=UTF-8",
  66. 'Access-Control-Allow-Origin': '*'
  67. }
  68. );
  69. } else {
  70. res.writeHead(
  71. 404,
  72. {
  73. 'Access-Control-Allow-Origin': '*'
  74. }
  75. );
  76. }
  77. res.end(body);
  78. return
  79. break;
  80. case 'GET':
  81. routes = main.get;
  82. break;
  83. case 'DELETE':
  84. // delete requests are handled like post request with parameter delete=1
  85. params.delete = '1';
  86. case 'POST':
  87. routes = main.post;
  88. break;
  89. default:
  90. main.respond('json', null, req, res, 'not found');
  91. return;
  92. break;
  93. };
  94. // dispatch request based on method and url
  95. if (routes) {
  96. var routing_target = routes[url_info.pathname]
  97. if (routing_target) {
  98. db.query(config.connectionString, req, res, 'START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE', function (result, conn) {
  99. routing_target.apply(this, [conn, req, res, params]);
  100. });
  101. return;
  102. }
  103. }
  104. main.respond('json', null, req, res, 'not found');
  105. });
  106. // actually connect the http server to a network interface
  107. }).listen(config.bind_port, config.bind_address);
  108. console.log('LiquidFeedback API server started with ' + config.public_access_level + ' public access at ' + config.bind_address + ':' + config.bind_port);