claude-code-cchui/src/app/api/assistants/[id]/favorite/route.ts
gaoziman 34aa3e50cf feat(API): 添加助手管理接口
- 新增助手 CRUD 接口 (GET/POST/PUT/DELETE)
- 新增助手分类查询接口
- 新增助手收藏/取消收藏接口
- 新增最近使用助手查询接口
- 支持按分类、搜索关键词筛选助手
2025-12-20 20:45:56 +08:00

107 lines
2.9 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { db } from '@/drizzle/db';
import { userFavoriteAssistants, assistants } from '@/drizzle/schema';
import { eq, and } from 'drizzle-orm';
interface RouteParams {
params: Promise<{ id: string }>;
}
// POST /api/assistants/[id]/favorite - 收藏助手
export async function POST(request: NextRequest, { params }: RouteParams) {
try {
const { id } = await params;
const assistantId = parseInt(id);
const body = await request.json();
const { userId } = body;
if (isNaN(assistantId)) {
return NextResponse.json({ error: 'Invalid assistant ID' }, { status: 400 });
}
if (!userId) {
return NextResponse.json({ error: 'User ID is required' }, { status: 400 });
}
// 检查助手是否存在
const [assistant] = await db
.select()
.from(assistants)
.where(eq(assistants.id, assistantId))
.limit(1);
if (!assistant) {
return NextResponse.json({ error: 'Assistant not found' }, { status: 404 });
}
// 检查是否已经收藏
const [existingFavorite] = await db
.select()
.from(userFavoriteAssistants)
.where(
and(
eq(userFavoriteAssistants.userId, userId),
eq(userFavoriteAssistants.assistantId, assistantId)
)
)
.limit(1);
if (existingFavorite) {
return NextResponse.json({ message: 'Already favorited' }, { status: 200 });
}
// 添加收藏
const [newFavorite] = await db
.insert(userFavoriteAssistants)
.values({
userId,
assistantId,
})
.returning();
return NextResponse.json(newFavorite, { status: 201 });
} catch (error) {
console.error('Failed to favorite assistant:', error);
return NextResponse.json(
{ error: 'Failed to favorite assistant' },
{ status: 500 }
);
}
}
// DELETE /api/assistants/[id]/favorite - 取消收藏
export async function DELETE(request: NextRequest, { params }: RouteParams) {
try {
const { id } = await params;
const assistantId = parseInt(id);
const searchParams = request.nextUrl.searchParams;
const userId = searchParams.get('userId');
if (isNaN(assistantId)) {
return NextResponse.json({ error: 'Invalid assistant ID' }, { status: 400 });
}
if (!userId) {
return NextResponse.json({ error: 'User ID is required' }, { status: 400 });
}
// 删除收藏记录
await db
.delete(userFavoriteAssistants)
.where(
and(
eq(userFavoriteAssistants.userId, userId),
eq(userFavoriteAssistants.assistantId, assistantId)
)
);
return NextResponse.json({ success: true });
} catch (error) {
console.error('Failed to unfavorite assistant:', error);
return NextResponse.json(
{ error: 'Failed to unfavorite assistant' },
{ status: 500 }
);
}
}