From 57311fab1e07f4bcdf97a444364adcdcf23084a8 Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Wed, 21 May 2025 08:39:43 +0100 Subject: [PATCH] refactor(api): filter api endpoints cleaned up, also added logging here --- .../guild/api/filter.controller.ts | 137 +++++++++--------- 1 file changed, 66 insertions(+), 71 deletions(-) diff --git a/src/server/controllers/guild/api/filter.controller.ts b/src/server/controllers/guild/api/filter.controller.ts index e727419..d578606 100644 --- a/src/server/controllers/guild/api/filter.controller.ts +++ b/src/server/controllers/guild/api/filter.controller.ts @@ -1,9 +1,14 @@ import { Request, Response } from "express"; import prisma, { Prisma } from "@server/prisma"; import { datatableRequest } from "@server/controllers/guild/api/dt.module"; +import { getLogger } from "@server/../log"; + +const logger = getLogger(__filename); // TODO: this doesn't account for guild ID or permissions export const get = async (request: Request, response: Response) => { + logger.info(`Getting filter: ${request.query.id}`); + if (!request.query.id) { response.status(400).json({ error: "missing 'id' query" }); return; @@ -22,90 +27,83 @@ export const get = async (request: Request, response: Response) => { }; export const post = async (request: Request, response: Response) => { - const guildId = request.params.guildId; - const { name, value, matching_algorithm, is_insensitive, is_whitelist } = request.body; + logger.info(`Posting filter: ${request.body.value} - ${request.params.guildId}`); - let filter; + const body = { + ...request.body, + is_insensitive: request.body.is_insensitive === "on", + is_whitelist: request.body.is_whitelist === "on" + }; + + const createInputData: Prisma.FilterUncheckedCreateInput = { + guild_id: body.guild_id, + name: body.name, + value: body.value, + matching_algorithm: body.matching_algorithm, + is_insensitive: body.is_insensitive, + is_whitelist: body.is_whitelist + }; try { - filter = await prisma.filter.create({ - data: { - name: name, - guild_id: guildId, - value: value, - matching_algorithm: matching_algorithm, - is_insensitive: is_insensitive === "on", - is_whitelist: is_whitelist === "on" - } - }); + const createResponse = await prisma.filter.create({ data: createInputData }); + response.status(201).json(createResponse); + } catch (error) { + logger.error(error); + const isPrismaError = error instanceof Prisma.PrismaClientKnownRequestError; + response.status(500).json({ error: isPrismaError ? error.message : error }); } - catch (error) { - console.error(error); - if (error instanceof Prisma.PrismaClientKnownRequestError) { - response.status(500).json({ error: error.message }); - return; - } - } - - response.status(201).json(filter); }; export const patch = async (request: Request, response: Response) => { - const guildId = request.params.guildId; - const { id, name, value, matching_algorithm, is_insensitive, is_whitelist } = request.body; + logger.info(`Patching filter: ${request.body.id} - ${request.params.guild_id}`); - let filter; + const body = { + ...request.body, + is_insensitive: request.body.is_insensitive === "on", + is_whitelist: request.body.is_whitelist === "on" + }; + + const updateInputData: Prisma.FilterUncheckedUpdateInput = { + id: Number(body.id), + guild_id: body.guild_id, + name: body.name, + value: body.value, + matching_algorithm: body.matching_algorithm, + is_insensitive: body.is_insensitive, + is_whitelist: body.is_whitelist + }; try { - filter = await prisma.filter.update({ - where: { id: Number(id) }, - data: { - name: name, - guild_id: guildId, - value: value, - matching_algorithm: matching_algorithm, - is_insensitive: is_insensitive === "on", - is_whitelist: is_whitelist === "on" - } - }); + const updateArgs = { where: { id: Number(body.id) }, data: updateInputData }; + const updateResponse = await prisma.filter.update(updateArgs); + response.status(200).json(updateResponse); + } catch (error) { + logger.error(error); + const isPrismaError = error instanceof Prisma.PrismaClientKnownRequestError; + response.status(500).json({ error: isPrismaError ? error.message : error }); } - catch (error) { - console.error(error); - if (error instanceof Prisma.PrismaClientKnownRequestError) { - response.status(500).json({ error: error.message }); - return; - } - } - - response.status(201).json(filter); -}; +} export const del = async (request: Request, response: Response) => { - let { ids } = request.body; - const guildId = request.params.guildId; + logger.info(`Deleting filter(s): ${request.body.ids} - ${request.params.guildId}`); - if (!ids || !Array.isArray(ids)) { - response.status(400).json({ error: "invalid request body" }); + const ids = request.body.ids?.map((id: string) => Number(id)); + + if (!ids) { + response.status(400).json({ error: "Couldn't parse ID's from request body" }); return; } - ids = ids.map(id => Number(id)); - try { - await prisma.filter.deleteMany({ where: { - id: { in: ids }, - guild_id: guildId - }}); - } - catch (error) { - console.error(error); - if (error instanceof Prisma.PrismaClientKnownRequestError) { - response.status(500).json({ error: error.message }); - return; - } - } + const deleteArgs = { where: { guild_id: request.params.guildId, id: { in: ids } } }; + await prisma.feed.deleteMany(deleteArgs); + response.status(204).send(); + } catch (error) { + logger.error(error); + const isPrismaError = error instanceof Prisma.PrismaClientKnownRequestError; + response.status(500).json({ error: isPrismaError ? error.message : error }); - response.status(204).json(null); + } }; export const datatable = async (request: Request, response: Response) => { @@ -120,13 +118,10 @@ export const datatable = async (request: Request, response: Response) => { }; export const select = async (request: Request, response: Response) => { - const guildId = request.params.guildId; - const { search } = request.query; - const data = await prisma.filter.findMany({ where: { - guild_id: guildId, - name: { contains: `${search}` } + guild_id: request.params.guildId, + name: { contains: `${request.query.search}` } } }); @@ -139,7 +134,7 @@ export const select = async (request: Request, response: Response) => { title: filter.name })); - response.json(modifiedResults); + response.status(200).json(modifiedResults); }; export default { get, post, patch, del, datatable, select }; \ No newline at end of file