nsarrazin's picture
nsarrazin HF Staff
feat(api): use api for tools & assistants (#1707)
2e4269d unverified
import { env } from "$env/dynamic/private";
import { collections } from "$lib/server/database.js";
import { toolFromConfigs } from "$lib/server/tools/index.js";
import { ReviewStatus } from "$lib/types/Review";
import type { CommunityToolDB } from "$lib/types/Tool.js";
import { ObjectId } from "mongodb";
import { editableToolSchema } from "$lib/server/tools/index.js";
import { generateSearchTokens } from "$lib/utils/searchTokens.js";
import { error } from "@sveltejs/kit";
import { requiresUser } from "$lib/server/auth";
export async function GET({ params }) {
if (env.COMMUNITY_TOOLS !== "true") {
return new Response("Community tools are not enabled", { status: 403 });
}
const toolId = params.toolId;
try {
const configTool = toolFromConfigs.find((el) => el._id.toString() === toolId);
if (configTool) {
return Response.json({
_id: toolId,
displayName: configTool.displayName,
color: configTool.color,
icon: configTool.icon,
createdByName: undefined,
});
} else {
// try community tools
const tool = await collections.tools
.findOne<CommunityToolDB>({ _id: new ObjectId(toolId) })
.then((tool) =>
tool
? {
_id: tool._id.toString(),
displayName: tool.displayName,
color: tool.color,
icon: tool.icon,
createdByName: tool.createdByName,
review: tool.review,
}
: undefined
);
if (!tool || tool.review !== ReviewStatus.APPROVED) {
return new Response(`Tool "${toolId}" not found`, { status: 404 });
}
return Response.json(tool);
}
} catch (e) {
return new Response(`Tool "${toolId}" not found`, { status: 404 });
}
}
export async function PATCH({ request, params, locals }) {
const tool = await collections.tools.findOne({
_id: new ObjectId(params.toolId),
});
if (!tool) {
error(404, "Tool not found");
}
if (tool.createdById.toString() !== (locals.user?._id ?? locals.sessionId).toString()) {
error(403, "You are not the creator of this tool");
}
// can only create tools when logged in, IF login is setup
if (!locals.user && requiresUser) {
const errors = [{ field: "description", message: "Must be logged in. Unauthorized" }];
return new Response(JSON.stringify({ error: true, errors }), { status: 400 });
}
const body = await request.json();
const parse = editableToolSchema.safeParse(body);
if (!parse.success) {
// Loop through the errors array and create a custom errors array
const errors = parse.error.errors.map((error) => {
return {
field: error.path[0],
message: error.message,
};
});
return new Response(JSON.stringify({ error: true, errors }), { status: 400 });
}
// modify the tool
await collections.tools.updateOne(
{ _id: tool._id },
{
$set: {
...parse.data,
updatedAt: new Date(),
searchTokens: generateSearchTokens(parse.data.displayName),
},
}
);
return new Response(JSON.stringify({ toolId: tool._id.toString() }), { status: 200 });
}
export async function DELETE({ params, locals }) {
const tool = await collections.tools.findOne({ _id: new ObjectId(params.toolId) });
if (!tool) {
return new Response("Tool not found", { status: 404 });
}
if (
tool.createdById.toString() !== (locals.user?._id ?? locals.sessionId).toString() &&
!locals.user?.isAdmin
) {
return new Response("You are not the creator of this tool", { status: 403 });
}
await collections.tools.deleteOne({ _id: tool._id });
// Remove the tool from all users' settings
await collections.settings.updateMany(
{
tools: { $in: [tool._id.toString()] },
},
{
$pull: { tools: tool._id.toString() },
}
);
// Remove the tool from all assistants
await collections.assistants.updateMany(
{
tools: { $in: [tool._id.toString()] },
},
{
$pull: { tools: tool._id.toString() },
}
);
return new Response("Tool deleted", { status: 200 });
}