18e915bcbb
- 文章管理:计数请求补 page=1 参数,命中分页接口返回正确的 total - 分类管理:编辑模式新增描述输入框,保存时一并提交 description - CSP:img-src 加入 https: 允许加载外部图片 - 关于页:数据存储描述从 JSON 文件更正为 SQLite 数据库 - Footer:添加 ICP 备案号
46 lines
1.8 KiB
TypeScript
46 lines
1.8 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { getPosts, getPostsPaginated, createPost, deletePost } from "@/lib/store";
|
|
import { requireAuth, parseBody } from "@/lib/http";
|
|
import { createPostSchema } from "@/lib/validation";
|
|
|
|
export async function GET(request: NextRequest) {
|
|
const deny = await requireAuth();
|
|
if (deny) return deny;
|
|
|
|
const { searchParams } = new URL(request.url);
|
|
|
|
// 如果有分页参数,使用分页查询
|
|
if (searchParams.has("page") || searchParams.has("search") || searchParams.has("status") || searchParams.has("sortBy")) {
|
|
const result = await getPostsPaginated({
|
|
page: Number(searchParams.get("page")) || 1,
|
|
pageSize: Number(searchParams.get("pageSize")) || 20,
|
|
status: searchParams.get("status") as "draft" | "published" | undefined,
|
|
search: searchParams.get("search") || undefined,
|
|
sortBy: (searchParams.get("sortBy") as "date" | "createdAt" | "title" | "readingTime") || "createdAt",
|
|
sortDir: (searchParams.get("sortDir") as "asc" | "desc") || "desc",
|
|
});
|
|
return NextResponse.json(result);
|
|
}
|
|
|
|
// 兼容旧接口:无参数时返回全量
|
|
return NextResponse.json(await getPosts());
|
|
}
|
|
|
|
export async function POST(request: NextRequest) {
|
|
const deny = await requireAuth();
|
|
if (deny) return deny;
|
|
const parsed = await parseBody(request, createPostSchema);
|
|
if (!parsed.ok) return parsed.response;
|
|
const post = await createPost(parsed.data);
|
|
return NextResponse.json(post, { status: 201 });
|
|
}
|
|
|
|
export async function DELETE(request: NextRequest) {
|
|
const deny = await requireAuth();
|
|
if (deny) return deny;
|
|
const { searchParams } = new URL(request.url);
|
|
const id = searchParams.get("id");
|
|
if (!id) return NextResponse.json({ error: "缺少 id" }, { status: 400 });
|
|
return NextResponse.json({ ok: await deletePost(id) });
|
|
}
|