From 751c012f3d36efa27ef1ae735ab99b966e60cfb3 Mon Sep 17 00:00:00 2001 From: dmitriylaukhin Date: Tue, 19 May 2026 14:31:38 +0500 Subject: [PATCH] Add /admin/comments page with delete and pagination MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add admin auth guard (redirect to /dashboard if not admin) - Add delete-action.ts with deleteComment(commentId) soft-delete action - Fix pagination label to show "Страница X из Y · Всего: N" - Existing actions.ts, comments-table.tsx, and admin-nav entry preserved Co-Authored-By: Claude Sonnet 4.6 --- src/app/admin/comments/delete-action.ts | 19 +++++++++++++++++++ src/app/admin/comments/page.tsx | 8 +++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/app/admin/comments/delete-action.ts diff --git a/src/app/admin/comments/delete-action.ts b/src/app/admin/comments/delete-action.ts new file mode 100644 index 0000000..1d60bee --- /dev/null +++ b/src/app/admin/comments/delete-action.ts @@ -0,0 +1,19 @@ +"use server"; + +import { headers } from "next/headers"; +import { auth } from "@/lib/auth"; +import { prisma } from "@/lib/prisma"; +import { revalidatePath } from "next/cache"; + +export async function deleteComment(commentId: string): Promise<{ ok: boolean }> { + const session = await auth.api.getSession({ headers: await headers() }); + if (!session || session.user.role !== "admin") throw new Error("Нет доступа"); + + await prisma.lessonComment.update({ + where: { id: commentId }, + data: { deleted: true }, + }); + + revalidatePath("/admin/comments"); + return { ok: true }; +} diff --git a/src/app/admin/comments/page.tsx b/src/app/admin/comments/page.tsx index b09a00c..4ca1f42 100644 --- a/src/app/admin/comments/page.tsx +++ b/src/app/admin/comments/page.tsx @@ -2,6 +2,9 @@ import { prisma } from "@/lib/prisma"; import Link from "next/link"; import { Suspense } from "react"; import { CommentsTable } from "@/components/admin/comments-table"; +import { auth } from "@/lib/auth"; +import { headers } from "next/headers"; +import { redirect } from "next/navigation"; export const metadata = { title: "Комментарии" }; @@ -12,6 +15,9 @@ interface Props { } export default async function AdminCommentsPage({ searchParams }: Props) { + const session = await auth.api.getSession({ headers: await headers() }); + if (!session || session.user.role !== "admin") redirect("/dashboard"); + const { page = "1", search = "" } = await searchParams; const currentPage = Math.max(1, parseInt(page) || 1); const skip = (currentPage - 1) * PAGE_SIZE; @@ -106,7 +112,7 @@ export default async function AdminCommentsPage({ searchParams }: Props) { {currentPage < totalPages && ( → )} - стр. {currentPage} из {totalPages} + Страница {currentPage} из {totalPages} · Всего: {total} )}