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);
