feat: exposed api routes for Feed objects
This commit is contained in:
parent
7ff73fae28
commit
95124ec6e5
133
src/server/controllers/guild/api/feed.controller.ts
Normal file
133
src/server/controllers/guild/api/feed.controller.ts
Normal 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 };
|
@ -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;
|
Loading…
x
Reference in New Issue
Block a user