i choose to commit my life

This commit is contained in:
Cypro Freelance 2024-07-26 01:39:06 +05:30
parent 8c5e7c44bf
commit b5c4ca32ed
7 changed files with 165 additions and 39 deletions

View file

@ -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 (

View file

@ -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;

View file

@ -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 } }) => {

View file

@ -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 }
);
}
};

View file

@ -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);

View file

@ -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: "/",

View file

@ -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",
],
};