175 lines
4.5 KiB
JavaScript
175 lines
4.5 KiB
JavaScript
|
|
||
|
import 'dotenv/config';
|
||
|
import express from 'express';
|
||
|
import cookieSession from 'cookie-session';
|
||
|
import axios from "axios";
|
||
|
import crypto from "crypto";
|
||
|
import mysql from 'mysql2/promise';
|
||
|
import bodyParser from "body-parser";
|
||
|
import { body, validationResult } from 'express-validator';
|
||
|
import busboy from 'busboy';
|
||
|
|
||
|
const app = express();
|
||
|
|
||
|
const port = process.env.PORT || 8302;
|
||
|
app.set('view engine', 'ejs');
|
||
|
app.use('/backlog/', express.static('public'));
|
||
|
app.use(cookieSession(
|
||
|
{
|
||
|
name: "backlog",
|
||
|
keys: [crypto.randomBytes(20).toString("hex")],
|
||
|
}
|
||
|
));
|
||
|
app.use(bodyParser.json())
|
||
|
app.use(bodyParser.urlencoded())
|
||
|
|
||
|
const request = axios.create({});
|
||
|
async function createMySQLClient() {
|
||
|
return mysql.createConnection({
|
||
|
host: process.env.MYSQL_HOST,
|
||
|
user: process.env.MYSQL_USERNAME,
|
||
|
password: process.env.MYSQL_PASSWORD,
|
||
|
database: process.env.MYSQL_DATABASE
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function isAuthenticated (req, res, next) {
|
||
|
if (req.session.bcid === '281G3NV') next()
|
||
|
else next('route')
|
||
|
}
|
||
|
|
||
|
app.get('/', (req, res) => {
|
||
|
res.redirect(`backlog`);
|
||
|
})
|
||
|
|
||
|
app.get('/editor', (req, res) => {
|
||
|
res.redirect(`backlog/editor`);
|
||
|
})
|
||
|
|
||
|
app.get('/backlog/', (req, res) => {
|
||
|
res.render("pages/index.ejs");
|
||
|
})
|
||
|
|
||
|
// async function validateInputs(req, res, next) {
|
||
|
//
|
||
|
//
|
||
|
// next();
|
||
|
// }
|
||
|
|
||
|
app.post('/backlog/editor', isAuthenticated,
|
||
|
body("title", "No title supplied")
|
||
|
.trim().isLength({ min: 1, max: 255 }).escape(),
|
||
|
body("platform", "Platform is required")
|
||
|
.trim().toLowerCase().escape(),
|
||
|
body("publisher")
|
||
|
.optional().trim().isLength({max: 255}).escape(),
|
||
|
body("date")
|
||
|
.optional(),
|
||
|
body("progress")
|
||
|
.isNumeric(),
|
||
|
async (req, res) => {
|
||
|
// console.log('POST request');
|
||
|
// const bb = busboy({ headers: req.headers });
|
||
|
// console.log(bb);
|
||
|
// bb.on('file', (name, file, info) => {
|
||
|
// const { filename, encoding, mimeType } = info;
|
||
|
// console.log(
|
||
|
// `File [${name}]: filename: %j, encoding: %j, mimeType: %j`,
|
||
|
// filename,
|
||
|
// encoding,
|
||
|
// mimeType
|
||
|
// );
|
||
|
// file.on('data', (data) => {
|
||
|
// console.log(`File [${name}] got ${data.length} bytes`);
|
||
|
// }).on('close', () => {
|
||
|
// console.log(`File [${name}] done`);
|
||
|
// });
|
||
|
// });
|
||
|
// bb.on('field', (name, val, info) => {
|
||
|
// console.log(`Field [${name}]: value: %j`, val);
|
||
|
// });
|
||
|
// bb.on('close', () => {
|
||
|
// console.log('Done parsing form!');
|
||
|
// });
|
||
|
// req.pipe(bb);
|
||
|
|
||
|
const errors = validationResult(req);
|
||
|
|
||
|
console.log(errors);
|
||
|
|
||
|
if (!errors.isEmpty()) {
|
||
|
return res.send(errors.array());
|
||
|
}
|
||
|
|
||
|
const date = req.body.date ? req.body.date : null;
|
||
|
|
||
|
try {
|
||
|
const mySqlClient = await createMySQLClient();
|
||
|
const SQL =
|
||
|
"INSERT INTO `games` (`title`, `platform`, `publisher`, `release_date`, `progress`) VALUES (?, ?, ?, ?, ?);";
|
||
|
|
||
|
let f = req.body;
|
||
|
mySqlClient.execute(
|
||
|
SQL,
|
||
|
[f.title, f.platform, f.publisher, date, f.progress],
|
||
|
);
|
||
|
|
||
|
} catch (err) {
|
||
|
console.log(err)
|
||
|
return res.send("Error");
|
||
|
}
|
||
|
|
||
|
// console.log(req.body)
|
||
|
return res.redirect('/backlog/editor');
|
||
|
})
|
||
|
|
||
|
app.get('/backlog/editor', isAuthenticated, (req, res) => {
|
||
|
return res.render("pages/editor.ejs");
|
||
|
})
|
||
|
|
||
|
app.get('/backlog/editor', async (req, res) => {
|
||
|
|
||
|
if (req.query['access_token']) {
|
||
|
let user = await request.get(
|
||
|
"https://id.byecorps.com/api/account/me",
|
||
|
{
|
||
|
headers: {
|
||
|
"Authorization": `Bearer ${req.query['access_token']}`
|
||
|
}
|
||
|
}
|
||
|
);
|
||
|
|
||
|
console.log(user.data);
|
||
|
|
||
|
if (user.data.data.id !== '281G3NV') return res.redirect('/backlog/')
|
||
|
|
||
|
console.log("Welcome back bye.");
|
||
|
req.session.bcid = await user.data.data.id;
|
||
|
|
||
|
return res.redirect('/backlog/editor');
|
||
|
}
|
||
|
|
||
|
return res.redirect("https://id.byecorps.com/signin/external/basic?appid=565166780&callback=https://byemc.xyz/backlog/editor");
|
||
|
})
|
||
|
|
||
|
app.get('/backlog/api/getGames', async (req, res) => {
|
||
|
try {
|
||
|
const mySqlClient = await createMySQLClient();
|
||
|
const [results, fields] = await mySqlClient.execute(
|
||
|
"SELECT * FROM games ORDER BY title"
|
||
|
);
|
||
|
let output = [];
|
||
|
|
||
|
|
||
|
|
||
|
return res.json(results);
|
||
|
} catch (err) {
|
||
|
console.log(err)
|
||
|
return res.send("Error");
|
||
|
}
|
||
|
})
|
||
|
|
||
|
app.listen(port, () => {
|
||
|
console.log(`Listening on http://localhost:${port}`);
|
||
|
})
|