| 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 { |
| |
| 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"); |
| } |
|
|
| |
| 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) { |
| |
| 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 }); |
| } |
|
|
| |
| 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 }); |
|
|
| |
| await collections.settings.updateMany( |
| { |
| tools: { $in: [tool._id.toString()] }, |
| }, |
| { |
| $pull: { tools: tool._id.toString() }, |
| } |
| ); |
|
|
| |
| await collections.assistants.updateMany( |
| { |
| tools: { $in: [tool._id.toString()] }, |
| }, |
| { |
| $pull: { tools: tool._id.toString() }, |
| } |
| ); |
|
|
| return new Response("Tool deleted", { status: 200 }); |
| } |
|
|