Changeset 519


Ignore:
Timestamp:
03/15/14 01:00:23 (11 years ago)
Author:
hendrikvanantwerpen
Message:
  • Support different environments with QED_ENV. If dev, run against qed-dev database, if production, run against qed database. The UI indicates if we are running in anything but production mode.
  • Return undefined if we allow page leaves, because null is treated as a value.
  • Changed format of design docs, so it can work for different databases.
  • Use correct design documents in configCouch, so server now actually updates them when it starts.
Location:
Dev/trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • Dev/trunk/Gruntfile.js

    r518 r519  
    8484        { cwd: srcDir, ext: '.css' });
    8585
     86    var mode = process.env.QED_ENV || 'dev';
     87    var dbNames = {
     88        dev: 'qed-dev',
     89        production: 'qed'
     90    };
     91    if ( !( mode in dbNames ) ) {
     92        throw new Error("Unknown mode "+mode+" specified.");
     93    }
     94
    8695    // TASK CONFIG
    8796
    8897    grunt.initConfig({
    8998        localDbURL: "http://localhost:5984",
     99        dbName: dbNames[mode],
    90100        timestamp: "<%= grunt.template.today(\"UTC:yyyymmdd't'HHMMss'z'\") %>",
    91101
     
    155165                    method: 'POST',
    156166                    body: {
    157                         source: "<%= herokuConfig.CLOUDANT_URL %>/qed",
    158                         target: "qed-<%= timestamp %>",
     167                        source: "<%= herokuConfig.CLOUDANT_URL %>/<%= dbName %>",
     168                        target: "<%= dbName %>-<%= timestamp %>",
    159169                        create_target: true
    160170                    },
     
    167177                    method: 'POST',
    168178                    body: {
    169                         source: "<%= herokuConfig.CLOUDANT_URL %>/qed",
    170                         target: "qed"
     179                        source: "<%= herokuConfig.CLOUDANT_URL %>/<%= dbName %>",
     180                        target: "<%= dbName %>"
    171181                    },
    172182                    json: true
     
    178188                    method: 'POST',
    179189                    body: {
    180                         source: "qed",
    181                         target: "<%= herokuConfig.CLOUDANT_URL %>/qed"
     190                        source: "<%= dbName %>",
     191                        target: "<%= herokuConfig.CLOUDANT_URL %>/<%= dbName %>"
    182192                    },
    183193                    json: true
  • Dev/trunk/src/client/index.html

    r468 r519  
    2525        <div id="content" class="page" data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="region:'center'" style="width: 100%; height: 100%;">
    2626            <div class="topbar" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
    27                 <a href="#!/"><h1>QED</h1></a>
     27                <a href="#!/"><h1>QED</h1></a><span id="qedModeNode"></span>
    2828                <div id="menu"></div>
    2929            </div>
  • Dev/trunk/src/client/qed-client/app/Router.js

    r515 r519  
    2929            this._handleHashChange(hash());
    3030            window.onbeforeunload = function(evt) {
    31                 var msg = Content.isDirty() ?
    32                         "Unsaved changes, leave anyway?" :
    33                         null;
    34                 evt.returnValue = msg;
     31                var msg;
     32                if ( Content.isDirty() ) {
     33                    msg = "Unsaved changes, leave anyway?";
     34                    evt.returnValue = msg;
     35                }
    3536                return msg;
    3637            };
  • Dev/trunk/src/client/qed-client/css/ui/topbar.less

    r443 r519  
    66        float: left;
    77        clear: left;
     8    }
     9   
     10    #qedModeNode {
     11        float: left;
     12        margin-top: 28px;
    813    }
    914   
  • Dev/trunk/src/client/qed-client/index.js

    r472 r519  
    55    "./ui/MainMenu",
    66    "dojo/_base/array",
     7    "dojo/_base/xhr",
     8    "dojo/dom",
    79    "dojo/parser",
    810    "./stddeps",
    911    "dojo/domReady!"
    10 ], function(Router, routes, session, MainMenu, array, parser) {
     12], function(Router, routes, session, MainMenu, array, xhr, dom, parser) {
    1113
    1214    parser.parse();
    1315
    1416    new MainMenu({},"menu").startup();
     17
     18    xhr("GET", {
     19        url: 'api/mode',
     20        handleAs: 'json'
     21    }).then(function(result){
     22        var node = dom.byId('qedModeNode');
     23        if ( result.mode !== 'production' ) {
     24            node.innerHTML = "Running in "+result.mode+" mode";
     25        }
     26    });
    1527
    1628    array.forEach(routes,function(route){
  • Dev/trunk/src/client/qed-client/pages/surveyRun.js

    r506 r519  
    4747            .then(lang.hitch(this,function(allResponses){
    4848                array.forEach(allResponses, function(response){
    49                     var actions = {
    50                         view: {
    51                             callback: function(){},
     49                    var actions = {};
     50                    if ( !response.publicationDate ) {
     51                        actions.Delete = {
     52                            callback: function(){
     53                                responses.remove(response)
     54                                .then(function(){
     55                                    w.destroy();
     56                                });
     57                            },
    5258                            properties: {
    53                                 title: "View response"
    54                             }
    55                         }
    56                     };
    57                     if ( !response.publicationDate ) {
    58                         actions.remove = {
    59                             callback: function(){},
    60                             properties: {
    61                                 title: "Remove response"
     59                                icon: 'Delete',
     60                                title: "Delete response"
    6261                            }
    6362                        };
  • Dev/trunk/src/server/app.js

    r508 r519  
    1414  ;
    1515
    16 function assertSetting(name, settings, validate) {
    17     if ( typeof settings[name] === 'undefined' ) {
    18         throw new Error("Required setting '"+name+"' undefined.");
    19     }
    20     if ( _.isFunction(validate) && !validate(settings[name]) ) {
    21         throw new Error("Setting '"+name+"' with value '"+settings[name]+"' is invalid.");
    22     }
    23 }
    24 
    25 exports.App = function(settings) {
    26 
    27     assertSetting("couchServerURL", settings, _.isString);
    28     assertSetting("dbName", settings, _.isString);
    29     var couch = new CouchDB(settings.couchServerURL,settings.dbName);
     16exports.App = function(env) {
     17
     18    assertSetting("couchServerURL", env, _.isString);
     19    assertSetting("dbName", env, _.isString);
     20    assertSetting("mode", env, _.isString);
     21    var couch = new CouchDB(env.couchServerURL,env.dbName);
    3022   
    3123    var schema = require("./config/couchdb-schema.json");
     
    3527            throw new Error(msg);
    3628        }
    37         return configureApp(settings,couch,schema);
     29        return configureApp(env,couch,schema);
    3830    });
    3931
    4032};
    4133
    42 function configureApp(settings,couch,schema) {
     34function configureApp(env,couch,schema) {
    4335
    4436    function clientPath(relativePath) {
     
    4638    }
    4739
    48     passport.use(new passportLocal.Strategy(function(username, password, done){
    49         if ( username === "igor" && password === "mayer" ) {
    50             done(null,{ username: "igor" });
    51         } else {
    52             done(null,false,{ message: 'Invalid credentials.' });
    53         }
    54     }));
     40    passport.use(
     41        new passportLocal.Strategy(
     42            function(username, password, done){
     43                if ( username === "igor" && password === "mayer" ) {
     44                    done(null,{ username: "igor" });
     45                } else {
     46                    done(null,false,{ message: 'Invalid credentials.' });
     47                }
     48            }));
    5549    passport.serializeUser(function(user, done) {
    5650        done(null, user.username);
     
    952946        });
    953947
     948    app.get('/api/mode',
     949        ensureMIME(JSON_MIME),
     950        function(req,res){
     951            res.send({mode:env.mode});
     952        });
     953
     954
    954955    return app;
    955956}
     
    991992    return result;
    992993}
     994
     995function assertSetting(name, settings, validate) {
     996    if ( typeof settings[name] === 'undefined' ) {
     997        throw new Error("Required setting '"+name+"' undefined.");
     998    }
     999    if ( _.isFunction(validate) && !validate(settings[name]) ) {
     1000        throw new Error("Setting '"+name+"' with value '"+settings[name]+"' is invalid.");
     1001    }
     1002}
  • Dev/trunk/src/server/bin/check-db.js

    r487 r519  
    22  , checkCouch = require('../config/check-couchdb')
    33  ;
     4console.log("Running on",env.couchServerURL+env.dbName);
    45checkCouch(env.couchServerURL,env.dbName)
    56.then(function(res){
  • Dev/trunk/src/server/bin/config-db-for-upgrade.js

    r487 r519  
    33  , designDocs = require('../config/couchdb-upgrade-design-docs')
    44  ;
     5console.log("Running on",env.couchServerURL+env.dbName);
    56configCouch(env.couchServerURL,env.dbName,designDocs)
    67.then(function(res){
  • Dev/trunk/src/server/bin/config-db.js

    r487 r519  
    33  , designDocs = require('../config/couchdb-design-docs')
    44  ;
     5console.log("Running on",env.couchServerURL+env.dbName);
    56configCouch(env.couchServerURL,env.dbName,designDocs)
    67.then(function(res){
  • Dev/trunk/src/server/bin/heroku.js

    r487 r519  
    11var env = require('../env')
    22  , configCouch = require('../config/config-couchdb')
    3   , designDocs = require('../config/config-couchdb')
     3  , designDocs = require('../config/couchdb-design-docs')
    44  ;
    55
    6 console.log("Running on",env.couchServerURL);
     6console.log("Running on",env.couchServerURL+env.dbName);
    77
    8 require('../app').App({
    9     couchServerURL: env.couchServerURL,
    10     dbName: env.dbName
    11 }).then(function(app){
     8require('../app').App(env)
     9.then(function(app){
    1210    configCouch(env.couchServerURL,env.dbName,designDocs);
    1311    return app;
  • Dev/trunk/src/server/config/config-couchdb.js

    r487 r519  
    2020        }
    2121    }).then(function(res){
    22         console.log("Checking database 'qed'");
    23         return server.get('qed')
     22        console.log("Checking database '"+dbName+"'");
     23        return server.get(dbName)
    2424        .then(function(db){
    25             console.log("Database 'qed' found.");
     25            console.log("Database found.");
    2626        },function(err){
    27             console.log("Creating database 'qed'");
    28             return server.put('qed');
     27            console.log("Creating database.");
     28            return server.put(dbName);
    2929        });
    3030    }).then(function(){
     
    3434                var configAction = doc.__configAction || "replace";
    3535                delete doc.__configAction;
     36                docUrl = dbName+'/'+docUrl;
    3637                switch (configAction) {
    3738                case "ignore":
  • Dev/trunk/src/server/config/couchdb-design-docs.js

    r516 r519  
    11module.exports = {
    22
    3     "_users/qed_admin": {
    4         __configAction: "ignore",
    5         _id: "org.couchdb.user:qed_admin",
    6         name: "qed_admin",
    7         password: "Welkom01",
    8         roles: [ "qed_admin" ],
    9         type: "user"
    10     },
    11 
    12     "qed/schemaInfo": {
     3    "schemaInfo": {
     4        _id: "schemaInfo",
    135        version: "4"
    146    },
    157
    16     "qed/_security": {
    17         __configAction: "ignore",
    18         admins: {
    19             names: [],
    20             roles: ["qed_admin"]
    21         },
    22         readers: {
    23             names: [],
    24             roles: ["qed_user"]
    25         }
    26     },
    27 
    28     "qed/_design/protectPublished": {
     8    "_design/protectPublished": {
    299        __configAction: "replace",
    30         _id: "_design/protectPublished",
    3110        language: "javascript",
    3211        validate_doc_update: function(newDoc, oldDoc, userCtx, secObj) {
     
    3716    },
    3817
    39     "qed/_design/default": {
     18    "_design/default": {
    4019        __configAction: "replace",
    41         _id: "_design/default",
    4220        language: "javascript",
    4321        views: {
     
    5735    },
    5836
    59     "qed/_design/questions": {
     37    "_design/questions": {
    6038        __configAction: "replace",
    61         _id: "_design/questions",
    6239        language: "javascript",
    6340        views: {
     
    11794    },
    11895
    119     "qed/_design/surveys": {
     96    "_design/surveys": {
    12097        __configAction: "replace",
    121         _id: "_design/surveys",
    12298        language: "javascript",
    12399        views: {
     
    137113    },
    138114
    139     "qed/_design/surveyRuns": {
     115    "_design/surveyRuns": {
    140116        __configAction: "replace",
    141         _id: "_design/surveys",
    142117        language: "javascript",
    143118        views: {
     
    153128    },
    154129
    155     "qed/_design/responses": {
     130    "_design/responses": {
    156131        __configAction: "replace",
    157         _id: "_design/responses",
    158132        language: "javascript",
    159133        views: {
  • Dev/trunk/src/server/config/couchdb-upgrade-design-docs.js

    r516 r519  
    11module.exports = {
    22
    3     "qed/schemaInfo": {
     3    "schemaInfo": {
    44        version: "-1"
    55    },
    66
    7     "qed/_design/protectPublished": {
    8         __configAction: "replace",
    9         _id: "_design/protectPublished"
     7    "_design/protectPublished": {
     8        __configAction: "replace"
    109    }
    1110
  • Dev/trunk/src/server/env.js

    r487 r519  
    1 var couchServerURL = (process.env.CLOUDANT_URL || 'http://localhost:5984')+'/';
     1var dbNames = {
     2    dev: 'qed-dev',
     3    production: 'qed'
     4};
     5var mode = process.env.QED_ENV || 'dev';
     6if ( !( mode in dbNames ) ) {
     7    throw new Error("Unknown environment "+mode);
     8}
    29module.exports = {
    310    port: process.env.PORT || 5000,
    4     couchServerURL: couchServerURL,
    5     dbName: 'qed'
     11    couchServerURL: (process.env.CLOUDANT_URL || 'http://localhost:5984')+'/',
     12    dbName: dbNames[mode],
     13    mode: mode
    614};
Note: See TracChangeset for help on using the changeset viewer.