render articles

This commit is contained in:
2026-08-22 17:57:54 -05:00
parent 1073b794d6
commit 6f21248132
25 changed files with 991 additions and 433 deletions
+5 -4
View File
@@ -7,7 +7,7 @@ import {
varchar,
integer,
bigint,
unique,
uniqueIndex,
boolean,
smallint,
check,
@@ -28,7 +28,8 @@ export const blockTypeEnum = pgEnum("post_block_type", [
export const articleStatusEnum = pgEnum("post_status", [
"draft",
"published"
"published",
"archived"
]);
export const articles = pgTable("articles", {
@@ -48,7 +49,7 @@ export const articles = pgTable("articles", {
next_article: uuid()
},
(table) => [
unique("no_repeat_slugs_per_author")
uniqueIndex("no_repeat_slugs_per_author")
.on(table.author_id, table.slug),
foreignKey({
@@ -74,7 +75,7 @@ export const articleBlocks = pgTable("article_blocks", {
},
(table) => [{
postPositionIdx: unique("no_repeat_block_position_per_article")
postPositionIdx: uniqueIndex("no_repeat_block_position_per_article")
.on(table.article_id, table.position)
}]);
+6 -2
View File
@@ -2,9 +2,14 @@ import { Request, Response, NextFunction } from "express";
import JsonWebToken from '../types/JsonWebToken.ts';
export enum Permission {
none = 0,
read = 1,
write = 2,
delete = 4
readwrite = 3,
delete = 4,
readdelete = 5,
writedelete = 6,
all = 7,
};
export function requirePermissions(permission: number, isOwner: Boolean, requiredPermissions: number): Boolean {
@@ -13,5 +18,4 @@ export function requirePermissions(permission: number, isOwner: Boolean, require
permission % 10;
return (mask & requiredPermissions) === requiredPermissions;
};
+2 -2
View File
@@ -1,5 +1,5 @@
import { Request, Response, NextFunction } from "express";
import { drizzle } from 'drizzle-orm/node-postgres';
import { Request, Response, NextFunction } from "express";
import { eq } from 'drizzle-orm';
import { users } from '../db/schema.ts';
import { decodeJWT, generateSignedJWT, verifySignature } from "../helpers/jwt.ts";
@@ -56,7 +56,7 @@ export async function refreshJWT(
});
}
const toExpire = 60 * 15;
const toExpire = 60 * 15; // 15 minutes
const jwt = generateSignedJWT(user.id, user.permissions, toExpire)
res.set("X-New-Access-Token", jwt);
+3 -1
View File
@@ -40,7 +40,9 @@ articlesRouter.get("/getArticleBySlug/:slug", async (req: Request, res: Response
const resp = await db.select()
.from(articles)
.where(eq(articles.slug, parsedSlug));
res.json(resp);
// Only return the first
res.json(resp[0]);
});
articlesRouter.post("/postArticle", async (req: Request, res: Response) => {
+14
View File
@@ -30,6 +30,20 @@ usersRouter.get("/getUser/:userId", async (req: Request, res: Response) => {
res.json(resp);
});
usersRouter.get("/getUserName/:userId", async (req: Request, res: Response) => {
const { userId } = req.params;
const parsedId = Array.isArray(userId) ? userId[0] : userId;
const resp = await db.select()
.from(users)
.where(eq(users.id, parsedId));
res.json({
id: resp[0].id,
display_name: resp[0].display_name
});
});
usersRouter.post("/createUser", async (req: Request, res: Response) => {
const resp = await db
.insert(users)
+1 -1
View File
@@ -27,7 +27,7 @@ export function defaultJWT() {
payload: {
iat: -1,
uid: "",
prm: 44,
prm: 0,
exp: -1
},
signature: ""