relay/src/server/controllers/guild/api/feed.controller.ts
Corban-Lee 65aeef1988
Some checks failed
Build & Push Docker Image / build (push) Successful in 23s
Test & Build / build (push) Has been cancelled
remove id from update data
2025-05-22 11:07:16 +01:00

139 lines
4.8 KiB
TypeScript

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);
export const get = async (request: Request, response: Response) => {
logger.info(`Getting feed: ${request.query.id}`);
if (!request.query.id) {
response.status(400).json({ error: "Missing 'id' query" });
return;
}
const feed = await prisma.feed.findUnique({
where: { id: Number(request.query.id) },
include: { channels: true, filters: true }
});
if (!feed) {
response.status(404).json({ message: "No result found" });
return;
}
response.json(feed);
};
const unpackChannels = (channels: string[] | string | undefined) => {
if (channels === undefined) return channels;
return Array.isArray(channels)
? channels.map(channelId => ({ channel_id: channelId }))
: [{ channel_id: channels }];
};
const unpackFilters = (filters: string[] | string | undefined) => {
if (filters === undefined) return filters;
return Array.isArray(filters)
? filters.map(filterId => ({ id: Number(filterId) }))
: [{ id: Number(filters) }]
};
export const post = async (request: Request, response: Response) => {
logger.info(`Posting feed: ${request.body.url} - ${request.params.guildId}`);
const body = {
...request.body,
active: request.body.active === "on",
message_style: Number(request.body.message_style) || null,
published_threshold: new Date(request.body.published_threshold)
};
const createInputData: Prisma.FeedUncheckedCreateInput = {
guild_id: request.params.guildId,
name: body.name,
url: body.url,
active: body.active,
channels: { create: unpackChannels(body.channels) },
filters: { connect: unpackFilters(body.filters) },
message_style_id: body.message_style,
published_threshold: body.published_threshold
};
try {
const createResponse = await prisma.feed.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 });
}
};
export const patch = async (request: Request, response: Response) => {
logger.info(`Patching feed: ${request.body.id} - ${request.params.guildId}`);
const body = {
...request.body,
active: request.body.active === "on",
message_style: Number(request.body.message_style) || null,
published_threshold: new Date(request.body.published_threshold)
};
const updateInputData: Prisma.FeedUncheckedUpdateInput = {
name: body.name,
url: body.url,
active: body.active,
channels: { deleteMany: {}, create: unpackChannels(body.channels) },
filters: { set: [], connect: unpackFilters(body.filters) },
message_style_id: body.message_style,
published_threshold: body.published_threshold
};
try {
const updateArgs = { where: { id: Number(body.id) }, data: updateInputData };
const updateResponse = await prisma.feed.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 });
}
};
export const del = async (request: Request, response: Response) => {
logger.info(`Deleting feed(s): ${request.body.ids} - ${request.params.guildId}`);
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;
}
try {
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 });
}
};
export const datatable = async (request: Request, response: Response) => {
return await datatableRequest(
request,
response,
prisma.feed,
[{ updated_at: "desc" }, { id: "asc" }],
{ channels: true, filters: true, message_style: true },
{ guild_id: request.params.guildId } // TODO: verify authenticated user can access this guild
);
};
export default { get, post, patch, del, datatable };