From 31b87a5809ba0c9bc38d6bb2dabf0d48548274d5 Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 19 Nov 2024 08:01:37 -0800 Subject: [PATCH] fix: some cleanup + user can't edit their own role --- src/backend/routers/user.ts | 15 +++++++++++++++ src/components/table/renderers.tsx | 6 +++--- src/components/table/table2.tsx | 4 ++-- src/components/table/types.ts | 6 +++--- src/pages/admin/index.tsx | 4 ++-- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/backend/routers/user.ts b/src/backend/routers/user.ts index 67a41a48..60427a5b 100644 --- a/src/backend/routers/user.ts +++ b/src/backend/routers/user.ts @@ -185,6 +185,21 @@ export const user = router({ .mutation(async (req) => { const { user_id, first_name, last_name, email, role } = req.input; + const { userId } = req.ctx.auth; + + const dbUser = await req.ctx.db + .selectFrom("user") + .where("user_id", "=", user_id) + .selectAll() + .executeTakeFirstOrThrow(); + + if (userId === user_id && dbUser.role !== role) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "You cannot change your own role", + }); + } + return await req.ctx.db .updateTable("user") .set({ diff --git a/src/components/table/renderers.tsx b/src/components/table/renderers.tsx index c124db7f..bd468017 100644 --- a/src/components/table/renderers.tsx +++ b/src/components/table/renderers.tsx @@ -1,8 +1,8 @@ import { TextField } from "@mui/material"; import { Dropdown } from "@/components/design_system/dropdown/Dropdown"; -import { ColumnDefinition, BaseEntity, SelectOption } from "./types"; +import { ColumnDefinition, UserBase, SelectOption } from "./types"; -export function renderTableInput( +export function renderTableInput( column: ColumnDefinition, value: T[keyof T] | undefined, onChange: (value: T[keyof T]) => void @@ -41,7 +41,7 @@ export function renderTableInput( } } -export function renderTableCell( +export function renderTableCell( column: ColumnDefinition, value: T[keyof T] ): React.ReactNode { diff --git a/src/components/table/table2.tsx b/src/components/table/table2.tsx index 689ae593..b5dbbf34 100644 --- a/src/components/table/table2.tsx +++ b/src/components/table/table2.tsx @@ -14,7 +14,7 @@ import { import { styled } from "@mui/material/styles"; import { visuallyHidden } from "@mui/utils"; import SearchIcon from "@mui/icons-material/Search"; -import { TableProps, BaseEntity } from "./types"; +import { TableProps, UserBase } from "./types"; import { renderTableInput, renderTableCell } from "./renderers"; import $table from "./Table.module.css"; import $button from "@/components/design_system/button/Button.module.css"; @@ -29,7 +29,7 @@ const StyledTableRow = styled(TableRow)(() => ({ }, })); -export function Table2({ +export function Table2({ data, columns, type, diff --git a/src/components/table/types.ts b/src/components/table/types.ts index f8acd060..e37b588b 100644 --- a/src/components/table/types.ts +++ b/src/components/table/types.ts @@ -2,7 +2,7 @@ import { Roles } from "@/types/auth"; export type ColumnType = "text" | "number" | "select" | "date"; -export interface BaseEntity { +export interface UserBase { id?: string | number; first_name: string; last_name: string; @@ -15,7 +15,7 @@ export interface SelectOption { label: string; } -export interface ColumnDefinition { +export interface ColumnDefinition { id: keyof T; label: string; type: ColumnType; @@ -24,7 +24,7 @@ export interface ColumnDefinition { customRender?: (value: T[keyof T]) => React.ReactNode; } -export interface TableProps { +export interface TableProps { data: T[]; columns: ColumnDefinition[]; type: string; diff --git a/src/pages/admin/index.tsx b/src/pages/admin/index.tsx index b67ddf54..dc472664 100644 --- a/src/pages/admin/index.tsx +++ b/src/pages/admin/index.tsx @@ -1,7 +1,7 @@ import { requiresAdminAuth } from "@/client/lib/protected-page"; import { trpc } from "@/client/lib/trpc"; import { Table2 } from "@/components/table/table2"; -import { ColumnDefinition, BaseEntity } from "@/components/table/types"; +import { ColumnDefinition, UserBase } from "@/components/table/types"; import { useRouter } from "next/router"; import { useState } from "react"; import { ROLE_OPTIONS, Roles } from "@/types/auth"; @@ -9,7 +9,7 @@ import { getRoleLabel } from "@/types/auth"; import { sortBySchema, sortOrderSchema } from "@/backend/routers/user"; import { z } from "zod"; -interface User extends BaseEntity { +interface User extends UserBase { user_id: string; first_name: string; last_name: string;