diff --git a/apps/web/src/views/public/board/index.tsx b/apps/web/src/views/public/board/index.tsx index bf5203d9..de90965e 100644 --- a/apps/web/src/views/public/board/index.tsx +++ b/apps/web/src/views/public/board/index.tsx @@ -28,9 +28,14 @@ export default function PublicBoardView() { ? router.query.boardSlug[0] : router.query.boardSlug; + const workspaceSlug = Array.isArray(router.query.workspaceSlug) + ? router.query.workspaceSlug[0] + : router.query.workspaceSlug; + const { data, isLoading } = api.board.bySlug.useQuery( { boardSlug: boardSlug ?? "", + workspaceSlug: workspaceSlug ?? "", members: formatToArray(router.query.members), labels: formatToArray(router.query.labels), }, diff --git a/packages/api/src/routers/board.ts b/packages/api/src/routers/board.ts index b8fc5678..61679c89 100644 --- a/packages/api/src/routers/board.ts +++ b/packages/api/src/routers/board.ts @@ -111,15 +111,21 @@ export const boardRouter = createTRPCRouter({ .meta({ openapi: { method: "GET", - path: "/board/{boardSlug}", + path: "/workspaces/{workspaceSlug}/boards/{boardSlug}", summary: "Get board by slug", - description: "Retrieves a board by its slug", + description: + "Retrieves a board by its slug within a specific workspace", tags: ["Boards"], protect: false, }, }) .input( z.object({ + workspaceSlug: z + .string() + .min(3) + .max(24) + .regex(/^(?![-]+$)[a-zA-Z0-9-]+$/), boardSlug: z .string() .min(3) @@ -131,10 +137,26 @@ export const boardRouter = createTRPCRouter({ ) .output(z.custom>>()) .query(async ({ ctx, input }) => { - const result = await boardRepo.getBySlug(ctx.db, input.boardSlug, { - members: input.members ?? [], - labels: input.labels ?? [], - }); + const workspace = await workspaceRepo.getBySlugWithBoards( + ctx.db, + input.workspaceSlug, + ); + + if (!workspace) + throw new TRPCError({ + message: `Workspace with slug ${input.workspaceSlug} not found`, + code: "NOT_FOUND", + }); + + const result = await boardRepo.getBySlug( + ctx.db, + input.boardSlug, + workspace.id, + { + members: input.members ?? [], + labels: input.labels ?? [], + }, + ); return result; }), diff --git a/packages/db/src/repository/board.repo.ts b/packages/db/src/repository/board.repo.ts index 7a3c5125..6e4a5057 100644 --- a/packages/db/src/repository/board.repo.ts +++ b/packages/db/src/repository/board.repo.ts @@ -201,6 +201,7 @@ export const getByPublicId = async ( export const getBySlug = async ( db: dbClient, boardSlug: string, + workspaceId: number, filters: { members: string[]; labels: string[]; @@ -293,6 +294,7 @@ export const getBySlug = async ( }, where: and( eq(boards.slug, boardSlug), + eq(boards.workspaceId, workspaceId), isNull(boards.deletedAt), eq(boards.visibility, "public"), ),