diff --git a/data.json b/data.json new file mode 100644 index 0000000..41b42e6 --- /dev/null +++ b/data.json @@ -0,0 +1,3 @@ +[ + +] diff --git a/gambling.js b/gambling.js index c442bcd..cccde04 100644 --- a/gambling.js +++ b/gambling.js @@ -2,15 +2,17 @@ const express = require("express"); const app = express(); const swaggerUi = require("swagger-ui-express"); const swaggerDocument = require("./swagger.json"); - const path = require("path"); +app.use(express.static(path.join(__dirname, "public"))); const fs = require("fs"); const dotenv = require("dotenv").config(); const jwt = require("jsonwebtoken"); +const cookieParser = require("cookie-parser"); const port = 3000; app.use(express.json()); app.use("/swagger-ui", swaggerUi.serve, swaggerUi.setup(swaggerDocument)); +app.use(cookieParser()); function get_data() { const dataPath = path.join(__dirname, "data.json"); @@ -39,9 +41,9 @@ function authenticateToken(request, response, next) { /* #swagger.security = [{ "bearerAuth": [] }] */ - const authHeader = request.headers.authorization; - console.log(authHeader); - const token = authHeader && authHeader.split(" ")[1]; + const token = + request.headers.authorization?.split(" ")[1] || + request.cookies.authorization; if (token == null) return response.sendStatus(401); @@ -69,12 +71,16 @@ app.post("/register", (request, response) => { return response.status(400).json({ error: "Username already exists" }); } + const token = generateAccessToken({ username }); - saveUser({ username, password, token }); + saveUser({ username, password, token, "money": 200 }); response.json({ username, token }); }); +app.get("/login", (request, response) => { + response.sendFile(path.join(__dirname, ".\\public\\login.html")); +}) app.post("/login", (request, response) => { const { username, password } = request.body; if (!username && !password) @@ -102,6 +108,22 @@ app.get("/", authenticateToken, (request, response) => { response.sendFile(path.join(__dirname, "structure.png")); }); +app.post("/balance", authenticateToken, (request, response) => { + /* #swagger.security = [{ + "bearerAuth": [] + }] */ + const username = request.user.username; + + const allUsers = get_data(); + const me = allUsers.find(u => u.username === username); + + if (!me) { + return response.status(404).json({ error: "User not found" }); + } + + response.json({ balance: me.money }); +}); + app.post("/verify", authenticateToken, (request, response) => { response.json({ valid: true, user: request.user }); }); diff --git a/package.json b/package.json index d805e5f..4d40208 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ }, "private": true, "dependencies": { + "cookie-parser": "^1.4.7", "dotenv": "^16.5.0", "express": "^5.1.0", "jsonwebtoken": "^9.0.2", diff --git a/public/frontend.js b/public/frontend.js new file mode 100644 index 0000000..1dfdad5 --- /dev/null +++ b/public/frontend.js @@ -0,0 +1,45 @@ +const TokenHeader = new Headers(); +document.addEventListener("DOMContentLoaded", () => { + const form = document.querySelector("form"); + + form.addEventListener("submit", async (e) => { + e.preventDefault(); + + const username = form.username.value; + const password = form.password.value; + const credentials = {username, password}; + + try { + const loginRes = await fetch("/login", { + method: "POST", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify(credentials), + }); + + if (loginRes.ok) { + const loginData = await loginRes.json(); + alert(`Welcome back, ${loginData.username}!`); + document.cookie = `authorization=${loginData.token}` + return; + } + + const registerRes = await fetch("/register", { + method: "POST", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify(credentials), + }); + + if (registerRes.ok) { + const registerData = await registerRes.json(); + alert(`Account created! Welcome, ${registerData.username}`); + document.cookie = `authorization=${registerData.token}` + } else { + const error = await registerRes.json(); + alert("Register failed: " + (error.error || "Unknown error")); + } + } catch (err) { + console.error("Network error:", err); + alert("Server unreachable."); + } + }); +}); \ No newline at end of file diff --git a/public/login.html b/public/login.html new file mode 100644 index 0000000..704cd86 --- /dev/null +++ b/public/login.html @@ -0,0 +1,16 @@ + + +
+ +