diff --git a/routes/services/invisiblepuzzle/invisiblepuzzle.js b/routes/services/invisiblepuzzle/invisiblepuzzle.js index af9d28f570b6b129e8017834d6b5b1409216b707..c9c0df4d23c50bdd4f161e25e13a97f0a1f6433c 100644 --- a/routes/services/invisiblepuzzle/invisiblepuzzle.js +++ b/routes/services/invisiblepuzzle/invisiblepuzzle.js @@ -1,3 +1,9 @@ +// PROTOCOL SPECIFICATION +// ----------------------- +// /users/count - returns the number of users and how many of them are using VoiceOver +// /users/vib - returns objects representing who are using VoiceOver +// /users/sighted - returns objects representing who are not using VoiceOver + var express = require('express'); var router = express.Router(); @@ -8,7 +14,7 @@ var mongoClient = require('mongodb').MongoClient; var assert = assert = require('assert'); // Connection URL -var mongoUrl = 'mongodb://icarus:icarus@localhost:27017/icarus'; +var mongoUrl = 'mongodb://readOnly:readOnly@localhost:27017/icarus'; //Connect to the server and intialise the pool var icarusDb; @@ -28,11 +34,11 @@ router.get('/', function(req, res, next) { }); -router.get('/users', function(req, res, next) { +router.get('/users/count', function(req, res, next) { var collection = icarusDb.collection('resources'); - collection.aggregate( + var cursor = collection.aggregate( // Pipeline [ @@ -88,7 +94,31 @@ router.get('/users', function(req, res, next) { } ] - ).toArray(function(err, result) { + ) + + return_cursor(cursor, req, res, next); + +}); + +router.get('/users/vib', function(req, res, next) { + + var cursor = user_ids_cursor(true); + + cursor.map( function(d) { return d['_id']; } ); + return_cursor(cursor, req, res, next); + +}); + +router.get('/users/sighted', function(req, res, next) { + + var cursor = user_ids_cursor(false); + return_cursor(cursor, req, res, next); + +}); + +function return_cursor(cursor, req, res, next){ + + cursor.toArray(function(err, result) { if(err!=null){ @@ -111,7 +141,182 @@ router.get('/users', function(req, res, next) { }); +} + +function user_ids_cursor(vib){ + + var filter_condition = {$eq: 0}; + + if(vib==true){ + + filter_condition = {$gt: 0} + + } + + var collection = icarusDb.collection('resources'); + + return collection.aggregate( + + // Pipeline + [ + // Stage 1 + { + $match: { + "appdata.appname":"Invisible Puzzle", + "debug":false + } + }, + + // Stage 2 + { + $group: { + "_id": "$appdata.uuid", + "docs": {$sum: 1}, + "voiceover": {$sum : {$cond: [{$eq:["$appdata.voiceover", true]},1,0]}}, + "levels" : { + "$addToSet" : "$userdata.level.id" + }, + "sonifications" : { + "$addToSet" : "$userdata.sonification" + } + } + + }, + + // Stage 3 + { + $project: { + + "docs": 1, + "vo_ratio": {$divide:["$voiceover","$docs"]}, + "levels": 1, + "sonification": 1 + + } + }, + + // Stage 4 + { + $match: { + + "vo_ratio": filter_condition + + } + } + + ] + + ) + +} + +/*router.get('/users/', function(req, res, next) { + + var refresh = req.query.refresh; + + if(refresh==1){ + + rebuild_user_stats(req, res, next); + + }else{ + + res.sendStatus(500); + + } + + }); +function rebuild_user_stats(req, res, next){ + + var collection = icarusDb.collection('resources'); + collection.aggregate( + + // Pipeline + [ + // Stage 1 + { + $match: { + "appdata.appname" : "Invisible Puzzle", + "debug" : false + } + }, + + // Stage 2 + { + $group: { + "_id" : "$appdata.uuid", + "docs" : { + "$sum" : 1 + }, + "voiceover" : { + "$sum" : { + "$cond" : [ + { + "$eq" : [ + "$appdata.voiceover", + true + ] + }, + 1, + 0 + ] + } + }, + "levels" : { + "$addToSet" : "$userdata.level.id" + }, + "sonifications" : { + "$addToSet" : "$userdata.sonification" + } + } + }, + + // Stage 3 + { + $project: { + "docs" : 1, + "vo_ratio" : { + "$divide" : [ + "$voiceover", + "$docs" + ] + }, + "levels" : 1, + "sonifications" : 1 + } + }, + + // Stage 4 + { + $out: "ip_user_stats" + } + ] + + ).toArray(function(err, result) { + + if(err!=null){ + + debug(err); + next(err); + + }else{ + + if(result==undefined){ + + res.sendStatus(404); + + }else{ + + res.sendStatus(201, result); + + } + + } + + }); + +}*/ + module.exports = router;