feat: 支持文章系列关联的 API 接口
continuous-integration/drone/push Build is passing

This commit is contained in:
seahi committed 2026-09-27 20:25:43 +08:00
1 parent d1abc1657d
commit 8d949f3e37
2 files changed
+39 -8

No files matched your search

+16 -5
View File
@@ -12,9 +12,10 @@ export const GET: RequestHandler = async ({ platform, url }) => {
const { results } = await db const { results } = await db
.prepare( .prepare(
` `
SELECT p.id, p.slug, p.title, p.published_at, p.updated_at, c.slug as category_slug, c.name as category_name SELECT p.id, p.slug, p.title, p.published_at, p.updated_at, c.slug as category_slug, c.name as category_name, s.slug as series_slug, s.name as series_name
FROM posts p FROM posts p
LEFT JOIN categories c ON p.category_id = c.id LEFT JOIN categories c ON p.category_id = c.id
LEFT JOIN series s ON p.series_id = s.id
ORDER BY p.published_at DESC ORDER BY p.published_at DESC
LIMIT ? OFFSET ? LIMIT ? OFFSET ?
` `
@@ -45,11 +46,12 @@ export const POST: RequestHandler = async ({ request, platform }) => {
try { try {
const data = (await request.json()) as Record<string, unknown>; const data = (await request.json()) as Record<string, unknown>;
const { slug, title, content, category_slug, tags } = data as { const { slug, title, content, category_slug, series_slug, tags } = data as {
slug?: string; slug?: string;
title?: string; title?: string;
content?: string; content?: string;
category_slug?: string; category_slug?: string;
series_slug?: string;
tags?: string[]; tags?: string[];
}; };
@@ -69,14 +71,23 @@ export const POST: RequestHandler = async ({ request, platform }) => {
if (catResult) categoryId = catResult.id; if (catResult) categoryId = catResult.id;
} }
let seriesId = null;
if (series_slug) {
const seriesResult = await db
.prepare('SELECT id FROM series WHERE slug = ?')
.bind(series_slug)
.first<{ id: number }>();
if (seriesResult) seriesId = seriesResult.id;
}
const result = await db const result = await db
.prepare( .prepare(
` `
INSERT INTO posts (slug, title, content, author_id, category_id, published_at, updated_at) INSERT INTO posts (slug, title, content, author_id, category_id, series_id, published_at, updated_at)
VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
` `
) )
.bind(slug, title, content, authorId, categoryId) .bind(slug, title, content, authorId, categoryId, seriesId)
.run(); .run();
if (result.success) { if (result.success) {
+23 -3
View File
@@ -11,9 +11,10 @@ export const GET: RequestHandler = async ({ params, platform }) => {
const post = await db const post = await db
.prepare( .prepare(
` `
SELECT p.id, p.slug, p.title, p.content, p.published_at, p.updated_at, c.slug as category_slug, c.name as category_name SELECT p.id, p.slug, p.title, p.content, p.published_at, p.updated_at, c.slug as category_slug, c.name as category_name, s.slug as series_slug, s.name as series_name
FROM posts p FROM posts p
LEFT JOIN categories c ON p.category_id = c.id LEFT JOIN categories c ON p.category_id = c.id
LEFT JOIN series s ON p.series_id = s.id
WHERE p.slug = ? WHERE p.slug = ?
` `
) )
@@ -53,14 +54,21 @@ export const PUT: RequestHandler = async ({ params, request, platform }) => {
try { try {
const data = (await request.json()) as Record<string, unknown>; const data = (await request.json()) as Record<string, unknown>;
const { title, content, category_slug, tags } = data as { const { title, content, category_slug, series_slug, tags } = data as {
title?: string; title?: string;
content?: string; content?: string;
category_slug?: string; category_slug?: string;
series_slug?: string;
tags?: string[]; tags?: string[];
}; };
if (!title && !content && category_slug === undefined && tags === undefined) { if (
!title &&
!content &&
category_slug === undefined &&
series_slug === undefined &&
tags === undefined
) {
return json({ error: 'No fields to update' }, { status: 400 }); return json({ error: 'No fields to update' }, { status: 400 });
} }
@@ -96,6 +104,18 @@ export const PUT: RequestHandler = async ({ params, request, platform }) => {
updates.push('category_id = ?'); updates.push('category_id = ?');
bindings.push(categoryId); bindings.push(categoryId);
} }
if (series_slug !== undefined) {
let seriesId = null;
if (series_slug) {
const seriesResult = await db
.prepare('SELECT id FROM series WHERE slug = ?')
.bind(series_slug)
.first<{ id: number }>();
if (seriesResult) seriesId = seriesResult.id;
}
updates.push('series_id = ?');
bindings.push(seriesId);
}
updates.push('updated_at = CURRENT_TIMESTAMP'); updates.push('updated_at = CURRENT_TIMESTAMP');
bindings.push(slug); // for WHERE clause bindings.push(slug); // for WHERE clause