From 3bda27034ad3e3cae3a79a38188ea1a824aba24e Mon Sep 17 00:00:00 2001 From: Roy Dumblauskas Date: Sat, 23 May 2026 17:35:08 -0500 Subject: [PATCH] add users table and users router --- backend/src/db/schema.ts | 25 ++++++++++++++++++++++--- backend/src/index.ts | 2 ++ backend/src/routes/auth.ts | 2 -- backend/src/routes/users.ts | 17 +++++++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 backend/src/routes/users.ts diff --git a/backend/src/db/schema.ts b/backend/src/db/schema.ts index 8d317d2..9860095 100644 --- a/backend/src/db/schema.ts +++ b/backend/src/db/schema.ts @@ -8,9 +8,12 @@ import { integer, bigint, uniqueIndex, - index + index, + boolean, + smallint, + check } from "drizzle-orm/pg-core"; -import { relations } from "drizzle-orm"; +import { sql, relations } from "drizzle-orm"; export const blockTypeEnum = pgEnum("post_block_type", [ "title", @@ -34,7 +37,7 @@ export const articles = pgTable("articles", { name: varchar({ length: 255 }).notNull(), article_status: articleStatusEnum().default("draft"), author_id: uuid().notNull(), - slug: varchar({ length: 255 }).unique().notNull(), + slug: varchar({ length: 511 }).unique().notNull(), summary: varchar({ length: 255 }).notNull(), date_created: timestamp({ mode: "date", withTimezone: true }).defaultNow().notNull(), @@ -70,6 +73,22 @@ export const images = pgTable("images", { }); +export const users = pgTable("users", { + id: uuid().notNull().primaryKey().defaultRandom(), + display_name: varchar({ length: 63 }).notNull(), + + username: varchar({ length: 63 }).notNull(), + hashed_password: varchar({ length: 255 }).notNull(), + logged_in: boolean().notNull().default(false), + + token: varchar({ length: 511 }), + permissions: smallint().notNull().default(44), +}, + (users) => [ + check("permissions lower bound", sql`users.permissions >= 0`), + check("permissions upper bound", sql`users.permissions <= 77`), + ] +); export const articlesRelations = relations(articles, ({ many }) => ({ blocks: many(articleBlocks), diff --git a/backend/src/index.ts b/backend/src/index.ts index caa76ce..4f64b62 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -4,6 +4,7 @@ import { articlesRouter } from './routes/articles.ts'; import { blocksRouter } from './routes/blocks.ts'; import { imagesRouter } from './routes/images.ts'; import { authRouter } from './routes/auth.ts'; +import { usersRouter } from './routes/users.ts'; const app = express(); app.use(express.json()); @@ -16,6 +17,7 @@ app.use("/articles", articlesRouter); app.use("/blocks", blocksRouter); app.use("/images", imagesRouter); app.use("/auth", authRouter); +app.use("/users", usersRouter); const port = process.env.PORT || 3000; diff --git a/backend/src/routes/auth.ts b/backend/src/routes/auth.ts index 745a64d..2d6a433 100644 --- a/backend/src/routes/auth.ts +++ b/backend/src/routes/auth.ts @@ -5,5 +5,3 @@ import express, { Request, Response } from "express"; const db = drizzle(process.env.DATABASE_URL!); export const authRouter = express.Router(); - -// TODO: implement diff --git a/backend/src/routes/users.ts b/backend/src/routes/users.ts new file mode 100644 index 0000000..7cb6368 --- /dev/null +++ b/backend/src/routes/users.ts @@ -0,0 +1,17 @@ +import { drizzle } from 'drizzle-orm/node-postgres'; +import { eq } from 'drizzle-orm'; +import { users } from '../db/schema.ts'; +import express, { Request, Response } from "express"; + +const db = drizzle(process.env.DATABASE_URL!); +export const usersRouter = express.Router(); + +usersRouter.get("/getUser/:userId", async (req: Request, res: Response) => { + const { userId } = req.params; + + const resp = await db.select() + .from(users) + .where(eq(users.id, userId)); + + res.json(resp); +});