diff --git a/foftickets.js b/foftickets.js index cb15f2e..38bcb02 100644 --- a/foftickets.js +++ b/foftickets.js @@ -6,17 +6,27 @@ const QRCode=require('qrcode'); const crypto=require('crypto'); const path=require('path'); const fs = require('fs'); +const multer = require("multer"); +const upload = multer(); +const csvParse = require("csv-parse"); require('dotenv').config(); const port=process.env.PORT||3000; const base_url = process.env.BASE_URL; const stripe=require('stripe')(process.env.STRIPE_SECRET_KEY); + const app = express(); app.set('view engine','ejs'); app.use(express.json()); app.use(express.static('public')); app.use(cookieParser()); +app.use(session({ + secret: 'supersecretkey', + resave: false, + saveUninitialized: false, +})); + const PORT = 3000; const MainURL ="http://localhost:3000"; const PWSalt ="!SaltyMagic7283715374"; @@ -41,7 +51,7 @@ const QRSalt ="!SaltyMagic5392370662"; // + Turn ticket use on/off from Settings (Admin) // + Turn email on/off from Settings (Admin) // + Magic-link Login System -// Convert all the routes to use common.(user,superuser, +// Convert all the routes to use common.(user,superuser,etc) // Display messages for all GET routes? // Setting to deactivate transfers globally // Option to "Email me my QR Code" @@ -60,7 +70,7 @@ const QRSalt ="!SaltyMagic5392370662"; // + Store password hashed and salted // Make all HTML look nice // Logging and Replay system(?) -// Stripe Integration +// + Stripe Integration // More efficent data structure: TicketsByCamp, TicketsByOffered, TicketsByOwner // @@ -124,18 +134,17 @@ function MagicLinkValid(email,hash) { app.use((req, res, next) => { - console.log("Middleware! req.session=",req.session); res.locals.commonData = { username: req.username, // Attach user info if available superuser: req.superuser, error: req.session && req.session.error || null, // Flash error messages - success: req.session && req.session.success || null, // Flash success messages + message: req.session && req.session.message || null, // Flash success messages }; // Clear session-based flash messages after use if (req.session) { delete req.session.error; - delete req.session.success; + delete req.session.message; } next(); }); @@ -192,11 +201,6 @@ function DeserializeAll() { // Middleware setup app.use(bodyParser.urlencoded({ extended: true })); -app.use(session({ - secret: 'supersecretkey', - resave: false, - saveUninitialized: false, -})); // Middleware to protect routes function requireLogin(req, res, next) { @@ -620,6 +624,22 @@ app.get('/settings',requireSuperUser, (req,res) => { res.render('settings',{ username:req.session.username, superuser:req.session.superuser, settings:settings, message: "" }) }); + +app.post('/importfb',requireSuperUser,upload.single("file"),(req,res) => { + console.log("File name:", req.file.originalname); + const contents=req.file.buffer.toString(); + csvParse.parse(contents, { columns: true, trim: true }, (err, records) => { + if (err) { + console.log("CSV Parsing Error:", err); + req.session.error="The CVS file did not parse correctly. Check console."; + return res.redirect("/settings"); + } + console.log("Records:",records); + req.session.message="Imported Frostburn-style records."; + return res.redirect("/settings"); + }); + }); + app.post('/wipedb',requireSuperUser, (req,res) => { InitDatabase(); res.redirect("/"); diff --git a/views/partials/nav.ejs b/views/partials/nav.ejs index 9475e3f..9f8b44b 100644 --- a/views/partials/nav.ejs +++ b/views/partials/nav.ejs @@ -6,10 +6,22 @@ View Camps (Admin)
Settings (Admin)
<%}%> +<%if (typeof username!='undefined' && username) {%> + Change Password
Log Out
+<%} else {%> + Create Account
+ Log In
+<%}%>
-<% if (typeof message !== 'undefined') { %> -

<%= message %>

+<% if (typeof commonData.message !== 'undefined') { %> +

<%= commonData.message %>

<% } %>
+<% if (commonData.error) { %> +
+

<%= commonData.error %>

+ +
+<% } %> diff --git a/views/settings.ejs b/views/settings.ejs index 19f0dcd..509c5e6 100644 --- a/views/settings.ejs +++ b/views/settings.ejs @@ -23,6 +23,10 @@
+
+ + +