Stage 1: Restructuring the Express Backend
This commit is contained in:
parent
2c51e6c5f9
commit
063f1e1993
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,5 +1,6 @@
|
||||
# credentials
|
||||
.env
|
||||
config.json
|
||||
|
||||
# compiled output
|
||||
/dist
|
||||
|
||||
@ -1,13 +1,14 @@
|
||||
const express = require('express')
|
||||
const moment = require('moment')
|
||||
const _ = require('lodash')
|
||||
const db = require('./mysql')
|
||||
const score = require('./score')
|
||||
const transformer = require('./transformer')
|
||||
const climate = require('./climate')
|
||||
const base = require('./base64')
|
||||
const db = require('./models/mysql')
|
||||
const score = require('./models/score')
|
||||
const transformer = require('./models/transformer')
|
||||
const climate = require('./models/climate')
|
||||
const base = require('./models/base64')
|
||||
|
||||
const app = express()
|
||||
|
||||
const port = 3000
|
||||
//const multiplier_temp = 5
|
||||
const multiplier = {
|
||||
|
||||
10
backend/config.json.sample
Normal file
10
backend/config.json.sample
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"port":,
|
||||
"dbCredentials":{
|
||||
"host": "",
|
||||
"port": ,
|
||||
"user": "",
|
||||
"password": "",
|
||||
"database": ""
|
||||
}
|
||||
}
|
||||
51
backend/index.js
Normal file
51
backend/index.js
Normal file
@ -0,0 +1,51 @@
|
||||
const express = require("express");
|
||||
const bodyParser = require("body-parser");
|
||||
const path = require("path");
|
||||
const morgan = require("morgan");
|
||||
const dbConnection = require("./models/dbConnection");
|
||||
const fs = require("fs");
|
||||
const httpolyglot = require("httpolyglot");
|
||||
|
||||
// credentials
|
||||
const config = require("./config.json");
|
||||
const port = config.port;
|
||||
|
||||
// Router
|
||||
const search = require("./routes/search");
|
||||
const regions = require("./routes/regions");
|
||||
|
||||
const app = express();
|
||||
|
||||
(async () => {
|
||||
try {
|
||||
// console.log(process.env);
|
||||
const dbConn = await dbConnection(config);
|
||||
|
||||
// Express middleware
|
||||
app.use(morgan("dev"));
|
||||
app.use(express.static(path.join(__dirname, "../../dist")));
|
||||
app.use(bodyParser.json());
|
||||
|
||||
// Express routes
|
||||
app.use(search(dbConn));
|
||||
app.use(regions(dbConn));
|
||||
|
||||
app.use((err, req, res, next) => {
|
||||
// 500
|
||||
if (true) {
|
||||
next();
|
||||
} else {
|
||||
res.status(500).send();
|
||||
}
|
||||
});
|
||||
|
||||
// Start webserver
|
||||
app.listen(port, () => {
|
||||
console.log(`Travopti backend listening at http://localhost:${port}`)
|
||||
});
|
||||
} catch (error) {
|
||||
// TODO: logging
|
||||
console.error("Failed to start the webserver");
|
||||
console.error(error);
|
||||
}
|
||||
})();
|
||||
43
backend/models/dbConnection.js
Normal file
43
backend/models/dbConnection.js
Normal file
@ -0,0 +1,43 @@
|
||||
const mariadb = require("mariadb");
|
||||
let dbConn;
|
||||
let conPool;
|
||||
// mariadb doc: https://github.com/MariaDB/mariadb-connector-nodejs/blob/master/documentation/promise-api.md
|
||||
|
||||
async function reconnect() {
|
||||
try {
|
||||
dbConn = await conPool.getConnection();
|
||||
} catch (e) {
|
||||
if (e.code === "ECONNREFUSED") {
|
||||
let err = new Error("Lost connection to the database");
|
||||
err.code = "ERR_DB_CONN_LOST";
|
||||
throw err;
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = async config => {
|
||||
conPool = mariadb.createPool({
|
||||
...config.dbCredentials,
|
||||
connectionLimit: 10
|
||||
});
|
||||
|
||||
dbConn = await conPool.getConnection();
|
||||
return {
|
||||
async query(q, p) {
|
||||
let res;
|
||||
try {
|
||||
res = await dbConn.query(q, p);
|
||||
} catch (e) {
|
||||
if (e.code === "ER_CMD_CONNECTION_CLOSED") {
|
||||
await reconnect();
|
||||
await this.query(q, p);
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
};
|
||||
};
|
||||
0
backend/models/getRegions.js
Normal file
0
backend/models/getRegions.js
Normal file
0
backend/models/getSearchPresets.js
Normal file
0
backend/models/getSearchPresets.js
Normal file
0
backend/models/getSearchResults.js
Normal file
0
backend/models/getSearchResults.js
Normal file
109
backend/package-lock.json
generated
109
backend/package-lock.json
generated
@ -25,6 +25,16 @@
|
||||
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/geojson": {
|
||||
"version": "7946.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz",
|
||||
"integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ=="
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "13.13.12",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.12.tgz",
|
||||
"integrity": "sha512-zWz/8NEPxoXNT9YyF2osqyA9WjssZukYpgI4UYZpOjcyqwIUqWGkcCionaEb9Ki+FULyPyvNFpg/329Kd2/pbw=="
|
||||
},
|
||||
"abbrev": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
|
||||
@ -112,6 +122,14 @@
|
||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
|
||||
"dev": true
|
||||
},
|
||||
"basic-auth": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
|
||||
"integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
|
||||
"requires": {
|
||||
"safe-buffer": "5.1.2"
|
||||
}
|
||||
},
|
||||
"binary-extensions": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
|
||||
@ -842,6 +860,30 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"mariadb": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/mariadb/-/mariadb-2.4.0.tgz",
|
||||
"integrity": "sha512-78zrj9SpF6I3eVWMMkdm+SEfcsMb/uWVKPo7pKhhCfuGywEf3I1dK0ewSTjD0SyTEgSEuWn/H/I4TIErGgYTCQ==",
|
||||
"requires": {
|
||||
"@types/geojson": "^7946.0.7",
|
||||
"@types/node": "^13.9.8",
|
||||
"denque": "^1.4.1",
|
||||
"iconv-lite": "^0.5.1",
|
||||
"long": "^4.0.0",
|
||||
"moment-timezone": "^0.5.31",
|
||||
"please-upgrade-node": "^3.2.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"iconv-lite": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz",
|
||||
"integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==",
|
||||
"requires": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
@ -901,6 +943,33 @@
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz",
|
||||
"integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw=="
|
||||
},
|
||||
"moment-timezone": {
|
||||
"version": "0.5.31",
|
||||
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz",
|
||||
"integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==",
|
||||
"requires": {
|
||||
"moment": ">= 2.9.0"
|
||||
}
|
||||
},
|
||||
"morgan": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
|
||||
"integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
|
||||
"requires": {
|
||||
"basic-auth": "~2.0.1",
|
||||
"debug": "2.6.9",
|
||||
"depd": "~2.0.0",
|
||||
"on-finished": "~2.3.0",
|
||||
"on-headers": "~1.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"depd": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
||||
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
@ -1025,6 +1094,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=="
|
||||
},
|
||||
"once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
@ -1065,6 +1139,15 @@
|
||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
|
||||
},
|
||||
"path": {
|
||||
"version": "0.12.7",
|
||||
"resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
|
||||
"integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
|
||||
"requires": {
|
||||
"process": "^0.11.1",
|
||||
"util": "^0.10.3"
|
||||
}
|
||||
},
|
||||
"path-to-regexp": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||
@ -1076,12 +1159,25 @@
|
||||
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
|
||||
"dev": true
|
||||
},
|
||||
"please-upgrade-node": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
|
||||
"integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
|
||||
"requires": {
|
||||
"semver-compare": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"prepend-http": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
|
||||
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
|
||||
"dev": true
|
||||
},
|
||||
"process": {
|
||||
"version": "0.11.10",
|
||||
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
|
||||
"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
|
||||
},
|
||||
"proxy-addr": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
|
||||
@ -1214,6 +1310,11 @@
|
||||
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
|
||||
"dev": true
|
||||
},
|
||||
"semver-compare": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
|
||||
"integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w="
|
||||
},
|
||||
"semver-diff": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
|
||||
@ -1471,6 +1572,14 @@
|
||||
"prepend-http": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"util": {
|
||||
"version": "0.10.4",
|
||||
"resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
|
||||
"integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
|
||||
"requires": {
|
||||
"inherits": "2.0.3"
|
||||
}
|
||||
},
|
||||
"utils-merge": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
||||
|
||||
@ -4,17 +4,21 @@
|
||||
"description": "",
|
||||
"main": "app.js",
|
||||
"scripts": {
|
||||
"start": "nodemon ./app.js"
|
||||
"start": "nodemon ./index.js"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"axios": "^0.19.2",
|
||||
"body-parser": "^1.19.0",
|
||||
"dotenv": "^8.2.0",
|
||||
"express": "^4.17.1",
|
||||
"lodash": "^4.17.15",
|
||||
"mariadb": "^2.4.0",
|
||||
"moment": "^2.26.0",
|
||||
"mysql2": "^2.1.0"
|
||||
"morgan": "^1.10.0",
|
||||
"mysql2": "^2.1.0",
|
||||
"path": "^0.12.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^2.0.4"
|
||||
|
||||
15
backend/routes/regions.js
Normal file
15
backend/routes/regions.js
Normal file
@ -0,0 +1,15 @@
|
||||
const router = require("express").Router();
|
||||
const getRegions = require("../models/getRegions.js");
|
||||
|
||||
module.exports = dbConn => {
|
||||
router.get("/api/v1/search", async (req, res) => {
|
||||
const query = req.query.q;
|
||||
if (query != undefined) {
|
||||
res.json(await getRegions(dbConn, query));
|
||||
} else {
|
||||
res.status(400).send();
|
||||
}
|
||||
});
|
||||
|
||||
return router;
|
||||
};
|
||||
25
backend/routes/search.js
Normal file
25
backend/routes/search.js
Normal file
@ -0,0 +1,25 @@
|
||||
const router = require("express").Router();
|
||||
const getSearchResults = require("../models/getSearchResults.js");
|
||||
const getSearchPresets = require("../models/getSearchPresets.js");
|
||||
|
||||
module.exports = dbConn => {
|
||||
router.get("/api/v1/search", async (req, res) => {
|
||||
const query = req.query.q;
|
||||
if (query != undefined) {
|
||||
res.json(await getSearchResults(dbConn, query));
|
||||
} else {
|
||||
res.status(400).send();
|
||||
}
|
||||
});
|
||||
|
||||
router.get("/api/v1/search/presets", async (req, res) => {
|
||||
const query = req.query.q;
|
||||
if (query != undefined) {
|
||||
res.json(await getSearchPresets(dbConn, query));
|
||||
} else {
|
||||
res.status(400).send();
|
||||
}
|
||||
});
|
||||
|
||||
return router;
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
11
package-lock.json
generated
Normal file
11
package-lock.json
generated
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"requires": true,
|
||||
"lockfileVersion": 1,
|
||||
"dependencies": {
|
||||
"httpolyglot": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/httpolyglot/-/httpolyglot-0.1.2.tgz",
|
||||
"integrity": "sha1-5NNH/omEpi9GfUBg31J/GFH2mXs="
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user