added admin system

This commit is contained in:
averel10
2026-03-08 10:27:23 +01:00
parent 4d8040a674
commit 445a429be7
9 changed files with 297 additions and 16 deletions

View File

@@ -3,6 +3,8 @@ import db from '@/lib/db';
import { dataset_entry } from '@/lib/model/dataset_entry';
import { eq } from 'drizzle-orm';
import AudioPlayer from '@/components/AudioPlayer';
import { requireAdmin } from '@/lib/auth';
import { redirect } from 'next/navigation';
interface DatasetEntryPageProps {
params: {
@@ -12,6 +14,16 @@ interface DatasetEntryPageProps {
}
export default async function DatasetEntryPage({ params }: DatasetEntryPageProps) {
const result = await requireAdmin();
if (!result.authenticated) {
redirect("/user/sign-in");
}
if (!result.admin) {
redirect("/");
}
const { id: datasetId, entryId } = await params;
const datasetIdNum = parseInt(datasetId, 10);
const entryIdNum = parseInt(entryId, 10);

View File

@@ -6,6 +6,8 @@ import EditableDatasetHeader from '@/components/EditableDatasetHeader';
import DatasetEntriesList from '@/components/DatasetEntriesList';
import UploadDatasetEntriesModal from '@/components/UploadDatasetEntriesModal';
import RemoveAllEntriesButton from '@/components/RemoveAllEntriesButton';
import { requireAdmin } from '@/lib/auth';
import { redirect } from 'next/navigation';
interface DatasetPageProps {
params: {
@@ -14,6 +16,16 @@ interface DatasetPageProps {
}
export default async function DatasetPage({ params }: DatasetPageProps) {
const result = await requireAdmin();
if (!result.authenticated) {
redirect("/user/sign-in");
}
if (!result.admin) {
redirect("/");
}
const {id} = await params;
const datasetId = parseInt(id, 10);

View File

@@ -1,22 +1,39 @@
import DatasetsList from "@/components/DatasetsList";
import CreateDatasetModal from "@/components/CreateDatasetModal";
import { auth } from "@/lib/auth";
import { headers } from "next/headers";
import { requireAdmin } from "@/lib/auth";
import { redirect } from "next/navigation";
import Link from "next/link";
export default async function AdminPage() {
const session = await auth.api.getSession({
headers: await headers()
})
const result = await requireAdmin();
if(!session) {
redirect("/user/sign-in")
if (!result.authenticated) {
redirect("/user/sign-in");
}
if (!result.admin) {
redirect("/");
}
return (
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
<div className="mb-8">
<h1 className="text-3xl font-bold mb-4">Admin Panel</h1>
<div className="flex gap-4">
<Link
href="/admin/users"
className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
>
Manage Users
</Link>
</div>
</div>
<div className="mt-8">
<h2 className="text-2xl font-bold mb-4">Datasets</h2>
<CreateDatasetModal />
<DatasetsList />
</div>
</div>
);
}

View File

@@ -0,0 +1,39 @@
import Link from "next/link";
import UsersList from "@/components/UsersList";
import { requireAdmin } from "@/lib/auth";
import { redirect } from "next/navigation";
import { getAllUsers } from "@/app/actions/manage-users";
export default async function UsersPage() {
const result = await requireAdmin();
if (!result.authenticated) {
redirect("/user/sign-in");
}
if (!result.admin) {
redirect("/");
}
const users = await getAllUsers();
return (
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
<div className="mb-6">
<Link
href="/admin"
className="text-blue-500 hover:text-blue-600 mb-4 inline-block"
>
Back to Admin
</Link>
<h1 className="text-3xl font-bold">User Management</h1>
</div>
<div className="bg-white rounded-lg shadow">
<div className="p-6">
<UsersList users={users} />
</div>
</div>
</div>
);
}