Commit d4903239 authored by Mattia's avatar Mattia

put server and db under docker as docker-compose services. Clean up

parent 2d20cbd1
node_modules
npm-debug.log
\ No newline at end of file
node_modules/
package-lock.json
db_data
\ No newline at end of file
FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
\ No newline at end of file
...@@ -3,10 +3,7 @@ var path = require('path'); ...@@ -3,10 +3,7 @@ var path = require('path');
var logger = require('morgan'); var logger = require('morgan');
var bodyParser = require('body-parser'); var bodyParser = require('body-parser');
var storage = require('./routes/storage')('mongodb://icarus:icarus@localhost:27017/icarus'); var storage = require('./routes/storage')('mongodb://icarus:icarus@db/icarus');
var public_storage = require('./routes/storage')('mongodb://public:public@localhost:27017/public');
var services = require('./routes/services');
var app = express(); var app = express();
...@@ -33,8 +30,6 @@ app.use(function(req, res, next) { ...@@ -33,8 +30,6 @@ app.use(function(req, res, next) {
}); });
app.use('/icarus/str', storage); app.use('/icarus/str', storage);
app.use('/icarus/pub', public_storage);
app.use('/icarus/svc', services);
// catch 404 and forward to error handler // catch 404 and forward to error handler
app.use(function(req, res, next) { app.use(function(req, res, next) {
......
version: '3'
services:
app:
working_dir: /usr/src/app
command: npm start
build: .
depends_on:
- db
volumes:
- node_modules:/usr/src/app/node_modules:cached
- ./:/usr/src/app:cached
ports:
- "8082:3000" #host:container, 3000 is the default port of Express.js
stdin_open: true
tty: true
db:
image: bitnami/mongodb
volumes:
- ./db_data:/bitnami/mongodb
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js
volumes:
node_modules:
db = db.getSiblingDB('icarus') //create and set db
db.createUser(
{
user: "icarus",
pwd: "icarus",
roles: [
{
role: "dbAdmin",
db: "icarus"
}
]
}
)
\ No newline at end of file
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
"debug": "~2.2.0", "debug": "~2.2.0",
"express": "~4.13.1", "express": "~4.13.1",
"mongodb": "~2.0", "mongodb": "~2.0",
"morgan": "~1.6.1", "morgan": "~1.6.1"
"sleep": "~3.0.0"
} }
} }
var express = require('express');
var router = express.Router();
var ip_service = require('./services/invisiblepuzzle/invisiblepuzzle');
var echo_service = require('./services/echo/echo');
router.use('/ip', ip_service);
router.use('/echo', echo_service);
router.get('/', function(req, res, next) {
res.send({
"services": ["echo","ip"]
});
});
module.exports = router;
\ No newline at end of file
var express = require('express');
var router = express.Router();
/* GET root. */
router.all('/', function(req, res, next) {
res.send(req.body);
});
module.exports = router;
// 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();
var debug = require('debug')('Icarus:server');
var mongoClient = require('mongodb').MongoClient;
var assert = assert = require('assert');
// Connection URL
var mongoUrl = 'mongodb://readOnly:readOnly@localhost:27017/icarus';
//Connect to the server and intialise the pool
var icarusDb;
mongoClient.connect(mongoUrl, function(err, db) {
assert.equal(null, err, err);
debug("Connected to MongoDB database: "+db.databaseName);
icarusDb = db;
});
/* GET root . */
router.get('/', function(req, res, next) {
res.sendStatus(200);
});
router.get('/users/count', function(req, res, next) {
var collection = icarusDb.collection('resources');
var cursor = 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]}}
}
},
// Stage 3
{
$project: {
"docs": 1,
"vo_ratio": {$divide:["$voiceover","$docs"]}
}
},
// Stage 4
{
$group: {
"_id": 1,
"users": {$sum: 1},
"vib": {$sum : {$cond: [{$gt:["$vo_ratio", 0]},1,0]}}
}
},
// Stage 5
{
$project: {
"_id": 0,
"users": 1,
"vib": 1
}
}
]
)
return_cursor(cursor, req, res, next);
});
router.get('/users/vib', function(req, res, next) {
var cursor = user_ids_cursor(true);
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 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('/explorations/hp', function(req, res, next) {
var collection = icarusDb.collection('resources');
var cursor = collection.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
"appdata.appname" : "Invisible Puzzle",
"userdata.event" : "exploration",
"appdata.voiceover": true,
"debug" : false
}
},
// Stage 2
{
$group: {
"_id" : 1,
"explorations" : {
"$sum" : 1
},
"with_hp" : {
"$sum" : {
"$cond" : [
{
"$eq" : [
"$userdata.headphones",
true
]
},
1,
0
]
}
}
}
}
]
);
return_cursor(cursor, req, res, next);
});
router.get('/explorations/hpbylevel', function(req, res, next) {
var collection = icarusDb.collection('resources');
var cursor = collection.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
"appdata.appname" : "Invisible Puzzle",
"userdata.event" : "exploration",
"appdata.voiceover": true,
"debug" : false
}
},
// Stage 2
{
$group: {
"_id" : "$userdata.level.id",
"explorations" : {
"$sum" : 1
},
"with_hp" : {
"$sum" : {
"$cond" : [
{
"$eq" : [
"$userdata.headphones",
true
]
},
1,
0
]
}
}
}
},
// Stage 3
{
$project: {
"_id": 1,
"explorations": 1,
"hp_ratio": {$divide:["$with_hp","$explorations"]}
}
},
// Stage 4
{
$sort: {
"_id": 1
}
}
]
);
return_cursor(cursor, req, res, next);
});
router.get('/sonifications/bylevel', function(req, res, next) {
var collection = icarusDb.collection('resources');
var cursor = collection.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
"appdata.appname" : "Invisible Puzzle",
"userdata.event" : "exploration",
"appdata.voiceover": true,
"debug" : false
}
},
// Stage 2
{
$project: {
"identifier": {
"lvl": "$userdata.level.id",
"son": "$userdata.sonification"
}
}
},
// Stage 3
{
$group: {
"_id": "$identifier",
"count": {$sum: 1}
}
}
]
);
return_cursor(cursor, req, res, next);
});
function return_cursor(cursor, req, res, next){
cursor.toArray(function(err, result) {
if(err!=null){
debug(err);
next(err);
}else{
if(result==undefined){
res.sendStatus(404);
}else{
res.send(200,result);
}
}
});
}
module.exports = router;
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment