From 70f434cae395e4b56241c03cb378f9b138b9b839 Mon Sep 17 00:00:00 2001 From: Teppy Date: Thu, 26 Dec 2024 21:46:13 -0500 Subject: [PATCH] changes --- foftickets.js | 53 ++++++++++++++++++++++++++++++++------------- public/styles.css | 15 +++++++------ views/camps.ejs | 2 +- views/editcamp.ejs | 2 +- views/oneticket.ejs | 20 ++++++++++------- 5 files changed, 60 insertions(+), 32 deletions(-) diff --git a/foftickets.js b/foftickets.js index c8b7c07..df42200 100644 --- a/foftickets.js +++ b/foftickets.js @@ -229,7 +229,6 @@ app.get('/editcamp', requireSuperUser, (req,res) => { const parts=t.split("-"); const cname=parts[0]; const tnum=Number(parts[1]); - console.log("Cname: ",cname," campname ",campname," tnum ",tnum); if (cname==campname) { edit.tickets[t]={}; edit.tickets[t].owner=tickets[t].owner; @@ -237,12 +236,21 @@ app.get('/editcamp', requireSuperUser, (req,res) => { edit.tickets[t].status=tickets[t].status; } } - console.log("Edit is ",edit); return res.render("editcamp",edit); }) +app.get('/manytickets', requireLogin, (req,res) => { + let username=req.session.username; + const edit={ username:req.session.username, tickets: {} }; + for (const t in tickets) if (tickets[t].owner==username && tickets[t].status=="i") { + edit.tickets[t]={}; + edit.tickets[t].offered=tickets[t].offered; + } + return res.render("manytickets",edit); + }) -app.get('/mytickets',requireLogin, (req,res)=> { + +app.get('/mytickets',requireLogin, async (req,res)=> { let username=req.session.username; let claimed=0; let owned=0; @@ -259,10 +267,30 @@ app.get('/mytickets',requireLogin, (req,res)=> { } } if (owned==0) return res.render("message",{ username:username, message:"You have no unused tickets" }); - else if (owned==1) return res.render("oneticket",{ username:username, ticket:theticket, offered:tickets[theticket].offered }); + else if (owned==1) { + const hash0=crypto.createHash('sha256'); + const hash1=hash0.update(theticket+QRSalt); + const hash=hash1.digest("base64").slice(0,6); + const dataURL=await QRCode.toDataURL('localhost:3000/useticket?t='+theticket+'&h='+hashQR(theticket,username)); + return res.render("oneticket",{ username:username, ticket:theticket, offered:tickets[theticket].offered, qrcode:dataURL }); + } else return res.render("manytickets",edit); }); +app.post('/mytickets',requireLogin, async (req,res)=> { + let username=req.session.username; + let theticket=req.body.ticket; + let offered=req.body.offered; + if (tickets[theticket].owner==username && tickets[theticket].status=="i") { + tickets[theticket].offered=offered; + } + const hash0=crypto.createHash('sha256'); + const hash1=hash0.update(theticket+QRSalt); + const hash=hash1.digest("base64").slice(0,6); + const dataURL=await QRCode.toDataURL('localhost:3000/useticket?t='+theticket+'&h='+hashQR(theticket,username)); + return res.render("oneticket", { username:username, ticket:theticket, offered:tickets[theticket].offered, qrcode:dataURL }); +}); + // Big Kahuna // If you have zero tickets, show something saying that // For each ticket owned, display options to offer it, use it, or (eventually) pay for it. @@ -283,7 +311,7 @@ app.get('/transfer', requireLogin, async (req,res) => { edit.tickets[t]={}; edit.tickets[t].owner=tickets[t].owner; edit.tickets[t].offered=tickets[t].offered; - edit.tickets[t].used=tickets[t].used; + edit.tickets[t].used=tickets[t].status=="u"; } return res.render("transfer",edit); } @@ -303,12 +331,6 @@ app.get('/transfer', requireLogin, async (req,res) => { if (cat=="complex") return res.render('transfer',simpledata); }) -app.post("/toggle", requireSuperUser, (req,res) => { - const ticket=req.body.ticket; - const isChecked = req.body.checked; - tickets[ticket].used=isChecked; - res.json({ message: 'Checkbox state received', checked: isChecked }); - }) app.post("/changestatus", requireSuperUser, (req,res) => { const ticket=req.body.ticket; @@ -322,7 +344,8 @@ app.post("/updateoffered", requireLogin, (req,res) => { const ticket=req.body.ticket; const offered=req.body.offered; if (tickets[ticket].owner!=req.session.username) res.status(500).send("Ticket "+ticket+" owned by someone else"); - else if (tickets[ticket].used) res.status(500).send("Ticket "+ticket+" has already been used"); + else if (tickets[ticket].status=="u") res.status(500).send("Ticket "+ticket+" has already been used"); + else if (tickets[ticket].status=="r") res.status(500).send("Ticket "+ticket+" was revoked"); else { tickets[ticket].offered=offered; res.json({ message: 'Updated owner of '+ticket+' to '+offered }); @@ -344,10 +367,10 @@ app.get("/useticket",(req,res) => { let ticket=req.t; let hash=req.h; if (hashQR(ticket,req.session.username)!=hash) res.status(500).send("Ticket "+ticket+" was transferred to "+tickets[ticket].username); - else if (tickets[ticket].used) res.status(500).send("Ticket "+ticket+" has already been used."); + else if (tickets[ticket].status!="i") res.status(500).send("Ticket "+ticket+" has already been used."); else { - tickets[ticket].used=new Date().toISOString(); - res.send("

Welcome, "+tickets[ticket].username+" to Falls on Fire! Ticket "+ticket+" has now been used.

"); + tickets[ticket].status="u"; + res.send("

Welcome, "+tickets[ticket].owner+" to Falls on Fire! Ticket "+ticket+" has now been used.

"); } }) diff --git a/public/styles.css b/public/styles.css index 10cab71..94b1716 100644 --- a/public/styles.css +++ b/public/styles.css @@ -24,8 +24,7 @@ .qrcode-image { object-fit: contain; - width: 80%; /* Adjust as needed */ - height: 80%; + grid-column:2; } /* Close button */ @@ -37,24 +36,25 @@ cursor: pointer; } +.grid { +} + /* General Reset */ body { margin: 0; font-family: Arial, sans-serif; - display: flex; /* Ensure the body uses a flex container */ + display: grid; + grid-template-columns: 1fr 3fr; height: 100vh; /* Full viewport height */ } /* Sidebar (Nav Links) */ .nav-links { - width: 250px; /* Set a fixed width for the sidebar */ background-color: #f4f4f4; /* Light gray background */ padding: 20px; box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1); /* Add a slight shadow for separation */ - display: flex; - flex-direction: column; /* Ensure items stack vertically */ - justify-content: flex-start; /* Optional: adjust spacing of items */ + grid-column: 1; min-height: 100vh; /* Stretch to full viewport height */ } @@ -77,6 +77,7 @@ body { } .content { + grid-column: 2; flex-grow: 1; /* Allow content to fill the remaining space */ padding: 20px; } diff --git a/views/camps.ejs b/views/camps.ejs index a7e3bef..1b88f61 100644 --- a/views/camps.ejs +++ b/views/camps.ejs @@ -4,7 +4,7 @@ Camps - + <%- include('partials/nav') %>
diff --git a/views/editcamp.ejs b/views/editcamp.ejs index 842a353..d236306 100644 --- a/views/editcamp.ejs +++ b/views/editcamp.ejs @@ -4,7 +4,7 @@ Edit Camp - + <%- include('partials/nav') %>