Router thingies!

This commit is contained in:
Kasper Rynning-Tønnesen
2020-01-17 15:59:21 +01:00
parent 11aba3556f
commit 002cf71137
10 changed files with 352 additions and 10 deletions

52
api/login.js Normal file
View File

@@ -0,0 +1,52 @@
const passport = require("passport");
const path = require("path");
const User = require(path.join(__dirname + "/../schemas/User"));
const router = require("express").Router();
router.get("/", function(req, res) {
res.render("index", { user: req.user });
});
router.get("/register", function(req, res) {
res.render("register", {});
});
router.post("/register", function(req, res, next) {
console.log("registering user");
User.register(
new User({ username: req.body.username }),
req.body.password,
function(err) {
if (err) {
console.log("error while user register!", err);
return next(err);
}
console.log("user registered!");
res.redirect("/");
}
);
});
router.get("/login", function(req, res) {
res.render("login", { user: req.user, message: req.flash("error") });
});
router.post(
"/login",
passport.authenticate("local", {
failureRedirect: "/login",
failureFlash: true
}),
function(req, res) {
res.redirect("/");
}
);
router.get("/logout", function(req, res) {
req.logout();
res.redirect("/");
});
module.exports = router;

99
api/retrieve.js Normal file
View File

@@ -0,0 +1,99 @@
const express = require("express");
const path = require("path");
const router = express.Router();
const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost:27017/vinlottis", {
useNewUrlParser: true
});
const Purchase = require(path.join(__dirname + "/../schemas/Purchase"));
const Wine = require(path.join(__dirname + "/../schemas/Wine"));
const Highscore = require(path.join(__dirname + "/../schemas/Highscore"));
router.use((req, res, next) => {
next();
});
router.route("/purchase/statistics").get(async (req, res) => {
let purchases = await Purchase.find()
.populate("wines")
.sort({ date: 1 });
res.json(purchases);
});
router.route("/purchase/statistics/color").get(async (req, res) => {
const countColor = await Purchase.find();
let red = 0;
let blue = 0;
let yellow = 0;
let green = 0;
for (let i = 0; i < countColor.length; i++) {
let element = countColor[i];
red += element.red;
blue += element.blue;
yellow += element.yellow;
green += element.green;
}
const highscore = await Highscore.find();
let redWin = 0;
let blueWin = 0;
let yellowWin = 0;
let greenWin = 0;
for (let i = 0; i < highscore.length; i++) {
let element = highscore[i];
for (let y = 0; y < element.wins.length; y++) {
let currentWin = element.wins[y];
switch (currentWin.color) {
case "blue":
blueWin += 1;
break;
case "red":
redWin += 1;
break;
case "yellow":
yellowWin += 1;
break;
case "green":
greenWin += 1;
break;
}
}
}
const total = red + yellow + blue + green;
res.json({
red: {
total: red,
win: redWin
},
blue: {
total: blue,
win: blueWin
},
green: {
total: green,
win: greenWin
},
yellow: {
total: yellow,
win: yellowWin
},
total: total
});
});
router.route("/highscore/statistics").get(async (req, res) => {
const highscore = await Highscore.find().populate("wins.wine");
res.json(highscore);
});
router.route("/wines/statistics").get(async (req, res) => {
const wines = await Wine.find();
res.json(wines);
});
module.exports = router;

94
api/update.js Normal file
View File

@@ -0,0 +1,94 @@
const express = require("express");
const path = require("path");
const router = express.Router();
const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost:27017/vinlottis", {
useNewUrlParser: true
});
const Purchase = require(path.join(__dirname + "/../schemas/Purchase"));
const Wine = require(path.join(__dirname + "/../schemas/Wine"));
const Highscore = require(path.join(__dirname + "/../schemas/Highscore"));
router.use((req, res, next) => {
next();
});
router.route("/log").post(async (req, res) => {
if (!req.isAuthenticated()) {
return;
}
const purchaseBody = req.body.purchase;
const winnersBody = req.body.winners;
const date = purchaseBody.date;
const blue = purchaseBody.blue;
const red = purchaseBody.red;
const yellow = purchaseBody.yellow;
const green = purchaseBody.green;
const winesThisDate = [];
for (let i = 0; i < winnersBody.length; i++) {
let currentWinner = winnersBody[i];
let wonWine = await Wine.findOne({ name: currentWinner.wine.name });
if (wonWine == undefined) {
const newWonWine = new Wine({
name: currentWinner.wine.name,
vivinoLink: currentWinner.wine.vivinoLink,
rating: currentWinner.wine.rating,
occurences: 1
});
await newWonWine.save();
wonWine = newWonWine;
} else {
wonWine.occurences += 1;
await wonWine.save();
}
winesThisDate.push(wonWine);
const person = await Highscore.findOne({
name: currentWinner.name
});
if (person == undefined) {
let newPerson = new Highscore({
name: currentWinner.name,
wins: [
{
color: currentWinner.color,
date: date,
wine: wonWine
}
]
});
await newPerson.save();
} else {
person.wins.push({
color: currentWinner.color,
date: date,
wine: wonWine
});
person.markModified("wins");
await person.save();
}
}
let purchase = new Purchase({
date: date,
blue: blue,
yellow: yellow,
red: red,
green: green,
wines: winesThisDate
});
await purchase.save();
res.send(true);
});
module.exports = router;

45
package-lock.json generated
View File

@@ -148,6 +148,33 @@
"vary": "~1.1.2"
}
},
"express-session": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.0.tgz",
"integrity": "sha512-t4oX2z7uoSqATbMfsxWMbNjAL0T5zpvcJCk3Z9wnPPN7ibddhnmDZXHfEcoBMG2ojKXZoCyPMc5FbtK+G7SoDg==",
"requires": {
"cookie": "0.4.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~2.0.0",
"on-headers": "~1.0.2",
"parseurl": "~1.3.3",
"safe-buffer": "5.2.0",
"uid-safe": "~2.1.5"
},
"dependencies": {
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
},
"safe-buffer": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
}
}
},
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
@@ -337,6 +364,11 @@
"ee-first": "1.1.1"
}
},
"on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -406,6 +438,11 @@
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
},
"random-bytes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
"integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -551,6 +588,14 @@
"mime-types": "~2.1.24"
}
},
"uid-safe": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
"integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
"requires": {
"random-bytes": "~1.0.0"
}
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",

View File

@@ -10,7 +10,9 @@
"author": "",
"license": "ISC",
"dependencies": {
"body-parser": "^1.19.0",
"express": "^4.17.1",
"express-session": "^1.17.0",
"mongoose": "^5.8.7",
"passport": "^0.4.1",
"passport-local": "^1.0.0",

View File

@@ -3,7 +3,7 @@ const Schema = mongoose.Schema;
const Highscore = new Schema({
name: String,
Wins: [
wins: [
{
color: String,
date: Date,
@@ -15,4 +15,4 @@ const Highscore = new Schema({
]
});
module.exports = Highscore;
module.exports = mongoose.model("Highscore", Highscore);

View File

@@ -6,7 +6,13 @@ const Purchase = new Schema({
blue: Number,
red: Number,
yellow: Number,
green: Number
green: Number,
wines: [
{
type: Schema.Types.ObjectId,
ref: "Wine"
}
]
});
module.exports = Purchase;
module.exports = mongoose.model("Purchase", Purchase);

View File

@@ -4,7 +4,8 @@ const Schema = mongoose.Schema;
const Wine = new Schema({
name: String,
vivinoLink: String,
rating: Number
rating: Number,
occurences: Number
});
module.exports = Wine;
module.exports = mongoose.model("Wine", Wine);

View File

@@ -1,9 +1,52 @@
const express = require('express');
const express = require("express");
const app = express();
const path = require('path');
const path = require("path");
const session = require("express-session");
const User = require(path.join(__dirname + "/schemas/User"));
app.get('/', function(req, res) {
res.sendFile(path.join(__dirname + '/index.html'));
const updateApi = require(path.join(__dirname + "/api/update"));
const retrieveApi = require(path.join(__dirname + "/api/retrieve"));
const loginApi = require(path.join(__dirname + "/api/login"));
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
mongoose.promise = global.Promise;
mongoose.connect("mongodb://localhost/vinlottis");
mongoose.set("debug", true);
app.use(
bodyParser.urlencoded({
extended: true
})
);
app.use(bodyParser.json());
app.use(
session({
secret: "passport-tutorial",
cookie: { maxAge: 60000 },
resave: false,
saveUninitialized: false
})
);
const passport = require("passport");
const LocalStrategy = require("passport-local");
app.use(passport.initialize());
app.use(passport.session());
// use static authenticate method of model in LocalStrategy
passport.use(new LocalStrategy(User.authenticate()));
// use static serialize and deserialize of model for passport session support
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.get("/", function(req, res) {
res.sendFile(path.join(__dirname + "/public/index.html"));
});
app.use("/", loginApi);
app.use("/api/", updateApi);
app.use("/api/", retrieveApi);
app.listen(30030);