Added verifyToken, themes and set routes
This commit is contained in:
@@ -10,6 +10,4 @@ To run:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
bun run index.js
|
bun run index.js
|
||||||
```
|
```
|
||||||
|
|
||||||
This project was created using `bun init` in bun v1.0.13. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.
|
|
||||||
@@ -10,6 +10,8 @@ import { speedLimiter, checkSystemLoad } from './modules/requestHandler.js';
|
|||||||
import testRouter from './routes/test.js';
|
import testRouter from './routes/test.js';
|
||||||
import usersRouter from './routes/users.js';
|
import usersRouter from './routes/users.js';
|
||||||
import leaderboardRouter from './routes/leaderboard.js';
|
import leaderboardRouter from './routes/leaderboard.js';
|
||||||
|
import themeRouter from './routes/themes.js';
|
||||||
|
import gameRouter from './routes/games.js';
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
app.set('trust proxy', 1);
|
app.set('trust proxy', 1);
|
||||||
@@ -29,6 +31,8 @@ app.use(express.static('public'));
|
|||||||
app.use('/api/test', testRouter);
|
app.use('/api/test', testRouter);
|
||||||
app.use('/api/users', usersRouter);
|
app.use('/api/users', usersRouter);
|
||||||
app.use('/api/leaderboard', leaderboardRouter);
|
app.use('/api/leaderboard', leaderboardRouter);
|
||||||
|
app.use('/api/themes', themeRouter);
|
||||||
|
app.use('/api/games', gameRouter);
|
||||||
|
|
||||||
// run the API
|
// run the API
|
||||||
app.listen(process.env.PORT, async () => {
|
app.listen(process.env.PORT, async () => {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { pool } from '../modules/database.js';
|
|||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
// send list of themes
|
// send list of themes
|
||||||
router.post('/', verifyToken, async (req, res) => {
|
router.get('/', verifyToken, async (req, res) => {
|
||||||
const [rows] = await pool.execute('SELECT * FROM themes');
|
const [rows] = await pool.execute('SELECT * FROM themes');
|
||||||
if (!rows.length) return await respondWithStatus(res, 404, 'There are no themes');
|
if (!rows.length) return await respondWithStatus(res, 404, 'There are no themes');
|
||||||
return await respondWithStatusJSON(res, 200, {
|
return await respondWithStatusJSON(res, 200, {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ router.post('/register', requestLimiter, async (req, res) => {
|
|||||||
if (result.affectedRows === 0) return await respondWithStatus(res, 500, 'Error storing user');
|
if (result.affectedRows === 0) return await respondWithStatus(res, 500, 'Error storing user');
|
||||||
const user = await pool.execute('SELECT * FROM users WHERE username = ? LIMIT 1', [ username ]);
|
const user = await pool.execute('SELECT * FROM users WHERE username = ? LIMIT 1', [ username ]);
|
||||||
const token = await generateToken(user[0].id, password);
|
const token = await generateToken(user[0].id, password);
|
||||||
return await respondWithStatusJSON(res, 200, { message: 'Successfully registered', token, username: req.username });
|
return await respondWithStatusJSON(res, 200, { message: 'Successfully registered', token: token, username: username });
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
@@ -62,4 +62,36 @@ router.post('/login', requestLimiter, async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
router.post('verifyToken', requestLimiter, async (req, res) => {
|
||||||
|
const token = req.headers.authorization;
|
||||||
|
if (!token) return await respondWithStatus(res, 401, 'No token provided');
|
||||||
|
|
||||||
|
try {
|
||||||
|
const decoded = jwt.verify(token, process.env.JWT_SECRET);
|
||||||
|
req.userId = decoded.userId;
|
||||||
|
|
||||||
|
const [rows] = await pool.execute(
|
||||||
|
'SELECT * FROM users WHERE id = ? LIMIT 1', [req.userId],
|
||||||
|
);
|
||||||
|
if (!rows.length) return await respondWithStatus(res, 404, 'User not found!');
|
||||||
|
const passwordMatch = await Bun.password.verify(decoded.password, rows[0].password);
|
||||||
|
if (!passwordMatch) return await respondWithStatus(res, 401, 'Token is invalid');
|
||||||
|
|
||||||
|
const now = Date.now().valueOf() / 1000;
|
||||||
|
if (decoded.exp - now <= 0) {
|
||||||
|
return await respondWithStatus(res, 401, 'Token is invalid');
|
||||||
|
}
|
||||||
|
return await respondWithStatusJSON(res, 200, {
|
||||||
|
message: 'Token is valid',
|
||||||
|
user: {
|
||||||
|
id: rows[0].id,
|
||||||
|
username: rows[0].username,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
return await respondWithStatus(res, 401, 'Invalid user');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
Reference in New Issue
Block a user