Changeset 464 for Dev/trunk/src/server


Ignore:
Timestamp:
06/23/13 21:46:11 (12 years ago)
Author:
hendrikvanantwerpen
Message:

Working deployment to Heroku.

Location:
Dev/trunk/src/server
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • Dev/trunk/src/server/app.js

    r463 r464  
    44var fs = require("fs");
    55var path = require("path");
    6 var proxy = require("simple-http-proxy");
     6var proxy = require("./simple-http-proxy");
    77var _ = require("underscore");
    88
     
    5858    // url to login (might work on others as well?)
    5959    // you should then have a session to work with
    60     app.post('/api/login', passport.authenticate('local'));
     60    app.post('/api/login');
    6161
    6262    // forward to couch
    63     app.use('/data/couch', passport.authenticate('local'), proxy(settings.couchDbURL));
     63    app.use('/data/couch', proxy(settings.couchDbURL));
    6464
    6565    return app;
  • Dev/trunk/src/server/config/config-couchdb.js

    r460 r464  
    11var q = require('q');
    2 var http = require('q-io/http');
    3 var fs = require('q-io/fs');
     2var HTTP = require('q-io/http');
     3var URL = require('url');
    44var _ = require('underscore');
     5var util = require('util');
    56
    6 var dbURL = "http://localhost:5984/";
    77var designDocs = require('./couchdb-design-docs');
    88
    9 function stringifyFunctions(value) {
    10     if ( value === null ) {
    11         return null;
    12     } else if ( _.isArray(value) ) {
    13         return value;
    14     } else if ( _.isFunction(value) ) {
    15         return value.toString();
    16     } else if ( _.isObject(value) ) {
    17         value = _.clone(value);
    18         _.each(value, function(propValue, propName){
    19             value[propName] = stringifyFunctions(propValue);
     9module.exports = function(couchDbURL) {
     10
     11    function stringifyFunctions(value) {
     12        if ( value === null ) {
     13            return null;
     14        } else if ( _.isArray(value) ) {
     15            return value;
     16        } else if ( _.isFunction(value) ) {
     17            return value.toString();
     18        } else if ( _.isObject(value) ) {
     19            value = _.clone(value);
     20            _.each(value, function(propValue, propName){
     21                value[propName] = stringifyFunctions(propValue);
     22            });
     23            return value;
     24        } else {
     25            return value;
     26        }
     27    }
     28
     29    function request(method,path,content) {
     30        var url = couchDbURL+path;
     31        var parsedURL = URL.parse(url);
     32        var options = {
     33            url: url,
     34            method: method,
     35            headers: {
     36                'content-type': 'application/json; charset=utf-8',
     37                'accept': 'application/json'
     38            },
     39            body: {
     40                forEach: function(callback) {
     41                    callback(JSON.stringify(content || {}));
     42                }
     43            }
     44        };
     45        // because q-io doesn't support auth properly, we have to
     46        // build the f*ing wheel again.
     47        if ( parsedURL.auth ) {
     48            var auth = new Buffer(parsedURL.auth).toString("base64");
     49            options.headers.authorization = 'Basic '+auth;
     50        }
     51        return HTTP.request(options)
     52        .then(function(res){
     53            return res.body.read().then(function(content){
     54                return JSON.parse(content.toString() || "{}");
     55            });
     56        },function(res){
     57            return res.body.read().then(function(error){
     58                console.warn(error); // q.all doesn't do errors, so let's show them here
     59                return JSON.parse(error.toString() || "{}");
     60            });
    2061        });
    21         return value;
    22     } else {
    23         return value;
    2462    }
    25 }
    2663
    27 function request(method,path,content) {
    28     var url = dbURL+path;
    29     return http.request({
    30         url: url,
    31         method: method,
    32         headers: {
    33             'content-type': 'application/json; charset=utf-8',
    34             'accept': 'application/json'
    35         },
    36         body: {
    37             forEach: function(callback) {
    38                 callback(JSON.stringify(content || {}));
    39             }
     64    console.log("Configuring CouchDB for QED");
     65    console.log("Checking CouchDB version");
     66    return request('GET','')
     67    .then(function(res){
     68        if (res.version !== "1.2.0" ) {
     69            console.log("Found "+res.version+", only tested with CouchDB 1.2.0");
     70        } else {
     71            console.log("CouchDB 1.2.0 found");
    4072        }
    4173    }).then(function(res){
    42         return res.body.read().then(function(content){
    43             return JSON.parse(content);
     74        console.log("Checking database 'qed'");
     75        return request('GET','qed')
     76        .then(function(res){
     77            console.log("Database 'qed' found.");
     78        },function(err){
     79            console.log("Creating database 'qed'");
     80            return request('PUT','qed');
    4481        });
    45     },function(res){
    46         return res.body.read().then(function(error){
    47             return JSON.parse(error);
    48         });
     82    }).then(function(){
     83        console.log("Putting documents in database.");
     84        designDocs = stringifyFunctions(designDocs);
     85        return q.all(_.map(designDocs, function(doc,docUrl){
     86            var configAction = doc.__configAction;
     87            delete doc.__configAction;
     88            switch (configAction) {
     89                case "ignore":
     90                    console.log(docUrl+" ignored.");
     91                break;
     92                case "update":
     93                    console.log(docUrl+" updating.");
     94                    return request('GET',docUrl)
     95                    .then(function(oldDoc){
     96                        _.extend(oldDoc,doc);
     97                        return request('PUT',docUrl,oldDoc);
     98                    },function(){
     99                        return request('PUT',docUrl,doc);
     100                    });
     101                break;
     102                case "replace":
     103                default:
     104                    console.log(docUrl+" replacing.");
     105                    return request('GET',docUrl)
     106                    .then(function(oldDoc){
     107                        _.extend(doc,_.pick(oldDoc,'_id','_rev'));
     108                        return request('PUT',docUrl,doc);
     109                    },function(){
     110                        return request('PUT',docUrl,doc);
     111                    });
     112                break;
     113            }
     114        }));
     115    }).then(function(){
     116        console.log("Done!");
     117    },function(err){
     118        console.error("ERROR",err,err.stack);
    49119    });
    50 }
    51120
    52 console.log("Configuring CouchDB for QED");
    53 console.log("Checking CouchDB version");
    54 request('GET','')
    55 .then(function(res){
    56     if (res.version !== "1.2.0" ) {
    57         console.log("Found "+res.version+", only tested with CouchDB 1.2.0");
    58     } else {
    59         console.log("CouchDB 1.2.0 found");
    60     }
    61     console.log("Checking database 'qed'");
    62 }).then(function(res){
    63     return request('GET','qed')
    64     .then(function(res){
    65         console.log("Database 'qed' found.");
    66     },function(err){
    67         console.log("Creating database 'qed'");
    68         return request('PUT','qed');
    69     });
    70 }).then(function(){
    71     console.log("Putting documents in database.");
    72     designDocs = stringifyFunctions(designDocs);
    73     return q.all(_.map(designDocs, function(doc,docUrl){
    74         var configAction = doc.__configAction;
    75         delete doc.__configAction;
    76         switch (configAction) {
    77             case "ignore":
    78                 console.log(docUrl+" ignored.");
    79             case "update":
    80                 console.log(docUrl+" updating.");
    81                 return request('GET',docUrl)
    82                 .then(function(oldDoc){
    83                     _.extend(oldDoc,doc);
    84                     return request('PUT',docUrl,oldDoc);
    85                 },function(){
    86                     return request('PUT',docUrl,doc);
    87                 });
    88             case "replace":
    89             default:
    90                 console.log(docUrl+" replacing.");
    91                 return request('GET',docUrl)
    92                 .then(function(oldDoc){
    93                     _.extend(doc,_.pick(oldDoc,'_id','_rev'));
    94                     return request('PUT',docUrl,doc);
    95                 },function(){
    96                     return request('PUT',docUrl,doc);
    97                 });
    98         }
    99     }));
    100 }).then(function(){
    101     console.log("Done!");
    102 },function(err){
    103     console.error("ERROR",err);
    104 });
     121};
  • Dev/trunk/src/server/config/couchdb-design-docs.js

    r455 r464  
    11module.exports = {
     2
    23    "_users/qed_admin": {
    34        __configAction: "ignore",
     
    89        type: "user"
    910    },
     11
    1012    "qed/_security": {
    1113        __configAction: "ignore",
     
    1921        }
    2022    },
     23
    2124    "qed/_design/default": {
    2225        __configAction: "replace",
     
    3437        }
    3538    },
     39
    3640    "qed/_design/questions": {
    3741        __configAction: "replace",
     
    8185        }
    8286    },
     87
    8388    "qed/_design/surveys": {
    8489        __configAction: "replace",
     
    100105        }
    101106    },
     107
    102108    "qed/_design/responses": {
    103109        __configAction: "replace",
     
    113119        }
    114120    }
     121
    115122};
  • Dev/trunk/src/server/heroku.js

    r463 r464  
    1 var app = require('./app').App({
    2     couchDbURL: 'http://localhost:5984/qed'
     1var port = process.env.PORT || 5000;
     2var couchDbURL = (process.env.CLOUDANT_URL || 'http://localhost:5984')+'/';
     3
     4var configCouch = require('./config/config-couchdb');
     5
     6configCouch(couchDbURL)
     7.then(function(){
     8    var app = require('./app').App({
     9        couchDbURL: couchDbURL+'qed'
     10    });
     11
     12    app.listen(port, function() {
     13        console.log('Listening on port',port);
     14    });
    315});
    4 
    5 var port = process.env.PORT || 5000;
    6 app.listen(port, function() {
    7     console.log('Listening on port',port);
    8 });
  • Dev/trunk/src/server/standalone.js

    r463 r464  
    22var https = require("https");
    33var os = require("os");
    4 var path = require("path");
    54var _ = require("underscore");
    65
     
    109
    1110var httpsOptions = {
    12     key: fs.readFileSync(path.resolve('../qed-server.key')),
    13     cert: fs.readFileSync(path.resolve('../qed-server.pem'))
     11    key: fs.readFileSync(__dirname+'/../qed-server.key'),
     12    cert: fs.readFileSync(__dirname+'/../qed-server.pem')
    1413};
    1514
Note: See TracChangeset for help on using the changeset viewer.