diff options
Diffstat (limited to 'src/routes/index.js')
-rw-r--r-- | src/routes/index.js | 60 |
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"); | |||
5 | const geddit = require("../geddit.js"); | 5 | const geddit = require("../geddit.js"); |
6 | const { JWT_KEY } = require("../"); | 6 | const { JWT_KEY } = require("../"); |
7 | const { db } = require("../db"); | 7 | const { db } = require("../db"); |
8 | const { authenticateToken } = require("../auth"); | 8 | const { authenticateToken, authenticateAdmin } = require("../auth"); |
9 | const { validateInviteToken } = require("../invite"); | 9 | const { validateInviteToken } = require("../invite"); |
10 | 10 | ||
11 | const router = express.Router(); | 11 | const 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 | ||
107 | router.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 | |||
127 | router.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 | |||
155 | router.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 |
107 | router.get("/media/*", authenticateToken, async (req, res) => { | 165 | router.get("/media/*", authenticateToken, async (req, res) => { |
108 | const url = req.params[0]; | 166 | const url = req.params[0]; |