/******************************************** * DO NOT EDIT THIS FILE * the verification process may break *******************************************/ const express = require("express"); const app = express(); let mongoose; try { mongoose = require("mongoose"); } catch (e) { console.log(e); } const fs = require("fs"); const path = require("path"); const bodyParser = require("body-parser"); const router = express.Router(); const enableCORS = function (req, res, next) { if (!process.env.DISABLE_XORIGIN) { const allowedOrigins = ["https://www.freecodecamp.org"]; const origin = req.headers.origin; if (!process.env.XORIGIN_RESTRICT || allowedOrigins.indexOf(origin) > -1) { console.log(req.method); res.set({ "Access-Control-Allow-Origin": origin, "Access-Control-Allow-Methods": "GET, POST, OPTIONS", "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept", }); } } next(); }; // global setting for safety timeouts to handle possible // wrong callbacks that will never be called const TIMEOUT = 10000; app.use(bodyParser.urlencoded({ extended: "false" })); app.use(bodyParser.json()); app.get("/", function (req, res) { res.sendFile(path.join(__dirname, "views", "index.html")); }); router.get("/file/*?", function (req, res, next) { if (req.params[0] === ".env") { return next({ status: 401, message: "ACCESS DENIED" }); } fs.readFile(path.join(__dirname, req.params[0]), function (err, data) { if (err) { return next(err); } res.type("txt").send(data.toString()); }); }); router.get("/is-mongoose-ok", function (req, res) { if (mongoose) { res.json({ isMongooseOk: !!mongoose.connection.readyState }); } else { res.json({ isMongooseOk: false }); } }); const Person = require("./myApp.js").PersonModel; router.use(function (req, res, next) { if (req.method !== "OPTIONS" && Person.modelName !== "Person") { return next({ message: "Person Model is not correct" }); } next(); }); router.post("/mongoose-model", function (req, res, next) { // try to create a new instance based on their model // verify it's correctly defined in some way let p; p = new Person(req.body); res.json(p); }); const createPerson = require("./myApp.js").createAndSavePerson; router.get("/create-and-save-person", function (req, res, next) { // in case of incorrect function use wait timeout then respond let t = setTimeout(() => { next({ message: "timeout" }); }, TIMEOUT); createPerson(function (err, data) { clearTimeout(t); if (err) { return next(err); } if (!data) { console.log("Missing `done()` argument"); return next({ message: "Missing callback argument" }); } Person.findById(data._id, function (err, pers) { if (err) { return next(err); } res.json(pers); pers.remove(); }); }); }); const createPeople = require("./myApp.js").createManyPeople; router.post("/create-many-people", function (req, res, next) { Person.remove({}, function (err) { if (err) { return next(err); } // in case of incorrect function use wait timeout then respond let t = setTimeout(() => { next({ message: "timeout" }); }, TIMEOUT); createPeople(req.body, function (err, data) { clearTimeout(t); if (err) { return next(err); } if (!data) { console.log("Missing `done()` argument"); return next({ message: "Missing callback argument" }); } Person.find({}, function (err, pers) { if (err) { return next(err); } res.json(pers); Person.remove().exec(); }); }); }); }); const findByName = require("./myApp.js").findPeopleByName; router.post("/find-all-by-name", function (req, res, next) { let t = setTimeout(() => { next({ message: "timeout" }); }, TIMEOUT); Person.create(req.body, function (err, pers) { if (err) { return next(err); } findByName(pers.name, function (err, data) { clearTimeout(t); if (err) { return next(err); } if (!data) { console.log("Missing `done()` argument"); return next({ message: "Missing callback argument" }); } res.json(data); Person.remove().exec(); }); }); }); const findByFood = require("./myApp.js").findOneByFood; router.post("/find-one-by-food", function (req, res, next) { let t = setTimeout(() => { next({ message: "timeout" }); }, TIMEOUT); let p = new Person(req.body); p.save(function (err, pers) { if (err) { return next(err); } findByFood(pers.favoriteFoods[0], function (err, data) { clearTimeout(t); if (err) { return next(err); } if (!data) { console.log("Missing `done()` argument"); return next({ message: "Missing callback argument" }); } res.json(data); p.remove(); }); }); }); const findById = require("./myApp.js").findPersonById; router.get("/find-by-id", function (req, res, next) { let t = setTimeout(() => { next({ message: "timeout" }); }, TIMEOUT); let p = new Person({ name: "test", age: 0, favoriteFoods: ["none"] }); p.save(function (err, pers) { if (err) { return next(err); } findById(pers._id, function (err, data) { clearTimeout(t); if (err) { return next(err); } if (!data) { console.log("Missing `done()` argument"); return next({ message: "Missing callback argument" }); } res.json(data); p.remove(); }); }); }); const findEdit = require("./myApp.js").findEditThenSave; router.post("/find-edit-save", function (req, res, next) { let t = setTimeout(() => { next({ message: "timeout" }); }, TIMEOUT); let p = new Person(req.body); p.save(function (err, pers) { if (err) { return next(err); } try { findEdit(pers._id, function (err, data) { clearTimeout(t); if (err) { return next(err); } if (!data) { console.log("Missing `done()` argument"); return next({ message: "Missing callback argument" }); } res.json(data); p.remove(); }); } catch (e) { console.log(e); return next(e); } }); }); const update = require("./myApp.js").findAndUpdate; router.post("/find-one-update", function (req, res, next) { let t = setTimeout(() => { next({ message: "timeout" }); }, TIMEOUT); let p = new Person(req.body); p.save(function (err, pers) { if (err) { return next(err); } try { update(pers.name, function (err, data) { clearTimeout(t); if (err) { return next(err); } if (!data) { console.log("Missing `done()` argument"); return next({ message: "Missing callback argument" }); } res.json(data); p.remove(); }); } catch (e) { console.log(e); return next(e); } }); }); const removeOne = require("./myApp.js").removeById; router.post("/remove-one-person", function (req, res, next) { Person.remove({}, function (err) { if (err) { return next(err); } let t = setTimeout(() => { next({ message: "timeout" }); }, TIMEOUT); let p = new Person(req.body); p.save(function (err, pers) { if (err) { return next(err); } try { removeOne(pers._id, function (err, data) { clearTimeout(t); if (err) { return next(err); } if (!data) { console.log("Missing `done()` argument"); return next({ message: "Missing callback argument" }); } console.log(data); Person.count(function (err, cnt) { if (err) { return next(err); } data = data.toObject(); data.count = cnt; console.log(data); res.json(data); }); }); } catch (e) { console.log(e); return next(e); } }); }); }); const removeMany = require("./myApp.js").removeManyPeople; router.post("/remove-many-people", function (req, res, next) { Person.remove({}, function (err) { if (err) { return next(err); } let t = setTimeout(() => { next({ message: "timeout" }); }, TIMEOUT); Person.create(req.body, function (err, pers) { if (err) { return next(err); } try { removeMany(function (err, data) { clearTimeout(t); if (err) { return next(err); } if (!data) { console.log("Missing `done()` argument"); return next({ message: "Missing callback argument" }); } Person.count(function (err, cnt) { if (err) { return next(err); } if (data.ok === undefined) { // for mongoose v4 try { data = JSON.parse(data); } catch (e) { console.log(e); return next(e); } } res.json({ n: data.n, count: cnt, ok: data.ok, }); }); }); } catch (e) { console.log(e); return next(e); } }); }); }); const chain = require("./myApp.js").queryChain; router.post("/query-tools", function (req, res, next) { let t = setTimeout(() => { next({ message: "timeout" }); }, TIMEOUT); Person.remove({}, function (err) { if (err) { return next(err); } Person.create(req.body, function (err, pers) { if (err) { return next(err); } try { chain(function (err, data) { clearTimeout(t); if (err) { return next(err); } if (!data) { console.log("Missing `done()` argument"); return next({ message: "Missing callback argument" }); } res.json(data); }); } catch (e) { console.log(e); return next(e); } }); }); }); app.use("/_api", enableCORS, router); // Error handler app.use(function (err, req, res, next) { if (err) { res .status(err.status || 500) .type("txt") .send(err.message || "SERVER ERROR"); } }); // Unmatched routes handler app.use(function (req, res) { if (req.method.toLowerCase() === "options") { res.end(); } else { res.status(404).type("txt").send("Not Found"); } }); const listener = app.listen(process.env.PORT || 3000, function () { console.log("Your app is listening on port " + listener.address().port); }); /******************************************** * DO NOT EDIT THIS FILE * the verification process may break *******************************************/