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">
|
<nav className="sidebar-nav">
|
||||||
<ul className="sidebar-nav_elements">
|
<ul className="sidebar-nav_elements">
|
||||||
{AdminLinks.slice(0, 4).map((link) => {
|
{AdminLinks.slice(0, 5).map((link) => {
|
||||||
const isActive = link.url === pathname;
|
const isActive = link.url === pathname;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -37,7 +37,7 @@ const Sidebar = () => {
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<ul className="sidebar-nav_elements">
|
<ul className="sidebar-nav_elements">
|
||||||
{AdminLinks.slice(4).map((link) => {
|
{AdminLinks.slice(5).map((link) => {
|
||||||
const isActive = link.url === pathname;
|
const isActive = link.url === pathname;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -26,7 +26,7 @@ interface PageEntry {
|
||||||
content: string;
|
content: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const AdminLogPage = () => {
|
const MultiLogs = () => {
|
||||||
const [pages, setPages] = useState<PageEntry[]>([]);
|
const [pages, setPages] = useState<PageEntry[]>([]);
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
@ -64,6 +64,23 @@ const AdminLogPage = () => {
|
||||||
setLoading(false);
|
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 (
|
return (
|
||||||
<section id="logs-page" className="wrapper container">
|
<section id="logs-page" className="wrapper container">
|
||||||
<section id="create-page" className="py-16">
|
<section id="create-page" className="py-16">
|
||||||
|
@ -119,6 +136,14 @@ const AdminLogPage = () => {
|
||||||
>
|
>
|
||||||
Edit
|
Edit
|
||||||
</Button>
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant={"destructive"}
|
||||||
|
onClick={() => deletePage(page.slug)}
|
||||||
|
className="ml-2"
|
||||||
|
disabled={loading}
|
||||||
|
>
|
||||||
|
Delete
|
||||||
|
</Button>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
))}
|
))}
|
||||||
|
@ -129,4 +154,4 @@ const AdminLogPage = () => {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default AdminLogPage;
|
export default MultiLogs;
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
"use client";
|
"use client";
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import { useRouter } from "next/router";
|
|
||||||
import ReactMarkdown from "react-markdown";
|
import ReactMarkdown from "react-markdown";
|
||||||
|
|
||||||
const Page = ({ params }: { params: { slug: string } }) => {
|
const Page = ({ params }: { params: { slug: string } }) => {
|
||||||
|
|
|
@ -1,17 +1,20 @@
|
||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
import clientPromise from "@/lib/db";
|
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 client = await clientPromise;
|
||||||
const db = client.db();
|
const db = client.db();
|
||||||
const { searchParams } = new URL(req.url);
|
const { slug } = params;
|
||||||
const slug = searchParams.get("slug");
|
|
||||||
|
|
||||||
if (!slug) {
|
if (!slug) {
|
||||||
return NextResponse.json({ message: "Slug is required" }, { status: 400 });
|
return NextResponse.json({ message: "Slug is required" }, { status: 400 });
|
||||||
}
|
}
|
||||||
|
|
||||||
const page = await db.collection("pages").findOne({ slug });
|
const page = await db.collection("pages").findOne({ slug });
|
||||||
|
|
||||||
if (page) {
|
if (page) {
|
||||||
return NextResponse.json(page, { status: 200 });
|
return NextResponse.json(page, { status: 200 });
|
||||||
} else {
|
} 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 client = await clientPromise;
|
||||||
const db = client.db();
|
const db = client.db();
|
||||||
const { searchParams } = new URL(req.url);
|
const { slug } = params;
|
||||||
const slug = searchParams.get("slug");
|
|
||||||
const { title, content } = await req.json();
|
|
||||||
|
|
||||||
if (!slug) {
|
if (!slug) {
|
||||||
return NextResponse.json({ message: "Slug is required" }, { status: 400 });
|
return NextResponse.json({ message: "Slug is required" }, { status: 400 });
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await db
|
const { title, content } = await req.json();
|
||||||
.collection("pages")
|
|
||||||
.findOneAndUpdate(
|
|
||||||
{ slug },
|
|
||||||
{ $set: { title, content } },
|
|
||||||
{ returnDocument: "after" }
|
|
||||||
);
|
|
||||||
|
|
||||||
if (result && result.value) {
|
if (typeof title !== "string" || typeof content !== "string") {
|
||||||
const page = result.value;
|
return NextResponse.json(
|
||||||
return NextResponse.json(page, { status: 200 });
|
{ message: "Invalid title or content" },
|
||||||
} else {
|
{ status: 400 }
|
||||||
return NextResponse.json({ message: "Page not found" }, { status: 404 });
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 { NextRequest, NextResponse } from "next/server";
|
||||||
import clientPromise from "@/lib/db";
|
import clientPromise from "@/lib/db";
|
||||||
|
|
||||||
export const GET = async () => {
|
export const GET = async (req: NextRequest) => {
|
||||||
const client = await clientPromise;
|
const client = await clientPromise;
|
||||||
const db = client.db();
|
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) => {
|
export const POST = async (req: NextRequest) => {
|
||||||
|
@ -13,9 +22,9 @@ export const POST = async (req: NextRequest) => {
|
||||||
const db = client.db();
|
const db = client.db();
|
||||||
const { title, slug, content } = await req.json();
|
const { title, slug, content } = await req.json();
|
||||||
|
|
||||||
if (!title || !slug || typeof content !== "string") {
|
if (!title || !slug || !content) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{ message: "Missing required fields or invalid data" },
|
{ message: "Missing required fields" },
|
||||||
{ status: 400 }
|
{ status: 400 }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -23,7 +32,6 @@ export const POST = async (req: NextRequest) => {
|
||||||
try {
|
try {
|
||||||
const newPage = { title, slug, content };
|
const newPage = { title, slug, content };
|
||||||
const result = await db.collection("pages").insertOne(newPage);
|
const result = await db.collection("pages").insertOne(newPage);
|
||||||
|
|
||||||
return NextResponse.json(newPage, { status: 201 });
|
return NextResponse.json(newPage, { status: 201 });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error creating page:", 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";
|
import { Download, Home, Settings, User } from "lucide-react";
|
||||||
|
|
||||||
export const NAVBAR = {
|
export const NAVBAR = {
|
||||||
|
@ -169,6 +169,11 @@ export const AdminLinks = [
|
||||||
url: "/admin/changelogs",
|
url: "/admin/changelogs",
|
||||||
icon: Settings,
|
icon: Settings,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "MultiLogs",
|
||||||
|
url: "/admin/multi-logs",
|
||||||
|
icon: File,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "Back Home",
|
name: "Back Home",
|
||||||
url: "/",
|
url: "/",
|
||||||
|
|
|
@ -3,17 +3,26 @@ import type { NextRequest } from "next/server";
|
||||||
import { getToken } from "next-auth/jwt";
|
import { getToken } from "next-auth/jwt";
|
||||||
|
|
||||||
export async function middleware(req: NextRequest) {
|
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) {
|
if (req.nextUrl.pathname.startsWith("/admin") && !token) {
|
||||||
const url = req.nextUrl.clone();
|
const url = req.nextUrl.clone();
|
||||||
url.pathname = "/login";
|
url.pathname = "/login";
|
||||||
return NextResponse.redirect(url);
|
return NextResponse.redirect(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NextResponse.next();
|
return NextResponse.next();
|
||||||
}
|
}
|
||||||
|
|
||||||
export const config = {
|
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