82 lines
2.3 KiB
TypeScript
82 lines
2.3 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { db } from "@/lib/db";
|
|
import { requireApiAdmin } from "@/lib/apiAuth";
|
|
|
|
function summarize(description: string) {
|
|
if (description.length <= 100) return description;
|
|
return `${description.slice(0, 100)}...`;
|
|
}
|
|
|
|
function parseNewsTime(value: unknown) {
|
|
if (typeof value !== "string" && typeof value !== "number") return null;
|
|
const date = new Date(value);
|
|
return Number.isNaN(date.getTime()) ? null : date;
|
|
}
|
|
|
|
export async function GET(req: NextRequest) {
|
|
const mode = req.headers.get("x-news-mode")?.toLowerCase();
|
|
const summaryHeader = req.headers.get("x-news-summary")?.toLowerCase();
|
|
const latestSummary = mode === "latest" || summaryHeader === "true";
|
|
|
|
const news = await db.fantasyNews.findMany({
|
|
orderBy: [{ newsTime: "desc" }, { createdAt: "desc" }],
|
|
take: latestSummary ? 4 : undefined,
|
|
});
|
|
|
|
return NextResponse.json({
|
|
data: news.map((item) => ({
|
|
id: item.id,
|
|
icon: item.icon,
|
|
title: item.title,
|
|
description: latestSummary ? summarize(item.description) : item.description,
|
|
newsTime: item.newsTime.toISOString(),
|
|
createdAt: item.createdAt.toISOString(),
|
|
updatedAt: item.updatedAt.toISOString(),
|
|
})),
|
|
});
|
|
}
|
|
|
|
export async function POST(req: NextRequest) {
|
|
const admin = await requireApiAdmin(req);
|
|
if (!admin) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
|
|
const { icon, title, description, newsTime } = await req.json().catch(() => ({}));
|
|
const parsedNewsTime = parseNewsTime(newsTime);
|
|
|
|
if (
|
|
typeof icon !== "string" ||
|
|
!icon.trim() ||
|
|
typeof title !== "string" ||
|
|
!title.trim() ||
|
|
typeof description !== "string" ||
|
|
!description.trim() ||
|
|
!parsedNewsTime
|
|
) {
|
|
return NextResponse.json(
|
|
{ error: "icon، title، description و newsTime معتبر الزامی هستند" },
|
|
{ status: 400 },
|
|
);
|
|
}
|
|
|
|
const item = await db.fantasyNews.create({
|
|
data: {
|
|
icon: icon.trim(),
|
|
title: title.trim(),
|
|
description: description.trim(),
|
|
newsTime: parsedNewsTime,
|
|
},
|
|
});
|
|
|
|
return NextResponse.json(
|
|
{
|
|
id: item.id,
|
|
icon: item.icon,
|
|
title: item.title,
|
|
description: item.description,
|
|
newsTime: item.newsTime.toISOString(),
|
|
createdAt: item.createdAt.toISOString(),
|
|
},
|
|
{ status: 201 },
|
|
);
|
|
}
|