104 lines
2.5 KiB
TypeScript
104 lines
2.5 KiB
TypeScript
|
|
import { Router, type IRouter } from "express";
|
||
|
|
import { eq, asc } from "drizzle-orm";
|
||
|
|
import { db } from "@workspace/db";
|
||
|
|
import { appsTable } from "@workspace/db";
|
||
|
|
import { requireAuth, requireAdmin } from "../middlewares/auth";
|
||
|
|
import {
|
||
|
|
CreateAppBody,
|
||
|
|
UpdateAppBody,
|
||
|
|
GetAppParams,
|
||
|
|
UpdateAppParams,
|
||
|
|
DeleteAppParams,
|
||
|
|
} from "@workspace/api-zod";
|
||
|
|
|
||
|
|
const router: IRouter = Router();
|
||
|
|
|
||
|
|
router.get("/apps", requireAuth, async (_req, res): Promise<void> => {
|
||
|
|
const apps = await db
|
||
|
|
.select()
|
||
|
|
.from(appsTable)
|
||
|
|
.where(eq(appsTable.isActive, true))
|
||
|
|
.orderBy(asc(appsTable.sortOrder), asc(appsTable.nameEn));
|
||
|
|
res.json(apps);
|
||
|
|
});
|
||
|
|
|
||
|
|
router.post("/apps", requireAdmin, async (req, res): Promise<void> => {
|
||
|
|
const parsed = CreateAppBody.safeParse(req.body);
|
||
|
|
if (!parsed.success) {
|
||
|
|
res.status(400).json({ error: parsed.error.message });
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const [app] = await db.insert(appsTable).values(parsed.data).returning();
|
||
|
|
res.status(201).json(app);
|
||
|
|
});
|
||
|
|
|
||
|
|
router.get("/apps/:id", requireAuth, async (req, res): Promise<void> => {
|
||
|
|
const params = GetAppParams.safeParse(req.params);
|
||
|
|
if (!params.success) {
|
||
|
|
res.status(400).json({ error: params.error.message });
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const [app] = await db
|
||
|
|
.select()
|
||
|
|
.from(appsTable)
|
||
|
|
.where(eq(appsTable.id, params.data.id));
|
||
|
|
|
||
|
|
if (!app) {
|
||
|
|
res.status(404).json({ error: "App not found" });
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
res.json(app);
|
||
|
|
});
|
||
|
|
|
||
|
|
router.patch("/apps/:id", requireAdmin, async (req, res): Promise<void> => {
|
||
|
|
const params = UpdateAppParams.safeParse(req.params);
|
||
|
|
if (!params.success) {
|
||
|
|
res.status(400).json({ error: params.error.message });
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const parsed = UpdateAppBody.safeParse(req.body);
|
||
|
|
if (!parsed.success) {
|
||
|
|
res.status(400).json({ error: parsed.error.message });
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const [app] = await db
|
||
|
|
.update(appsTable)
|
||
|
|
.set(parsed.data)
|
||
|
|
.where(eq(appsTable.id, params.data.id))
|
||
|
|
.returning();
|
||
|
|
|
||
|
|
if (!app) {
|
||
|
|
res.status(404).json({ error: "App not found" });
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
res.json(app);
|
||
|
|
});
|
||
|
|
|
||
|
|
router.delete("/apps/:id", requireAdmin, async (req, res): Promise<void> => {
|
||
|
|
const params = DeleteAppParams.safeParse(req.params);
|
||
|
|
if (!params.success) {
|
||
|
|
res.status(400).json({ error: params.error.message });
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const [app] = await db
|
||
|
|
.delete(appsTable)
|
||
|
|
.where(eq(appsTable.id, params.data.id))
|
||
|
|
.returning();
|
||
|
|
|
||
|
|
if (!app) {
|
||
|
|
res.status(404).json({ error: "App not found" });
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
res.sendStatus(204);
|
||
|
|
});
|
||
|
|
|
||
|
|
export default router;
|