feat: exposed api routes for Feed objects

This commit is contained in:
Corban-Lee Jones 2025-04-23 12:13:14 +01:00
parent 7ff73fae28
commit 95124ec6e5
2 changed files with 145 additions and 0 deletions

View File

@ -0,0 +1,133 @@
import { Request, Response } from "express";
import prisma, { Prisma } from "@server/prisma";
export const get = async (request: Request, response: Response) => {
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 }
});
if (!feed) {
response.status(404).json({ message: "no result found" });
return;
}
response.json(feed);
};
export const post = async (request: Request, response: Response) => {
const guildId = request.params.guildId;
const { name, url, active, channels } = request.body;
let feed;
try {
feed = await prisma.feed.create({
data: {
name: name,
url: url,
guild_id: guildId,
active: active,
channels: channels
}
});
}
catch (error) {
console.error(error);
if (error instanceof Prisma.PrismaClientKnownRequestError) {
response.status(500).json({ error: error.message });
return;
}
}
response.status(201).json(feed);
};
export const patch = async () => {} // TODO ...
export const del = async (request: Request, response: Response) => {
const { ids } = request.body;
const guildId = request.params.guildId;
if (!ids || !Array.isArray(ids)) {
response.status(400).json({ error: "invalid request body" });
return;
}
try {
await prisma.feed.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;
}
}
response.status(204).json(null);
};
interface DataTableResponse {
data: any;
recordsFiltered: number;
recordsTotal: number;
}
interface DatatableQuery {
length: number;
start: number;
order: { column: string; dir: string }[];
columns: { [key: string]: { data: string; searchable: string }};
search: { value: string };
filters: { [key: string]: any };
}
export const datatable = async (request: Request, response: Response) => {
const query = request.query as unknown as DatatableQuery;
const size: number = query.length || 10;
const start: number = query.start;
const order: string = (query.order && query.columns[query.order[0].column].data) || "id";
const direction: string = (query.order && query.order[0].dir) || "asc";
const search: string = query.search.value;
let dbQuery: any = {};
// TODO: filter request
if (search) {
Object.values(query.columns)
.filter(column => column.searchable === "true")
.forEach((col: any) => {
dbQuery["where"][col.data] = {
contains: search,
mode: "insensitive"
}
}
);
}
const data = await prisma.feed.findMany({
...dbQuery,
skip: start,
take: size,
orderBy: { order: direction },
});
response.json(<DataTableResponse>{
data: data,
recordsFiltered: await prisma.feed.count(...dbQuery),
recordsTotal: await prisma.feed.count()
});
};
export default { get, post, patch, del, datatable };

View File

@ -5,6 +5,8 @@ import filterController from "@server/controllers/guild/filter.controller";
import styleController from "@server/controllers/guild/style.controller";
import contentController from "@server/controllers/guild/content.controller";
import feedApiController from "@server/controllers/guild/api/feed.controller";
const router = Router();
router.get("/:guildId", (request: Request, response: Response) => {
@ -13,9 +15,19 @@ router.get("/:guildId", (request: Request, response: Response) => {
return;
});
// Web routes
router.get("/:guildId/feeds", feedController.get);
router.get("/:guildId/filters", filterController.get);
router.get("/:guildId/styles", styleController.get);
router.get("/:guildId/content", contentController.get);
// API routes
router.get(":/guildId/feeds/api/datatable", feedApiController.datatable);
router.get(":/guildId/feeds/api", feedApiController.get);
router.post(":/guildId/feeds/api", feedApiController.post);
router.patch(":/guildId/feeds/api", feedApiController.patch);
router.delete(":/guildId/feeds/api", feedApiController.del);
export default router;