fitaiProto/apps/admin/src/app/api/gyms/[id]/route.ts

79 lines
2.1 KiB
TypeScript

import { NextResponse } from "next/server";
import { auth } from "@clerk/nextjs/server";
import { eq, sql } from "@fitai/database";
import { db, users as usersTable, gyms as gymsTable } from "@fitai/database";
import { ensureUserSynced } from "@/lib/sync-user";
import { getDatabase } from "@/lib/database";
import log from "@/lib/logger";
async function ensureGymsTable() {
await db.run(sql`
CREATE TABLE IF NOT EXISTS gyms (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
location TEXT,
status TEXT NOT NULL CHECK (status IN ('active','inactive')) DEFAULT 'active',
admin_user_id TEXT NOT NULL,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
)
`);
}
// DELETE /api/gyms/[id]
// Delete a gym (soft delete - mark as inactive)
export async function DELETE(
request: Request,
{ params }: { params: Promise<{ id: string }> },
) {
try {
const { id: gymId } = await params;
const { userId } = await auth();
if (!userId) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const appDb = await getDatabase();
const currentUser = await ensureUserSynced(userId, appDb);
// Only superAdmin can delete gyms
if (!currentUser || currentUser.role !== "superAdmin") {
return NextResponse.json(
{ error: "Forbidden - Only superAdmin can delete gyms" },
{ status: 403 },
);
}
await ensureGymsTable();
// Check if gym exists using Drizzle ORM
const existingGym = await db
.select()
.from(gymsTable)
.where(eq(gymsTable.id, gymId))
.get();
if (!existingGym) {
return NextResponse.json({ error: "Gym not found" }, { status: 404 });
}
// Soft delete - mark as inactive using Drizzle ORM
await db
.update(gymsTable)
.set({ status: "inactive", updatedAt: new Date() })
.where(eq(gymsTable.id, gymId));
return NextResponse.json({
success: true,
message: "Gym deleted successfully",
});
} catch (error) {
log.error("Failed to delete gym", error);
return NextResponse.json(
{ error: "Internal Server Error" },
{ status: 500 },
);
}
}