app.get('/api/v1/experiment/', function(req, res) { Experiment.find({}, function(err, doc) { if (err) { return res .status(500) .json({ 'message': err }); } if (!doc) { return res .status(404) .json({ message: 'No such experiment' }); } var docs = []; for (var i in doc) { docs.push(filterExperimentFields(doc[i])); } return res.status(200).json(docs); }); });
app.get('/api/v1/experiment/:expId/model', function(req, res) { Experiment.findById(req.params.expId, function(err, doc) { if (err) { return res .status(500) .json({ 'message': err }); } if (!doc) { return res .status(404) .json({ message: 'No such experiment' }); } var models = []; for (var i in doc.models) { models.push(filterModelFields(doc.models[i])); } return res.status(200).json(models); }); });
app.get('/api/v1/experiment/:expId/model/:mId', function(req, res) { Experiment.findById(req.params.expId, function(err, doc) { if (err) { return res .status(500) .json({ 'message': err }); } if (!doc) { return res .status(404) .json({ message: 'No such experiment' }); } for (i in doc.models) { if (doc.models[i]._id == req.params.mId) { return res.status(200).json(filterModelFields(doc.models[i])); } } return res .status(404) .json({ message: 'No such model' }); }); });
app.delete('/api/v1/experiment/:expId', function(req, res) { Experiment.findById(req.params.expId, function(err, doc) { if (err) { return res.status(500).json({ 'message': err.message }); } if (!doc) { return res.status(404).json({ 'message': 'No such experiment' }); } doc.remove(function(err, _doc) { if (err) { return res.status(500).json({ 'message': err.message }); } io.emit('experiment-removed', { '_id': req.params.expId, 'data': doc }); return res.status(200).json({ 'message': 'Model removed', 'doc': filterExperimentFields(_doc) }); }); }); });
socket.on('fetch-experiment', function(id) { Experiment.findOne({ '_id': id }, function(err, doc) { socket.emit('fetch-experiment-result', doc); }); });
app.put('/api/v1/experiment/:expId/model/:mId', function(req, res) { Experiment.findById(req.params.expId, function(err, doc) { var model = false; if (err) { return res .status(500) .json({ 'message': err }); } if (!doc) { return res .status(404) .json({ message: 'No such experiment' }); } for (i in doc.models) { if (doc.models[i]._id == req.params.mId) { model = true; break; } } if (model) { if (req.body.name) { doc.models[i].name = req.body.name; } if (req.body.description) { doc.models[i].description = req.body.description; } if (req.body.hyperparameter) { doc.models[i].hyperparameter = req.body.hyperparameter; } io.emit('model-updated', { 'experiment_id': req.params.expId, '_id': req.params.mId, 'data': doc.models[i] }); doc.save(function(err, _doc) { return res.status(200).json(filterModelFields(_doc.models[i])); }); } else { return res .status(404) .json({ message: 'No such model' }); } }); });
socket.on('fetch-model', function(data) { Experiment.findOne({ '_id': data.experiment_id }, function(err, doc) { for (var i = 0; i < doc.models.length; i++) { if (doc.models[i]._id == data.model_id) { socket.emit('fetch-model-result', doc.models[i]); } } }); });
app.post('/api/v1/experiment/', function(req, res) { var exp = new Experiment({ 'name': req.body.name || haikunator.haikunate(), 'description': req.body.description || "No description given" }); exp.save(function(err, doc) { io.emit('experiment-added', { 'data': doc }); if (err) { return res .status(500) .json({ 'message': err }); } return res .status(201) .json(filterExperimentFields(doc)); }); });
app.get('/api/v1/experiment/:expId/model/:mId/measurements/forname/:name', function(req, res) { Experiment.findOne({ '_id': req.params.expId, 'models._id': req.params.mId }, function(err, doc) { var out = {}, model = null, dataPoints = []; if (err) { return res .status(500) .json({ 'message': err }); } if (!doc) { return res .status(404) .json({ message: 'No such experiment' }); } for (i in doc.models) { if (doc.models[i]._id == req.params.mId) { model = doc.models[i]; break; } } if (model) { for (i in model.measurements) { if (model.measurements[i].name == req.params.name) { dataPoints.push(filterMeasurementFields(model.measurements[i])); } } return res.status(200).json(dataPoints); } else { return res.status(404).json({ 'message': 'No such model' }); } }); });
app.delete('/api/v1/experiment/:expId/model/:mId', function(req, res) { Experiment.findById(req.params.expId, function(err, doc) { var model = false; if (err) { return res .status(500) .json({ 'message': err }); } if (!doc) { return res .status(404) .json({ message: 'No such experiment' }); } for (i in doc.models) { if (doc.models[i]._id == req.params.mId) { model = doc.models[i]; doc.models.pull(model); break; } } if (model) { io.emit('model-removed', { 'experiment_id': doc._id, '_id': req.params.mId, 'data': doc }); doc.save(function(err, _doc) { return res.status(200).json(filterModelFields(model)); }); } else { return res .status(404) .json({ message: 'No such model' }); } }); });
app.get('/api/v1/experiment/:expId/model/:mId/measurements', function(req, res) { Experiment.findOne({ '_id': req.params.expId, 'models._id': req.params.mId }, function(err, doc) { var out = {}, model = null; if (err) { return res .status(500) .json({ 'message': err }); } if (!doc) { return res .status(404) .json({ 'message': 'No such experiment' }); } for (i in doc.models) { if (doc.models[i]._id == req.params.mId) { model = doc.models[i]; break; } } var measurements = []; for (i in model.measurements) { measurements.push(model.measurements) } if (model) { return res.status(200).json(measurements); } else { return res.status(404).json({ 'message': 'No such model' }); } }); });
app.put('/api/v1/experiment/:expId', function(req, res) { Experiment.findById(req.params.expId, function(err, doc) { if (err) { return res .status(500) .json({ 'message': err }); } if (!doc) { return res .status(404) .json({ message: 'No such experiment' }); } if (req.body.description) { doc.description = req.body.description; } if (req.body.name) { doc.name = req.body.name; } if (req.body.hyperparameter) { doc.hyperparameter = req.body.hyperparameter; } doc.save(function(err, _doc) { if (err) { return res.status(500).json({ 'message': err.message }); } io.emit('experiment-updated',{ '_id': req.params.expId, 'data': doc }); return res.status(200).json(filterExperimentFields(_doc)); }); }); });
app.get('/api/v1/experiment/:expId', function(req, res) { Experiment.findById(req.params.expId, function(err, doc) { if (err) { return res .status(500) .json({ 'message': err }); } if (!doc) { return res .status(404) .json({ message: 'No such experiment' }); } return res.status(200).json(filterExperimentFields(doc)); }); });
app.post('/api/v1/experiment/:expId/model/', function(req, res) { Experiment.findById(req.params.expId, function(err, doc) { if (err) { return res.status(500).json({ 'message': err.message }); } if (!doc) { return res.status(404).json({ message: 'No such experiment' }); } var model = doc.models.create({ 'name': req.body.name || haikunator.haikunate(), 'description': req.body.description, 'hyperparameter': req.body.hyperparameter }); doc.models.push(model); doc.save(function(err, _doc) { if (err) { return res .status(500) .json({ 'message': err }); } io.emit('model-added', { 'experiment_id': doc._id, 'data': model }); return res.status(201).json(filterModelFields(model)); }); }); });
io.on('connection', function(socket) { // Send all the experiments Experiment.find({}).sort('date_added').exec(function(err, docs) { if (!err) { // we use experiment-added to populate the experiment // list initially. quite hacky. for (var i = 0; i < docs.length; i ++) { socket.emit('experiment-added', { 'data': docs[i], '_id': docs[i]._id }); } } else { console.log(err); } }); socket.on('fetch-experiment', function(id) { Experiment.findOne({ '_id': id }, function(err, doc) { socket.emit('fetch-experiment-result', doc); }); }); socket.on('fetch-model', function(data) { Experiment.findOne({ '_id': data.experiment_id }, function(err, doc) { for (var i = 0; i < doc.models.length; i++) { if (doc.models[i]._id == data.model_id) { socket.emit('fetch-model-result', doc.models[i]); } } }); }); });
app.post('/api/v1/experiment/:expId/model/:mId/measurements', function(req, res) { Experiment.findOne({ '_id': req.params.expId, 'models._id': req.params.mId }, function(err, doc) { var model = null; if (err) { return res .status(500) .json({ 'message': err }); } if (!doc) { return res .status(404) .json({ message: 'No such experiment' }); } if (!req.body.name && !req.body.value) { return res.status(400).json({ 'message': 'Missing mandatory fields (name, value)' }); } for (i in doc.models) { if (doc.models[i]._id == req.params.mId) { model = doc.models[i]; break; } } if (model) { var measurement = model.measurements.create({ 'name': req.body.name, 'step': req.body.step || null, 'epoch': req.body.epoch || null, 'value': req.body.value }); doc.models[i].measurements.push(measurement); doc.save(function(err, doc) { if (err) { return res .status(500) .json({ 'message': err }); } io.emit('measurement-added', { 'experiment_id': doc._id, 'model_id': doc.models[i]._id, 'data': measurement, 'name': req.body.name }); return res.status(201).json(filterMeasurementFields(measurement)); }); } else { return res .status(404) .json({ message: 'No such model' }); } }); });