Continuing on micro workers, and corrected some bugs
This commit is contained in:
parent
bee440668c
commit
aa76fed43a
|
@ -1,4 +1,5 @@
|
||||||
module.exports.index = function(req, res) {
|
module.exports.index = function(req, res) {
|
||||||
|
|
||||||
res.setHeader('Content-Type', 'text/html');
|
res.setHeader('Content-Type', 'text/html');
|
||||||
|
|
||||||
res.render('index.jade', res.locals, function(err, result) {
|
res.render('index.jade', res.locals, function(err, result) {
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
module.exports.index = function(req, res) {
|
module.exports.index = function(req, res) {
|
||||||
|
|
||||||
|
req.session.workerId = req.params.workerId;
|
||||||
|
req.session.save();
|
||||||
|
|
||||||
res.setHeader('Content-Type', 'text/html');
|
res.setHeader('Content-Type', 'text/html');
|
||||||
|
|
||||||
res.render('index.jade', res.locals, function(err, result) {
|
res.render('index.jade', res.locals, function(err, result) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
'/intro': 'index',
|
'/intro': 'index',
|
||||||
|
'/intro/:workerId': 'index',
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Polyfill of find array
|
// Polyfill of find array
|
||||||
if (!Array.prototype.find) {
|
if (!Array.prototype.find) {
|
||||||
Array.prototype.find = function(predicate) {
|
Array.prototype.find = function(predicate) {
|
||||||
if (this == null) {
|
if (this === null || this === undefined) {
|
||||||
throw new TypeError('Array.prototype.find a été appelé sur null ou undefined');
|
throw new TypeError('Array.prototype.find a été appelé sur null ou undefined');
|
||||||
}
|
}
|
||||||
if (typeof predicate !== 'function') {
|
if (typeof predicate !== 'function') {
|
||||||
|
@ -22,9 +22,42 @@ if (!Array.prototype.find) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Production steps of ECMA-262, Edition 5, 15.4.4.21
|
||||||
|
// Reference: http://es5.github.io/#x15.4.4.21
|
||||||
|
if (!Array.prototype.reduce) {
|
||||||
|
Array.prototype.reduce = function(callback /*, initialValue*/) {
|
||||||
|
'use strict';
|
||||||
|
if (this === null || this === undefined) {
|
||||||
|
throw new TypeError('Array.prototype.reduce called on null or undefined');
|
||||||
|
}
|
||||||
|
if (typeof callback !== 'function') {
|
||||||
|
throw new TypeError(callback + ' is not a function');
|
||||||
|
}
|
||||||
|
var t = Object(this), len = t.length >>> 0, k = 0, value;
|
||||||
|
if (arguments.length == 2) {
|
||||||
|
value = arguments[1];
|
||||||
|
} else {
|
||||||
|
while (k < len && !(k in t)) {
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
if (k >= len) {
|
||||||
|
throw new TypeError('Reduce of empty array with no initial value');
|
||||||
|
}
|
||||||
|
value = t[k++];
|
||||||
|
}
|
||||||
|
for (; k < len; k++) {
|
||||||
|
if (k in t) {
|
||||||
|
value = callback(value, t[k], k, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
var pg = require('pg');
|
var pg = require('pg');
|
||||||
var pgc = require('../../private.js');
|
var pgc = require('../../private.js');
|
||||||
var Log = require('../../lib/NodeLog.js');
|
var Log = require('../../lib/NodeLog.js');
|
||||||
|
var async = require('async');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -605,7 +638,7 @@ function predicate(line) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
(elt.recommendationStyle !== null && (elt.recommendationStyle.trim() === line.recommendationStyle.trim())) ||
|
(elt.recommendationStyle !== null && (elt.recommendationStyle.trim() === line.recommendationStyle.trim())) ||
|
||||||
line.id === elt.coinCombinationId
|
line.sceneId === elt.sceneId
|
||||||
);
|
);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -1182,6 +1215,61 @@ DBReq.TutorialCreator.prototype.finish = function() {
|
||||||
this.finishAction(this.finalResult.expId, this.finalResult.coins);
|
this.finishAction(this.finalResult.expId, this.finalResult.coins);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DBReq.UserVerifier = function(userId, finishAction) {
|
||||||
|
this.userId = userId;
|
||||||
|
this.finishAction = finishAction;
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
pg.connect(pgc.url, function(err, client, release) {
|
||||||
|
self.client = client;
|
||||||
|
self.release = release;
|
||||||
|
|
||||||
|
self.execute();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
DBReq.UserVerifier.prototype.execute = function() {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
this.client.query(
|
||||||
|
"SELECT id as \"expId\" FROM Experiment WHERE user_id = $1",
|
||||||
|
[self.userId],
|
||||||
|
function(err, result) {
|
||||||
|
if (result.rows.length !== 4) {
|
||||||
|
self.finish(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
async.map(
|
||||||
|
result.rows,
|
||||||
|
function(elt, callback) {
|
||||||
|
self.client.query(
|
||||||
|
"SELECT count(*) > 5 AS ok FROM CoinClicked WHERE exp_id = $1",
|
||||||
|
[elt.expId],
|
||||||
|
function(err, result) {
|
||||||
|
callback(null, result.rows[0].ok === true);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
function(err, result) {
|
||||||
|
var ok = result.reduce(function(prev, next) { return prev && next; });
|
||||||
|
self.finish(ok);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
DBReq.UserVerifier.prototype.finish = function(finalResult) {
|
||||||
|
this.release();
|
||||||
|
|
||||||
|
this.client = null;
|
||||||
|
this.release = null;
|
||||||
|
this.finishAction(finalResult);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to get a user by id, and creates it if it doesn't exists
|
* Try to get a user by id, and creates it if it doesn't exists
|
||||||
* @param id {Number} id to test
|
* @param id {Number} id to test
|
||||||
|
@ -1276,4 +1364,8 @@ DBReq.getLastExp = function(id, callback) {
|
||||||
new DBReq.LastExpGetter(id, callback);
|
new DBReq.LastExpGetter(id, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DBReq.verifyUser = function(id, callback) {
|
||||||
|
new DBReq.UserVerifier(id, callback);
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = DBReq;
|
module.exports = DBReq;
|
||||||
|
|
|
@ -82,7 +82,7 @@ module.exports.play = function(req, res) {
|
||||||
db.getLastExp(req.session.userId, function(expId, sceneId, coinId, recoStyle, coins) {
|
db.getLastExp(req.session.userId, function(expId, sceneId, coinId, recoStyle, coins) {
|
||||||
|
|
||||||
res.locals.scene = sceneToFunction(sceneId);
|
res.locals.scene = sceneToFunction(sceneId);
|
||||||
res.locals.recommendationStyle= recoStyle;
|
res.locals.recommendationStyle = recoStyle;
|
||||||
res.locals.coins = coins;
|
res.locals.coins = coins;
|
||||||
|
|
||||||
req.session.experiments.push({
|
req.session.experiments.push({
|
||||||
|
@ -236,7 +236,6 @@ module.exports.viewer = editorHelper('prototype_viewer.jade');
|
||||||
module.exports.checker = editorHelper('prototype_checker.jade');
|
module.exports.checker = editorHelper('prototype_checker.jade');
|
||||||
|
|
||||||
module.exports.userstudy = function(req, res) {
|
module.exports.userstudy = function(req, res) {
|
||||||
res.setHeader('Content-Type', 'text/html');
|
|
||||||
|
|
||||||
if (req.session.userId !== undefined) {
|
if (req.session.userId !== undefined) {
|
||||||
|
|
||||||
|
@ -249,6 +248,9 @@ module.exports.userstudy = function(req, res) {
|
||||||
req.session.identificationFailed = false;
|
req.session.identificationFailed = false;
|
||||||
req.session.save();
|
req.session.save();
|
||||||
|
|
||||||
|
res.locals.workerId = req.session.workerId;
|
||||||
|
|
||||||
|
res.setHeader('Content-Type', 'text/html');
|
||||||
res.render('user_study.jade', res.locals, function(err, result) {
|
res.render('user_study.jade', res.locals, function(err, result) {
|
||||||
res.send(result);
|
res.send(result);
|
||||||
});
|
});
|
||||||
|
|
|
@ -39,7 +39,10 @@ block content
|
||||||
form#form.form-signin(method="POST", action='/identification')
|
form#form.form-signin(method="POST", action='/identification')
|
||||||
h2 Please sign in
|
h2 Please sign in
|
||||||
label(for='inputId').sr-only Id
|
label(for='inputId').sr-only Id
|
||||||
input#inputId.form-control(name="inputId", type="text", placeholder='Id', required, autofocus)
|
if (workerId === undefined)
|
||||||
|
input#inputId.form-control(name="inputId", type="text", placeholder='Id', required, autofocus)
|
||||||
|
else
|
||||||
|
input#inputId.form-control(name="inputId", type="text", placeholder='Id', required, autofocus, disabled, value="#{workerId}")
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
label Gender
|
label Gender
|
||||||
|
|
|
@ -1,12 +1,28 @@
|
||||||
|
var db = require('../prototype/dbrequests.js');
|
||||||
|
var vcode = require('../../lib/vcode.js');
|
||||||
|
|
||||||
module.exports.index = function(req, res) {
|
module.exports.index = function(req, res) {
|
||||||
|
|
||||||
req.session = null;
|
db.verifyUser(req.session.userId, function(ok) {
|
||||||
res.locals.session = null;
|
|
||||||
|
|
||||||
res.setHeader('Content-Type', 'text/html');
|
if (ok) {
|
||||||
|
|
||||||
|
res.locals.vcode = vcode(req.session.workerId, req.session.campaignIp);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
res.locals.workerId = req.session.workerId;
|
||||||
|
req.session = null;
|
||||||
|
res.locals.session = null;
|
||||||
|
|
||||||
|
res.setHeader('Content-Type', 'text/html');
|
||||||
|
|
||||||
|
res.render('index.jade', res.locals, function(err, result) {
|
||||||
|
console.log(err);
|
||||||
|
res.send(result);
|
||||||
|
});
|
||||||
|
|
||||||
res.render('index.jade', res.locals, function(err, result) {
|
|
||||||
res.send(result);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -6,3 +6,8 @@ block content
|
||||||
source(src="/static/data/music/thankyou.ogg")
|
source(src="/static/data/music/thankyou.ogg")
|
||||||
source(src="/static/data/music/thankyou.mp3")
|
source(src="/static/data/music/thankyou.mp3")
|
||||||
|
|
||||||
|
if (vcode !== undefined)
|
||||||
|
p Your vcode is #{vcode}.
|
||||||
|
else if (workerId !== undefined)
|
||||||
|
p You have no vcode because you're bad
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
var hash = require('sha256');
|
var hash = require('sha256');
|
||||||
var secretKey = require('../private.js').microSecretKey;
|
var secretKey = require('../private.js').microSecretKey;
|
||||||
|
|
||||||
module.exports = function(campaignId, workerId) {
|
module.exports = function(workerId, campaignId) {
|
||||||
|
|
||||||
|
if (campaignId === undefined) {
|
||||||
|
|
||||||
|
return 'mw-dummyvcode';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return 'mw-' + hash(campaignId + workerId + secretKey);
|
return 'mw-' + hash(campaignId + workerId + secretKey);
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,11 @@
|
||||||
"name": "3d-interface",
|
"name": "3d-interface",
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"async": {
|
||||||
|
"version": "1.4.2",
|
||||||
|
"from": "async@1.4.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/async/-/async-1.4.2.tgz"
|
||||||
|
},
|
||||||
"body-parser": {
|
"body-parser": {
|
||||||
"version": "1.12.4",
|
"version": "1.12.4",
|
||||||
"from": "https://registry.npmjs.org/body-parser/-/body-parser-1.12.4.tgz",
|
"from": "https://registry.npmjs.org/body-parser/-/body-parser-1.12.4.tgz",
|
||||||
|
|
|
@ -12,7 +12,8 @@
|
||||||
"serve-favicon": "2.3.0",
|
"serve-favicon": "2.3.0",
|
||||||
"emailjs":"0.3.16",
|
"emailjs":"0.3.16",
|
||||||
"three":"0.71.0",
|
"three":"0.71.0",
|
||||||
"sha256":"0.2.0"
|
"sha256":"0.2.0",
|
||||||
|
"async":"1.4.2"
|
||||||
},
|
},
|
||||||
"repository" : {
|
"repository" : {
|
||||||
"type" : "git",
|
"type" : "git",
|
||||||
|
|
|
@ -9,7 +9,7 @@ module.exports.index = function(req, res) {
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
|
|
||||||
db.createUser(
|
db.createUser(
|
||||||
req.body.inputId,
|
req.session.workerId || req.body.inputId,
|
||||||
req.body.inputAge,
|
req.body.inputAge,
|
||||||
req.body.inputGender === 'male',
|
req.body.inputGender === 'male',
|
||||||
req.body.input3dskills,
|
req.body.input3dskills,
|
||||||
|
|
Loading…
Reference in New Issue