diff --git a/src/app/api/upload/route.ts b/src/app/api/upload/route.ts index 139ff88..706ce09 100755 --- a/src/app/api/upload/route.ts +++ b/src/app/api/upload/route.ts @@ -1,4 +1,4 @@ -import { eq } from "drizzle-orm"; +import { and, eq } from "drizzle-orm"; import { NextResponse, type NextRequest } from "next/server"; import { z } from "zod"; import { @@ -9,7 +9,7 @@ import { } from "~/lib/storage/minio"; import { auth } from "~/server/auth"; import { db } from "~/server/db"; -import { mediaCaptures, trials } from "~/server/db/schema"; +import { experiments, mediaCaptures, studyMembers, trials } from "~/server/db/schema"; const uploadSchema = z.object({ trialId: z.string().optional(), @@ -71,16 +71,37 @@ export async function POST(request: NextRequest) { // Check trial access if trialId is provided if (validatedTrialId) { const trial = await db - .select() + .select({ + id: trials.id, + studyId: experiments.studyId, + }) .from(trials) + .innerJoin(experiments, eq(trials.experimentId, experiments.id)) .where(eq(trials.id, validatedTrialId)) .limit(1); - if (!trial.length) { + if (!trial.length || !trial[0]) { return NextResponse.json({ error: "Trial not found" }, { status: 404 }); } - // TODO: Check if user has access to this trial through study membership + // Check if user has access to this trial through study membership + const membership = await db + .select() + .from(studyMembers) + .where( + and( + eq(studyMembers.studyId, trial[0].studyId), + eq(studyMembers.userId, session.user.id) + ) + ) + .limit(1); + + if (!membership.length) { + return NextResponse.json( + { error: "Insufficient permissions to upload to this trial" }, + { status: 403 } + ); + } } // Generate unique file key diff --git a/src/components/admin/system-stats.tsx b/src/components/admin/system-stats.tsx index 6786021..e713d58 100755 --- a/src/components/admin/system-stats.tsx +++ b/src/components/admin/system-stats.tsx @@ -2,13 +2,12 @@ import { Badge } from "~/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; +import { api } from "~/trpc/react"; export function SystemStats() { - // TODO: Implement admin.getSystemStats API endpoint - // const { data: stats, isLoading } = api.admin.getSystemStats.useQuery({}); - const isLoading = false; + const { data: stats, isLoading } = api.admin.getSystemStats.useQuery({}); - if (isLoading) { + if (isLoading || !stats) { return (