From 4878a66c0329a64fd80b27bc6d4b1ab7a5aacb48 Mon Sep 17 00:00:00 2001 From: d0zingcat Date: Mon, 12 Jan 2026 11:36:45 +0800 Subject: [PATCH] feat: add created_by/approved_by Signed-off-by: d0zingcat --- apps/server/scripts/check_admin_requests.ts | 1 + apps/server/scripts/check_dashboard.ts | 1 + apps/server/src/api.ts | 10 ++++++++- apps/server/src/db/schema.ts | 9 ++++++++ apps/web/src/views/AdminView.tsx | 4 ++++ apps/web/src/views/TopicsView.tsx | 23 +++++++++++++++++++-- 6 files changed, 45 insertions(+), 3 deletions(-) diff --git a/apps/server/scripts/check_admin_requests.ts b/apps/server/scripts/check_admin_requests.ts index c77bf53..399c65b 100644 --- a/apps/server/scripts/check_admin_requests.ts +++ b/apps/server/scripts/check_admin_requests.ts @@ -1,3 +1,4 @@ +export { }; // Simulate admin checking requests async function run() { diff --git a/apps/server/scripts/check_dashboard.ts b/apps/server/scripts/check_dashboard.ts index bb9c3c5..22554ca 100644 --- a/apps/server/scripts/check_dashboard.ts +++ b/apps/server/scripts/check_dashboard.ts @@ -1,3 +1,4 @@ +export { }; async function run() { console.log('Fetching dashboard stats as admin...'); diff --git a/apps/server/src/api.ts b/apps/server/src/api.ts index 54dfa57..5c4f41b 100644 --- a/apps/server/src/api.ts +++ b/apps/server/src/api.ts @@ -32,6 +32,8 @@ api.get('/topics', requireAuth, async (c) => { const allTopics = await db.query.topics.findMany({ where: eq(topics.status, 'approved'), with: { + creator: true, + approver: true, subscriptions: { where: (subscriptions, { eq }) => isAdmin ? undefined : (currentUserId ? eq(subscriptions.userId, currentUserId) : undefined), @@ -59,6 +61,7 @@ api.get('/topics/all', requireAdmin, async (c) => { const allTopics = await db.query.topics.findMany({ with: { creator: true, + approver: true, subscriptions: true }, orderBy: [desc(topics.createdAt)] @@ -71,14 +74,18 @@ api.get('/topics/my-requests', requireAuth, async (c) => { const requests = await db.query.topics.findMany({ where: eq(topics.createdBy, session.id), orderBy: [desc(topics.createdAt)], + with: { + approver: true, + } }); return c.json(requests); }); api.post('/topics/:id/approve', requireAdmin, async (c) => { const id = c.req.param('id'); + const session = c.get('session'); const result = await db.update(topics) - .set({ status: 'approved' }) + .set({ status: 'approved', approvedBy: session.id }) .where(eq(topics.id, id)) .returning(); return c.json(result[0]); @@ -105,6 +112,7 @@ api.post('/topics', requireAuth, zValidator('json', topicSchema), async (c) => { ...body, status, createdBy: session.id, + approvedBy: session.isAdmin ? session.id : null, }).returning(); return c.json(result[0]); }); diff --git a/apps/server/src/db/schema.ts b/apps/server/src/db/schema.ts index b5a06a3..b05c368 100644 --- a/apps/server/src/db/schema.ts +++ b/apps/server/src/db/schema.ts @@ -9,6 +9,7 @@ export const topics = pgTable('topics', { description: text('description'), status: text('status', { enum: ['pending', 'approved', 'rejected'] }).default('approved').notNull(), createdBy: text('created_by').references(() => users.id), + approvedBy: text('approved_by').references(() => users.id), createdAt: timestamp('created_at').defaultNow().notNull(), }); @@ -17,6 +18,12 @@ export const topicsRelations = relations(topics, ({ many, one }) => ({ creator: one(users, { fields: [topics.createdBy], references: [users.id], + relationName: 'creator', + }), + approver: one(users, { + fields: [topics.approvedBy], + references: [users.id], + relationName: 'approver', }), })); @@ -31,6 +38,8 @@ export const users = pgTable('users', { export const usersRelations = relations(users, ({ many }) => ({ subscriptions: many(subscriptions), + createdTopics: many(topics, { relationName: 'creator' }), + approvedTopics: many(topics, { relationName: 'approver' }), })); // Subscriptions: 用户直接订阅 Topic diff --git a/apps/web/src/views/AdminView.tsx b/apps/web/src/views/AdminView.tsx index 714380c..de82f2b 100644 --- a/apps/web/src/views/AdminView.tsx +++ b/apps/web/src/views/AdminView.tsx @@ -99,6 +99,7 @@ function TopicsManagement() { Status Subscribers Created By + Approved By Actions @@ -123,6 +124,9 @@ function TopicsManagement() { {topic.creator?.name || 'Unknown'} + + {topic.approver?.name || '-'} +