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
+<%}%>
<%= commonData.error %>
+ +