public
anord
read
Ledger
Why work hard when you can work easier?
Languages
Repository composition by tracked source files.
TypeScript
86%
CSS
10%
SQL
3%
Shell
1%
HTML
0%
Trace
apps/api/src/http/middleware/auth.ts
Trace helps you understand code history line by line. See who changed each line, when it changed, and which commit introduced it.
Author
Date
Commit
Line
Code
1
import type { NextFunction, Response } from "express";
2
import { canEditPage, canManageSettings, hasRole } from "@ledger/shared";
3
import { env } from "../../config/env.js";
4
import { getUserForSession, verifySessionToken } from "../../services/auth.js";
5
import type { AppRequest } from "../types.js";
7
export async function sessionMiddleware(req: AppRequest, _res: Response, next: NextFunction) {
8
const token = req.cookies?.[env.SESSION_COOKIE_NAME];
9
req.user = null;
11
if (!token) {
12
return next();
13
}
15
try {
16
const payload = verifySessionToken(token);
17
req.user = await getUserForSession(payload.id);
18
} catch {
19
req.user = null;
20
}
22
next();
23
}
25
export function requireAuthenticated(req: AppRequest, res: Response, next: NextFunction) {
26
if (!req.user) {
27
return res.status(401).json({ error: "Authentication required" });
28
}
30
next();
31
}
33
export function requireEditor(req: AppRequest, res: Response, next: NextFunction) {
34
if (!canEditPage(req.user)) {
35
return res.status(403).json({ error: "Editor access required" });
36
}
38
next();
39
}
41
export function requireAdmin(req: AppRequest, res: Response, next: NextFunction) {
42
if (!canManageSettings(req.user)) {
43
return res.status(403).json({ error: "Admin access required" });
44
}
46
next();
47
}
49
export function requireViewer(req: AppRequest, res: Response, next: NextFunction) {
50
if (!hasRole(req.user, "viewer")) {
51
return res.status(403).json({ error: "Viewer access required" });
52
}
54
next();
55
}