app/api-service-broker/routes/mongo.js (92 lines of code) (raw):
var express = require("express");
var async = require("async");
var router = express.Router();
var jsonResponse = require("../models/jsonResponse");
var mongoose = require("mongoose");
var Rate = mongoose.model("Rate");
var Hero = mongoose.model("Hero");
var Site = mongoose.model("Site");
/* Default GET JSON for Mongo API */
router.get("/", function(req, res, next) {
var response = new jsonResponse("Default /api endpoint for mongo", 200, []);
res.json(response).status(response.status);
});
/* Get all heroes */
router.get("/heroes", function(req, res, next) {
Hero.find({})
.then(function(heroes) {
var response = new jsonResponse("ok", 200, heroes);
res.json(response).status(response.status);
})
.catch(next);
});
/* GET rated heroes */
// router.get("/heroes/rated", function(req, res, next) {
// Rate.aggregate([
// { $group: { _id: "$heroRated", AvgRating: { $avg: "$rating" } } },
// {
// $lookup: {
// from: "heroes",
// localField: "_id",
// foreignField: "_id",
// as: "Hero"
// }
// },
// {
// $replaceRoot: {
// newRoot: { $mergeObjects: [{ $arrayElemAt: ["$Hero", 0] }, "$$ROOT"] }
// }
// },
// { $project: { Hero: 0 } },
// { $sort: { AvgRating: -1 } }
// ])
// .then(function(heroes) {
// var response = new jsonResponse("ok", 200, heroes);
// res.json(response).status(response.status);
// })
// .catch(next);
// });
/* GET rated heroes */
router.get("/heroes/rated", function(req, res, next) {
var heroes = {};
async.waterfall(
[
function(cb) {
Hero.find({}).then(results => {
for (i = 0; i < results.length; i++) {
heroes[results[i]._id] = { 'name': results[i].name, 'img': results[i].img };
if (i === results.length - 1) {
cb(null, heroes);
}
}
});
},
function(heroes, cb) {
Rate.aggregate([
{
$group: {
_id: "$heroRated",
stars: { $sum: "$rating" },
votes: { $sum: 1 }
}
},
{ $sort: { stars: -1 } }
])
.then(ratings => {
cb(null, ratings, heroes);
})
.catch(next);
}
],
function(err, ratings, heroes) {
var output = [];
for (i = 0; i < ratings.length; i++) {
var result = {};
result.name = heroes[ratings[i]._id].name;
result.img = heroes[ratings[i]._id].img;
result.stars = ratings[i].stars;
result.votes = ratings[i].votes;
result.average = ratings[i].stars / ratings[i].votes;
result.halfstar = Math.round((ratings[i].stars / ratings[i].votes)*2)/2;
output.push(result);
if (i === ratings.length - 1) {
var response = new jsonResponse("ok", 200, output);
res.json(response).status(response.status);
}
}
}
);
});
/* GET site info by short code */
router.get("/sites/:code", function(req, res, next) {
Site.findOne({ shortCode: req.params.code })
.then(function(site) {
var response = new jsonResponse("ok", 200, site);
res.json(response).status(response.status);
})
.catch(next);
});
/* POST create single hero doc */
router.post("/hero", function(req, res, next) {
var hero = new Hero(req.body);
hero
.save()
.then(function(hero) {
var response = new jsonResponse("ok", 200, hero);
res.json(response).status(response.status);
})
.catch(next);
});
/* POST rating array */
router.post("/rate", function(req, res, next) {
var input = req.body;
var ratings = [];
var ip = input.userIp;
for (var i = 0, len = input.ratings.length; i < len; i++) {
var rate = new Rate({
rating: input.ratings[i].rating,
raterIp: ip,
heroRated: input.ratings[i].id
});
rate.save().then(function(rate) {
ratings.push(rate);
});
}
var response = new jsonResponse("ok", 200, ratings);
res.json(response).status(response.status);
});
module.exports = router;