60 lines
1.6 KiB
TypeScript
60 lines
1.6 KiB
TypeScript
import type { APIRoute } from "astro";
|
|
import { db } from "../../../db";
|
|
import { organizations, members } from "../../../db/schema";
|
|
import { eq, and } from "drizzle-orm";
|
|
|
|
export const POST: APIRoute = async ({ request, locals, redirect }) => {
|
|
const user = locals.user;
|
|
if (!user) {
|
|
return redirect("/login");
|
|
}
|
|
|
|
const formData = await request.formData();
|
|
const organizationId = formData.get("organizationId") as string;
|
|
const name = formData.get("name") as string;
|
|
|
|
if (!organizationId || !name || name.trim().length === 0) {
|
|
return new Response("Organization ID and name are required", {
|
|
status: 400,
|
|
});
|
|
}
|
|
|
|
try {
|
|
// Verify user is admin/owner of this organization
|
|
const membership = await db
|
|
.select()
|
|
.from(members)
|
|
.where(
|
|
and(
|
|
eq(members.userId, user.id),
|
|
eq(members.organizationId, organizationId),
|
|
),
|
|
)
|
|
.get();
|
|
|
|
if (!membership) {
|
|
return new Response("Not authorized", { status: 403 });
|
|
}
|
|
|
|
const isAdmin = membership.role === "owner" || membership.role === "admin";
|
|
if (!isAdmin) {
|
|
return new Response(
|
|
"Only owners and admins can update organization settings",
|
|
{ status: 403 },
|
|
);
|
|
}
|
|
|
|
// Update organization name
|
|
await db
|
|
.update(organizations)
|
|
.set({ name: name.trim() })
|
|
.where(eq(organizations.id, organizationId))
|
|
.run();
|
|
|
|
return redirect("/dashboard/team/settings?success=org-name");
|
|
} catch (error) {
|
|
console.error("Error updating organization name:", error);
|
|
return new Response("Failed to update organization name", { status: 500 });
|
|
}
|
|
};
|