fix: Add a build system for the backend
This commit is contained in:
parent
8061535936
commit
db4b46b5aa
6
Makefile
6
Makefile
@ -2,11 +2,5 @@
|
|||||||
frontend:
|
frontend:
|
||||||
$(MAKE) -C frontend/ build
|
$(MAKE) -C frontend/ build
|
||||||
|
|
||||||
fwatch:
|
|
||||||
$(MAKE) -C frontend/ watch
|
|
||||||
|
|
||||||
backend:
|
backend:
|
||||||
$(MAKE) -C backend/ build
|
$(MAKE) -C backend/ build
|
||||||
|
|
||||||
bstart:
|
|
||||||
$(MAKE) -C backend/ start
|
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
node_modules:
|
node_modules:
|
||||||
npm install
|
npm install
|
||||||
|
|
||||||
.PHONY: build
|
WEBPACK_BUILD := ./node_modules/.bin/webpack-cli --config webpack.config.js
|
||||||
build:
|
|
||||||
npm run-script build
|
.PHONY: prod
|
||||||
|
prod:
|
||||||
|
${WEBPACK_BUILD} --env.NODE_ENV=production
|
||||||
|
|
||||||
|
.PHONY: dev
|
||||||
|
dev:
|
||||||
|
${WEBPACK_BUILD} --env.NODE_ENV=development
|
||||||
|
|
||||||
.PHONY: start
|
.PHONY: start
|
||||||
start:
|
start: dev
|
||||||
node dist/main.js
|
node dist/backend/src/main.js
|
||||||
|
4634
backend/package-lock.json
generated
Normal file
4634
backend/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -24,6 +24,9 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/express": "4.16.0",
|
"@types/express": "4.16.0",
|
||||||
"typescript": "3.0.3"
|
"ts-loader": "^5.1.1",
|
||||||
|
"typescript": "3.0.3",
|
||||||
|
"webpack": "^4.19.1",
|
||||||
|
"webpack-cli": "^3.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,9 +9,8 @@ const authRouter = express.Router();
|
|||||||
|
|
||||||
authRouter.use(bodyparser.json());
|
authRouter.use(bodyparser.json());
|
||||||
authRouter.use(async (req, res, next) => {
|
authRouter.use(async (req, res, next) => {
|
||||||
if ("token" in req.body || req.get("token")) {
|
const token = req.get("Token");
|
||||||
const token = req.body.token || req.get("token");
|
if (token) {
|
||||||
|
|
||||||
// Check if were authenticated
|
// Check if were authenticated
|
||||||
const auth = await isAuthenticated(token);
|
const auth = await isAuthenticated(token);
|
||||||
if (auth)
|
if (auth)
|
||||||
@ -57,6 +56,9 @@ authRouter.get("/class/:id/topTen", async (req, res) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
authRouter.get("/level/:id/vocab", async (req, res) => {
|
authRouter.get("/level/:id/vocab", async (req, res) => {
|
||||||
|
// TODO: Implement
|
||||||
|
console.log("Stub: /auth/level/:id/vocab");
|
||||||
|
|
||||||
if (!req.params) {
|
if (!req.params) {
|
||||||
res.send({
|
res.send({
|
||||||
error: "400",
|
error: "400",
|
||||||
@ -67,8 +69,6 @@ authRouter.get("/level/:id/vocab", async (req, res) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("Stub: /auth/level/:id/vocab");
|
|
||||||
// TODO: Implement
|
|
||||||
res.send({
|
res.send({
|
||||||
error: "0",
|
error: "0",
|
||||||
data: {
|
data: {
|
||||||
@ -94,13 +94,7 @@ app.use((req, res, next) => {
|
|||||||
// TODO: Change this to our domain
|
// TODO: Change this to our domain
|
||||||
res.append("Access-Control-Allow-Origin", "*");
|
res.append("Access-Control-Allow-Origin", "*");
|
||||||
res.append("Access-Control-Allow-Headers", "Content-Type,Token");
|
res.append("Access-Control-Allow-Headers", "Content-Type,Token");
|
||||||
|
|
||||||
if (res.method === "OPTIONS") {
|
|
||||||
// TODO: Send 200
|
|
||||||
res.end();
|
|
||||||
} else {
|
|
||||||
next();
|
next();
|
||||||
}
|
|
||||||
});
|
});
|
||||||
app.use("/auth", authRouter);
|
app.use("/auth", authRouter);
|
||||||
app.get("/health", (req, res) => {
|
app.get("/health", (req, res) => {
|
||||||
@ -117,7 +111,7 @@ app.post("/login", async (req, res) => {
|
|||||||
console.log("Stub: /login");
|
console.log("Stub: /login");
|
||||||
|
|
||||||
// Check if all arguments were sent
|
// Check if all arguments were sent
|
||||||
if (!body || !body.hasOwnProperty("username") || !body.hasOwnProperty("hash")) {
|
if (!body || !("username" in body) || !("password" in body)) {
|
||||||
res.send({
|
res.send({
|
||||||
error: "400",
|
error: "400",
|
||||||
data: {
|
data: {
|
||||||
@ -129,8 +123,10 @@ app.post("/login", async (req, res) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Try to log the user in
|
// Try to log the user in
|
||||||
const userData = await performLogin(body.username, body.hash)
|
const userData = await performLogin(body.username, body.password)
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
|
console.log("Could not resolve login promise!", err);
|
||||||
|
|
||||||
// If anything was wrong, just tell the client
|
// If anything was wrong, just tell the client
|
||||||
res.send({
|
res.send({
|
||||||
error: "1",
|
error: "1",
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
import { pbkdf2Sync } from "crypto";
|
import { pbkdf2Sync } from "crypto";
|
||||||
|
|
||||||
|
import { IUser } from "shared/user";
|
||||||
|
|
||||||
export function isAuthenticated(token: string): Promise<boolean> {
|
export function isAuthenticated(token: string): Promise<boolean> {
|
||||||
return new Promise((res, rej) => {
|
return new Promise((res, rej) => {
|
||||||
// TODO
|
// TODO
|
||||||
@ -7,7 +9,7 @@ export function isAuthenticated(token: string): Promise<boolean> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function performLogin(username: string, password: string): Promise<any | {}> {
|
export function performLogin(username: string, password: string): Promise<IUser | {}> {
|
||||||
return new Promise((res, rej) => {
|
return new Promise((res, rej) => {
|
||||||
// Hash the password
|
// Hash the password
|
||||||
// TODO: Fetch the salt
|
// TODO: Fetch the salt
|
||||||
@ -18,8 +20,9 @@ export function performLogin(username: string, password: string): Promise<any |
|
|||||||
res({
|
res({
|
||||||
username: "Polynom",
|
username: "Polynom",
|
||||||
uid: "1",
|
uid: "1",
|
||||||
showWelcome: false,
|
showWelcome: true,
|
||||||
classId: "test",
|
classId: "test",
|
||||||
|
score: 4,
|
||||||
|
|
||||||
sessionToken: "abc123",
|
sessionToken: "abc123",
|
||||||
});
|
});
|
||||||
|
@ -8,6 +8,10 @@
|
|||||||
|
|
||||||
"outDir": "./dist/",
|
"outDir": "./dist/",
|
||||||
|
|
||||||
"baseUrl": "./src/"
|
"baseUrl": "./src/",
|
||||||
|
|
||||||
|
"paths": {
|
||||||
|
"shared/*": ["../../shared/*"]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
32
backend/webpack.config.js
Normal file
32
backend/webpack.config.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
module.exports = env => {
|
||||||
|
const production = env.NODE_ENV || "production";
|
||||||
|
|
||||||
|
return {
|
||||||
|
entry: "./src/main.ts",
|
||||||
|
devtool: production ? "source-map": "inline-source-map",
|
||||||
|
target: "node",
|
||||||
|
mode: env.NODE_ENV,
|
||||||
|
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.ts$/,
|
||||||
|
use: "ts-loader",
|
||||||
|
exclude: /node_modules/
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
resolve: {
|
||||||
|
extensions: [".ts", ".js"],
|
||||||
|
alias: {
|
||||||
|
shared: path.join(__dirname, "../shared/")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
filename: "bundle.js",
|
||||||
|
path: path.resolve(__dirname, "dist")
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
51
shared/user.ts
Normal file
51
shared/user.ts
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
export interface IUser {
|
||||||
|
username: string;
|
||||||
|
uid: string;
|
||||||
|
showWelcome: boolean;
|
||||||
|
score: number;
|
||||||
|
|
||||||
|
sessionToken: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export interface IUserLevel {
|
||||||
|
// The numerical representation
|
||||||
|
level: number;
|
||||||
|
// The string representation
|
||||||
|
name: string;
|
||||||
|
// The user has this level until: score => levelCap
|
||||||
|
levelCap: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
function levelFactory(): (name: string, levelCap: number) => IUserLevel {
|
||||||
|
let level = 1;
|
||||||
|
return (name: string, levelCap: number) => {
|
||||||
|
return {
|
||||||
|
level: level++,
|
||||||
|
name,
|
||||||
|
levelCap,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const l = levelFactory();
|
||||||
|
|
||||||
|
export const UserLevels: IUserLevel[] = [
|
||||||
|
l("Sklave", 35),
|
||||||
|
l("Farmer", 75),
|
||||||
|
l("Soldat", 120),
|
||||||
|
l("Gladiator", 170),
|
||||||
|
l("Zenturio", 220),
|
||||||
|
l("Prätor", 270),
|
||||||
|
l("Reiter", 320),
|
||||||
|
l("General", 370),
|
||||||
|
l("Konsul", 420),
|
||||||
|
l("Caesar", 470),
|
||||||
|
];
|
||||||
|
|
||||||
|
export function userScoreToLevel(userScore: number): IUserLevel {
|
||||||
|
// NOTE: The failure level should never be returned
|
||||||
|
return UserLevels.find((el) => userScore < el.levelCap) || {
|
||||||
|
level: 0,
|
||||||
|
name: "Failure",
|
||||||
|
levelCap: 10000000,
|
||||||
|
};
|
||||||
|
}
|
Reference in New Issue
Block a user