aboutsummaryrefslogtreecommitdiff
path: root/src/routes/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/routes/index.js')
-rw-r--r--src/routes/index.js60
1 files changed, 59 insertions, 1 deletions
diff --git a/src/routes/index.js b/src/routes/index.js
index 6efeb79..e7ca573 100644
--- a/src/routes/index.js
+++ b/src/routes/index.js
@@ -5,7 +5,7 @@ const jwt = require("jsonwebtoken");
5const geddit = require("../geddit.js"); 5const geddit = require("../geddit.js");
6const { JWT_KEY } = require("../"); 6const { JWT_KEY } = require("../");
7const { db } = require("../db"); 7const { db } = require("../db");
8const { authenticateToken } = require("../auth"); 8const { authenticateToken, authenticateAdmin } = require("../auth");
9const { validateInviteToken } = require("../invite"); 9const { validateInviteToken } = require("../invite");
10 10
11const router = express.Router(); 11const router = express.Router();
@@ -103,6 +103,64 @@ router.get("/subs", authenticateToken, async (req, res) => {
103 res.render("subs", { subs, user: req.user }); 103 res.render("subs", { subs, user: req.user });
104}); 104});
105 105
106// GET /dashboard
107router.get("/dashboard", authenticateToken, async (req, res) => {
108 let invites = null;
109 const isAdmin = db
110 .query("SELECT isAdmin FROM users WHERE id = $id and isAdmin = 1")
111 .get({
112 id: req.user.id,
113 });
114 if (isAdmin) {
115 invites = db
116 .query("SELECT * FROM invites")
117 .all()
118 .map((inv) => ({
119 ...inv,
120 createdAt: Date.parse(inv.createdAt),
121 usedAt: Date.parse(inv.usedAt),
122 }));
123 }
124 res.render("dashboard", { invites, isAdmin, user: req.user });
125});
126
127router.get("/create-invite", authenticateAdmin, async (req, res) => {
128 function generateInviteToken() {
129 const hasher = new Bun.CryptoHasher("sha256", "super-secret-invite-key");
130 return hasher.update(Math.random().toString()).digest("hex").slice(0, 10);
131 }
132
133 function createInvite() {
134 const token = generateInviteToken();
135 db.run("INSERT INTO invites (token) VALUES ($token)", { token });
136 }
137
138 try {
139 db.run(`
140 CREATE TABLE IF NOT EXISTS invites (
141 id INTEGER PRIMARY KEY AUTOINCREMENT,
142 token TEXT NOT NULL,
143 createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
144 usedAt TIMESTAMP
145 )
146 `);
147
148 createInvite();
149 return res.redirect("/dashboard");
150 } catch (err) {
151 return res.send("failed to create invite");
152 }
153});
154
155router.get("/delete-invite/:id", authenticateToken, async (req, res) => {
156 try {
157 db.run("DELETE FROM invites WHERE id = $id", { id: req.params.id });
158 return res.redirect("/dashboard");
159 } catch (err) {
160 return res.send("failed to delete invite");
161 }
162});
163
106// GET /media 164// GET /media
107router.get("/media/*", authenticateToken, async (req, res) => { 165router.get("/media/*", authenticateToken, async (req, res) => {
108 const url = req.params[0]; 166 const url = req.params[0];