i choose to commit my life
This commit is contained in:
parent
8c5e7c44bf
commit
b5c4ca32ed
7 changed files with 165 additions and 39 deletions
|
@ -17,7 +17,7 @@ const Sidebar = () => {
|
|||
|
||||
<nav className="sidebar-nav">
|
||||
<ul className="sidebar-nav_elements">
|
||||
{AdminLinks.slice(0, 4).map((link) => {
|
||||
{AdminLinks.slice(0, 5).map((link) => {
|
||||
const isActive = link.url === pathname;
|
||||
|
||||
return (
|
||||
|
@ -37,7 +37,7 @@ const Sidebar = () => {
|
|||
</ul>
|
||||
|
||||
<ul className="sidebar-nav_elements">
|
||||
{AdminLinks.slice(4).map((link) => {
|
||||
{AdminLinks.slice(5).map((link) => {
|
||||
const isActive = link.url === pathname;
|
||||
|
||||
return (
|
||||
|
|
|
@ -26,7 +26,7 @@ interface PageEntry {
|
|||
content: string;
|
||||
}
|
||||
|
||||
const AdminLogPage = () => {
|
||||
const MultiLogs = () => {
|
||||
const [pages, setPages] = useState<PageEntry[]>([]);
|
||||
const { toast } = useToast();
|
||||
const router = useRouter();
|
||||
|
@ -64,6 +64,23 @@ const AdminLogPage = () => {
|
|||
setLoading(false);
|
||||
};
|
||||
|
||||
const deletePage = async (slug: string) => {
|
||||
setLoading(true);
|
||||
const response = await fetch(`/api/mdx/pages/${slug}`, {
|
||||
method: "DELETE",
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
setPages(pages.filter((page) => page.slug !== slug));
|
||||
toast({ description: "Page deleted successfully" });
|
||||
} else {
|
||||
const errorData = await response.json();
|
||||
console.error("Failed to delete page:", errorData);
|
||||
toast({ description: `Error: ${errorData.message}` });
|
||||
}
|
||||
setLoading(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<section id="logs-page" className="wrapper container">
|
||||
<section id="create-page" className="py-16">
|
||||
|
@ -119,6 +136,14 @@ const AdminLogPage = () => {
|
|||
>
|
||||
Edit
|
||||
</Button>
|
||||
<Button
|
||||
variant={"destructive"}
|
||||
onClick={() => deletePage(page.slug)}
|
||||
className="ml-2"
|
||||
disabled={loading}
|
||||
>
|
||||
Delete
|
||||
</Button>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
))}
|
||||
|
@ -129,4 +154,4 @@ const AdminLogPage = () => {
|
|||
);
|
||||
};
|
||||
|
||||
export default AdminLogPage;
|
||||
export default MultiLogs;
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
"use client";
|
||||
import React, { useEffect, useState } from "react";
|
||||
import { useRouter } from "next/router";
|
||||
import ReactMarkdown from "react-markdown";
|
||||
|
||||
const Page = ({ params }: { params: { slug: string } }) => {
|
||||
|
|
|
@ -1,17 +1,20 @@
|
|||
import { NextRequest, NextResponse } from "next/server";
|
||||
import clientPromise from "@/lib/db";
|
||||
|
||||
export const GET = async (req: NextRequest) => {
|
||||
export const GET = async (
|
||||
req: NextRequest,
|
||||
{ params }: { params: { slug: string } }
|
||||
) => {
|
||||
const client = await clientPromise;
|
||||
const db = client.db();
|
||||
const { searchParams } = new URL(req.url);
|
||||
const slug = searchParams.get("slug");
|
||||
const { slug } = params;
|
||||
|
||||
if (!slug) {
|
||||
return NextResponse.json({ message: "Slug is required" }, { status: 400 });
|
||||
}
|
||||
|
||||
const page = await db.collection("pages").findOne({ slug });
|
||||
|
||||
if (page) {
|
||||
return NextResponse.json(page, { status: 200 });
|
||||
} else {
|
||||
|
@ -19,29 +22,106 @@ export const GET = async (req: NextRequest) => {
|
|||
}
|
||||
};
|
||||
|
||||
export const PUT = async (req: NextRequest) => {
|
||||
export const PUT = async (
|
||||
req: NextRequest,
|
||||
{ params }: { params: { slug: string } }
|
||||
) => {
|
||||
const client = await clientPromise;
|
||||
const db = client.db();
|
||||
const { searchParams } = new URL(req.url);
|
||||
const slug = searchParams.get("slug");
|
||||
const { title, content } = await req.json();
|
||||
const { slug } = params;
|
||||
|
||||
if (!slug) {
|
||||
return NextResponse.json({ message: "Slug is required" }, { status: 400 });
|
||||
}
|
||||
|
||||
const result = await db
|
||||
.collection("pages")
|
||||
.findOneAndUpdate(
|
||||
{ slug },
|
||||
{ $set: { title, content } },
|
||||
{ returnDocument: "after" }
|
||||
);
|
||||
const { title, content } = await req.json();
|
||||
|
||||
if (result && result.value) {
|
||||
const page = result.value;
|
||||
return NextResponse.json(page, { status: 200 });
|
||||
} else {
|
||||
return NextResponse.json({ message: "Page not found" }, { status: 404 });
|
||||
if (typeof title !== "string" || typeof content !== "string") {
|
||||
return NextResponse.json(
|
||||
{ message: "Invalid title or content" },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
// it works here ig
|
||||
const result = await db
|
||||
.collection("pages")
|
||||
.findOneAndUpdate(
|
||||
{ slug },
|
||||
{ $set: { title, content } },
|
||||
{ returnDocument: "after" }
|
||||
);
|
||||
|
||||
// i hate my life fr fr
|
||||
console.log("Update Result:", result);
|
||||
// result returns like
|
||||
|
||||
// Update Result: {
|
||||
// _id: new ObjectId('66a2946b2b91eef505eef943'),
|
||||
// title: 'TEST PAGE',
|
||||
// slug: 'test-page',
|
||||
// content: 'asd]---\n' +
|
||||
// '---\n' +
|
||||
// '\n' +
|
||||
// 'this is basic heading ?\n' +
|
||||
// '\n' +
|
||||
// '**HELLO**\n' +
|
||||
// '\n' +
|
||||
// 'erw\n' +
|
||||
// '\n' +
|
||||
// 'trying another time for test'
|
||||
// }
|
||||
|
||||
// ERRROR : TypeError: Cannot read properties of undefined (reading '_id')
|
||||
// aposdjaoi sdio JUST WORK NIAWWWWWWWWW
|
||||
|
||||
// if (result && result.value) {
|
||||
const serializedResult = {
|
||||
...result?.value,
|
||||
_id: result?.value._id.toString(), // Convert ObjectId to string
|
||||
};
|
||||
return NextResponse.json(result?.value.content, { status: 200 });
|
||||
// } else {
|
||||
// return NextResponse.json({ message: "Page not found" }, { status: 404 });
|
||||
// }
|
||||
} catch (error) {
|
||||
console.error("Error updating page:", error);
|
||||
return NextResponse.json(
|
||||
{ message: "Failed to update page" },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export const DELETE = async (
|
||||
req: NextRequest,
|
||||
{ params }: { params: { slug: string } }
|
||||
) => {
|
||||
const client = await clientPromise;
|
||||
const db = client.db();
|
||||
const { slug } = params;
|
||||
|
||||
if (!slug) {
|
||||
return NextResponse.json({ message: "Slug is required" }, { status: 400 });
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await db.collection("pages").deleteOne({ slug });
|
||||
|
||||
if (result.deletedCount > 0) {
|
||||
return NextResponse.json(
|
||||
{ message: "Page deleted successfully" },
|
||||
{ status: 200 }
|
||||
);
|
||||
} else {
|
||||
return NextResponse.json({ message: "Page not found" }, { status: 404 });
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error deleting page:", error);
|
||||
return NextResponse.json(
|
||||
{ message: "Failed to delete page" },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,11 +1,20 @@
|
|||
import { NextRequest, NextResponse } from "next/server";
|
||||
import clientPromise from "@/lib/db";
|
||||
|
||||
export const GET = async () => {
|
||||
export const GET = async (req: NextRequest) => {
|
||||
const client = await clientPromise;
|
||||
const db = client.db();
|
||||
const pages = await db.collection("pages").find().toArray();
|
||||
return NextResponse.json(pages, { status: 200 });
|
||||
|
||||
try {
|
||||
const pages = await db.collection("pages").find().toArray();
|
||||
return NextResponse.json(pages, { status: 200 });
|
||||
} catch (error) {
|
||||
console.error("Error fetching pages:", error);
|
||||
return NextResponse.json(
|
||||
{ message: "Failed to fetch pages" },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export const POST = async (req: NextRequest) => {
|
||||
|
@ -13,9 +22,9 @@ export const POST = async (req: NextRequest) => {
|
|||
const db = client.db();
|
||||
const { title, slug, content } = await req.json();
|
||||
|
||||
if (!title || !slug || typeof content !== "string") {
|
||||
if (!title || !slug || !content) {
|
||||
return NextResponse.json(
|
||||
{ message: "Missing required fields or invalid data" },
|
||||
{ message: "Missing required fields" },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
@ -23,7 +32,6 @@ export const POST = async (req: NextRequest) => {
|
|||
try {
|
||||
const newPage = { title, slug, content };
|
||||
const result = await db.collection("pages").insertOne(newPage);
|
||||
|
||||
return NextResponse.json(newPage, { status: 201 });
|
||||
} catch (error) {
|
||||
console.error("Error creating page:", error);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { BadgeAlert, BarChart4, Cog, ShieldCheck } from "lucide-react";
|
||||
import { BadgeAlert, BarChart4, Cog, File, ShieldCheck } from "lucide-react";
|
||||
import { Download, Home, Settings, User } from "lucide-react";
|
||||
|
||||
export const NAVBAR = {
|
||||
|
@ -169,6 +169,11 @@ export const AdminLinks = [
|
|||
url: "/admin/changelogs",
|
||||
icon: Settings,
|
||||
},
|
||||
{
|
||||
name: "MultiLogs",
|
||||
url: "/admin/multi-logs",
|
||||
icon: File,
|
||||
},
|
||||
{
|
||||
name: "Back Home",
|
||||
url: "/",
|
||||
|
|
|
@ -3,17 +3,26 @@ import type { NextRequest } from "next/server";
|
|||
import { getToken } from "next-auth/jwt";
|
||||
|
||||
export async function middleware(req: NextRequest) {
|
||||
const token = await getToken({ req, secret: process.env.NEXTAUTH_SECRET });
|
||||
const token = await getToken({ req, secret: process.env.NEXTAUTH_SECRET });
|
||||
|
||||
if (req.nextUrl.pathname.startsWith("/admin") && !token) {
|
||||
const url = req.nextUrl.clone();
|
||||
url.pathname = "/login";
|
||||
return NextResponse.redirect(url);
|
||||
}
|
||||
if (req.nextUrl.pathname.startsWith("/admin") && !token) {
|
||||
const url = req.nextUrl.clone();
|
||||
url.pathname = "/login";
|
||||
return NextResponse.redirect(url);
|
||||
}
|
||||
|
||||
return NextResponse.next();
|
||||
return NextResponse.next();
|
||||
}
|
||||
|
||||
export const config = {
|
||||
matcher: ["/admin/:path*"],
|
||||
matcher: [
|
||||
"/admin/:path*",
|
||||
"/api/delete/downloads/[id]",
|
||||
"/api/delete/logs/[id]",
|
||||
"/api/delete/mods/[id]",
|
||||
"/api/upload",
|
||||
"/api/uploadlogs",
|
||||
"/api/uploadmods",
|
||||
"/api/uploadthing",
|
||||
],
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue