Browse Source

feat: add mocked redirect routes

main
Garrit Franke 3 years ago
parent
commit
23d5f565db
Signed by: garrit
GPG Key ID: 65586C4DDA55EA2C
  1. 69
      server/app.js
  2. 50
      server/package-lock.json
  3. 1
      server/package.json
  4. 47
      server/routes/redirects.js
  5. 52
      server/routes/users.js

69
server/app.js

@ -3,10 +3,11 @@ const jwt = require("jsonwebtoken");
const bodyParser = require("body-parser");
const { Model } = require("objection");
const knexConfig = require("./knexfile");
const User = require("./model/User");
require("dotenv").config();
const knex = require('knex')(knexConfig);
const knex = require("knex")(knexConfig);
Model.knex(knex);
@ -20,47 +21,49 @@ app.use(require("express-form-data").parse());
app.use(require("cors")());
app.use((req, res, next) => {
req.body = { ...req.body, ...req.query };
next();
req.body = { ...req.body, ...req.query };
next();
});
// Logging Middleware
app.use((req, res, next) => {
console.log(new Date().toUTCString(), req.method, req.path);
next();
console.log(new Date().toUTCString(), req.method, req.path);
next();
});
// Authorization middleware
app.use((req, res, next) => {
if (req.path === "/auth/register" || req.path === "/auth/login")
return next();
const authHeader = req.header("Authorization");
let token = authHeader?.replace("Bearer ", "");
// Try to get token if request is from frontend
if (!token) {
token = req.cookies?.token;
}
// Try to get token from body
if (!token) {
token = req.body.token;
}
if (!token) return res.status(401).send("Invalid token");
try {
const verified = jwt.verify(token, process.env.AUTH_SECRET);
req.userId = verified._id;
next();
} catch (err) {
res.status(401).json(err);
}
app.use(async (req, res, next) => {
if (req.path === "/auth/register" || req.path === "/auth/login")
return next();
const authHeader = req.header("Authorization");
let token = authHeader?.replace("Bearer ", "");
// Try to get token if request is from frontend
if (!token) {
token = req.cookies?.token;
}
// Try to get token from body
if (!token) {
token = req.body.token;
}
if (!token) return res.status(401).send("Invalid token");
try {
const verified = jwt.verify(token, process.env.AUTH_SECRET);
req.userId = verified._id;
const user = await User.query().findById(req.userId);
req.user = user;
next();
} catch (err) {
res.status(401).json(err);
}
});
app.use("/auth", require("./routes/auth"));
app.use("/users", require("./routes/users"));
app.use("/redirects", require("./routes/redirects"));
app.listen(8080, () => console.log("Listening on 8080"));

50
server/package-lock.json generated

@ -6,6 +6,7 @@
"": {
"license": "ISC",
"dependencies": {
"@supercharge/strings": "^1.22.0",
"@types/node": "^14.11.8",
"bcryptjs": "^2.4.3",
"body-parser": "^1.19.0",
@ -32,6 +33,14 @@
"node": ">=6"
}
},
"node_modules/@supercharge/strings": {
"version": "1.22.0",
"resolved": "https://registry.npmjs.org/@supercharge/strings/-/strings-1.22.0.tgz",
"integrity": "sha512-3htlJ/WbD0+tP7l1oWSkQjFajr6CP22JBvgawAulUXakIw51vHbtW6AauFxDtPcyEhx3z8gomkLjz2waA/061w==",
"dependencies": {
"uuid": "~8.3.2"
}
},
"node_modules/@szmarczak/http-timer": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
@ -3651,6 +3660,16 @@
"node": ">=0.6"
}
},
"node_modules/request/node_modules/uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
"optional": true,
"bin": {
"uuid": "bin/uuid"
}
},
"node_modules/resolve": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
@ -4641,13 +4660,11 @@
}
},
"node_modules/uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
"optional": true,
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"bin": {
"uuid": "bin/uuid"
"uuid": "dist/bin/uuid"
}
},
"node_modules/v8flags": {
@ -4784,6 +4801,14 @@
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
"dev": true
},
"@supercharge/strings": {
"version": "1.22.0",
"resolved": "https://registry.npmjs.org/@supercharge/strings/-/strings-1.22.0.tgz",
"integrity": "sha512-3htlJ/WbD0+tP7l1oWSkQjFajr6CP22JBvgawAulUXakIw51vHbtW6AauFxDtPcyEhx3z8gomkLjz2waA/061w==",
"requires": {
"uuid": "~8.3.2"
}
},
"@szmarczak/http-timer": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
@ -7641,6 +7666,12 @@
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
"optional": true
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"optional": true
}
}
},
@ -8431,10 +8462,9 @@
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"optional": true
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
},
"v8flags": {
"version": "3.2.0",

1
server/package.json

@ -7,6 +7,7 @@
"author": "",
"license": "ISC",
"dependencies": {
"@supercharge/strings": "^1.22.0",
"@types/node": "^14.11.8",
"bcryptjs": "^2.4.3",
"body-parser": "^1.19.0",

47
server/routes/redirects.js

@ -0,0 +1,47 @@
const router = require("express").Router();
const Str = require('@supercharge/strings')
router.get("/", async (req, res) => {
const redirects = [
{
id: 53,
alias: "edge_ribbon_strongman@proxymail.com",
forwardTo: "foo@bar.com",
},
{
id: 54,
alias: "mustard_roping_t_shirt@proxymail.com",
forwardTo: "foo@bar.com",
},
];
return res.json(redirects);
});
router.post("/", async (req, res) => {
console.log("Creating redirect for user req.user");
const { forwardTo } = req.body;
if (!forwardTo) {
return res.status(400).send("field 'forwardTo' was not provided");
}
const alias = `${Str.random(20)}@proxymail.com`;
const response = {
id: Math.floor((Math.random() * 100) + 1),
alias,
forwardTo,
};
res.json(response);
});
router.delete("/:id", async (req, res) => {
const id = req.params.id;
res.send({
status: "Success",
id,
});
});
module.exports = router;

52
server/routes/users.js

@ -1,52 +0,0 @@
const router = require("express").Router();
const User = require("../model/User");
router.get("/", async (req, res) => {
const user = await User.find();
res.json(user);
});
router.post("/", async (req, res) => {
console.log("POSTing user");
const { email, username } = req.body;
// Don't accept duplicate emails
if (await User.query().findWhere("email", email).count() > 0) {
res.status(400).send("Email already taken");
return;
}
const user = await User.insert({
username,
email,
});
res.json(user);
});
router.get("/:idOrName", async (req, res) => {
const idOrName = req.params.idOrName;
const userById = await User.query().findById(idOrName);
if (userById) {
res.send(userById);
} else {
const userById = await User.query().findOne("username", idOrName);
if (!userById) return res.status(404).send("User not found");
const { id, username } = userById;
res.send({
id,
username
});
}
});
router.delete("/:id", async (req, res) => {
const id = req.params.id;
const result = await User.deleteOne({ _id: id });
res.send(result);
});
module.exports = router;
Loading…
Cancel
Save