Skip to content

Commit 6c0c343

Browse files
committed
Add requireAdmin guard to mutating admin actions and fix supabase env var in template
1 parent 288a8c6 commit 6c0c343

2 files changed

Lines changed: 21 additions & 1 deletion

File tree

‎.env.template‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ NEXT_PUBLIC_REDIRECT_URL=http://localhost:3000/auth/callback
22
NEXT_PUBLIC_BASE_URL=http://localhost:3000
33

44
NEXT_PUBLIC_SUPABASE_URL=<supabase_url>
5-
NEXT_PUBLIC_SUPABASE_ANON_KEY=<supabase_anon_key>
5+
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=<supabase_publishable_key>
66

77
DATABASE_URL=<database_url>
88
DIRECT_URL=<direct_url>

‎src/app/portal/admin/actions.ts‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"use server";
22
import { db } from "@/db";
3+
import { createClient } from "@/lib/utils/supabase/server";
34
import { FormStep } from "@/lib/types/questions";
45
import { FormFields } from "@/components/forms/applications/columns";
56
import { sendEmail } from "@/lib/utils/forms/email";
@@ -11,7 +12,22 @@ export async function getForms() {
1112
return db.forms.findMany();
1213
}
1314

15+
async function requireAdmin() {
16+
const supabase = createClient();
17+
const { data, error } = await supabase.auth.getUser();
18+
if (error || !data.user) {
19+
throw new Error("Unauthorized");
20+
}
21+
const role = await db.roles.findUnique({
22+
where: { id: data.user.id },
23+
});
24+
if (!role || role.roles?.split(",")[0] !== "admin") {
25+
throw new Error("Unauthorized");
26+
}
27+
}
28+
1429
export async function createForm(data: { title: string; description: string }) {
30+
await requireAdmin();
1531
return db.forms.create({ data: { ...data, config: {}, questions: [] } });
1632
}
1733

@@ -37,6 +53,7 @@ export async function updateForm(
3753
questions: object[];
3854
},
3955
) {
56+
await requireAdmin();
4057
return db.forms.update({ where: { id }, data });
4158
}
4259

@@ -168,6 +185,7 @@ export async function updateSubmissionField(
168185
value: any,
169186
cta: boolean = false,
170187
) {
188+
await requireAdmin();
171189
if (tableName === "applications") {
172190
await db["applications"].update({
173191
where: { id: submissionId },
@@ -199,6 +217,7 @@ export async function sendStatusEmailToUser(
199217
submissionId: string,
200218
value: string,
201219
) {
220+
await requireAdmin();
202221
const submission = await db.submissions.findFirst({
203222
where: {
204223
id: submissionId,
@@ -218,6 +237,7 @@ export async function sendStatusEmailToUser(
218237
}
219238

220239
export async function getAdminMembers() {
240+
await requireAdmin();
221241
const res = await db.roles.findMany({
222242
where: {
223243
roles: {

0 commit comments

Comments
 (0)