diff --git a/src/server/controllers/guild/api/feed.controller.ts b/src/server/controllers/guild/api/feed.controller.ts new file mode 100644 index 0000000..7bdd52a --- /dev/null +++ b/src/server/controllers/guild/api/feed.controller.ts @@ -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({ + data: data, + recordsFiltered: await prisma.feed.count(...dbQuery), + recordsTotal: await prisma.feed.count() + }); +}; + +export default { get, post, patch, del, datatable }; \ No newline at end of file diff --git a/src/server/routers/guild.router.ts b/src/server/routers/guild.router.ts index bb0e77d..6c4203b 100644 --- a/src/server/routers/guild.router.ts +++ b/src/server/routers/guild.router.ts @@ -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; \ No newline at end of file