lfapi

view lfapi.js @ 41:43c90f066b52

Fixed wrong fields in suggestion field definitions
author bsw
date Fri Mar 22 16:16:46 2013 +0100 (2013-03-22)
parents 0eef836b8f54
children
line source
1 #!/usr/bin/env node
3 var main = require('./lfapi/main.js');
5 var config = main.config;
6 var db = main.db;
8 //var config = require('./config.js');
10 var http = require('http');
11 var url = require('url');
12 var qs = require('querystring');
14 // Add includes method to Arrays
15 Array.prototype.includes = function (val) {
16 for (var i=0; i < this.length; i++) if (this[i] === val) return true;
17 return false;
18 };
20 // Member sessions, stored value is member_id
21 var sessions = { };
23 // create http server
24 var server = http.createServer(function (req, res, params) {
25 req.setEncoding('utf8');
27 // parse get params
28 var url_info = url.parse(req.url, true);
29 var params = url_info.query;
30 req.params = params;
32 req.current_access_level = config.public_access_level;
33 req.current_member_id;
35 req.sessions = sessions;
37 // pick cookies from http headers
38 var cookies = {};
39 if (req.headers.cookie) {
40 req.headers.cookie.split(';').forEach(function (cookie) {
41 var parts = cookie.split('=');
42 cookies[parts[0].trim()] = (parts[1] || '' ).trim();
43 });
44 };
46 var body = '';
47 req.on('data', function (data) {
48 body += data;
49 });
50 req.on('end', function () {
51 var post_params = qs.parse(body);
52 for (key in post_params) {
53 params[key] = post_params[key];
54 };
56 console.log(req.socket._idleStart, req.socket.remoteAddress, req.current_member_id, req.current_access_level, req.method, url_info.pathname, url_info.query);
58 // session handling
59 if (params.session_key) {
60 if (sessions[params.session_key]) {
61 req.current_member_id = sessions[params.session_key];
62 req.current_access_level = 'member'
63 } else {
64 main.respond('json', null, req, res, 'forbidden', 'Invalid session key');
65 }
66 }
70 if (['POST', 'DELETE'].includes(params.http_method)) {
71 req.method = params.http_method;
72 }
74 var routes;
76 switch(req.method) {
77 case 'HEAD':
78 routes = main.get;
79 var routing_target = routes[url_info.pathname]
80 if (routing_target) {
81 res.writeHead(
82 200,
83 {
84 'Content-Type': "application/json; charset=UTF-8",
85 'Access-Control-Allow-Origin': '*'
86 }
87 );
88 } else {
89 res.writeHead(
90 404,
91 {
92 'Access-Control-Allow-Origin': '*'
93 }
94 );
95 }
96 res.end(body);
97 return
98 break;
100 case 'GET':
101 routes = main.get;
102 break;
104 case 'DELETE':
105 // delete requests are handled like post request with parameter delete=1
106 params.delete = '1';
108 case 'POST':
109 routes = main.post;
110 break;
112 default:
113 main.respond('json', null, req, res, 'not found');
114 return;
115 break;
117 };
119 // dispatch request based on method and url
120 if (routes) {
121 var routing_target = routes[url_info.pathname]
122 if (routing_target) {
123 db.query(config.connectionString, req, res, 'START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE', function (result, conn) {
124 routing_target.apply(this, [conn, req, res, params]);
125 });
126 return;
127 }
128 }
130 main.respond('json', null, req, res, 'not found');
132 });
134 // actually connect the http server to a network interface
135 }).listen(config.bind_port, config.bind_address);
137 console.log('LiquidFeedback API server started with ' + config.public_access_level + ' public access at ' + config.bind_address + ':' + config.bind_port);

Impressum / About Us