video-flow-toon/src/routes/script/getScrptApi.ts
2026-03-27 22:16:32 +08:00

50 lines
1.5 KiB
TypeScript

import express from "express";
import u from "@/utils";
import { z } from "zod";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
const router = express.Router();
export default router.post(
"/",
validateFields({
projectId: z.number(),
name: z.string().optional(),
}),
async (req, res) => {
const { projectId, name } = req.body;
let query = u.db("o_script").where("projectId", projectId).select("*");
if (name) {
query = query.andWhere("name", "like", `%${name}%`);
}
const data = await query;
const assetsData = await u
.db("o_assets")
.leftJoin("o_scriptAssets", "o_assets.id", "o_scriptAssets.assetId")
.whereIn(
"o_scriptAssets.scriptId",
data.map((i) => i.id!),
)
.select("o_assets.id", "o_assets.name", "o_scriptAssets.scriptId");
const scriptAssetsMap: Record<number, { id: number; name: string }[]> = {};
assetsData.forEach((i) => {
if (scriptAssetsMap[i.scriptId]) {
scriptAssetsMap[i.scriptId].push({ id: i.id, name: i.name });
} else {
scriptAssetsMap[i.scriptId] = [{ id: i.id, name: i.name }];
}
});
const returnData = data.map((i) => ({
id: i.id,
name: i.name,
content: i.content,
extractState: i.extractState,
errorReason: i.errorReason,
createTime: i.createTime,
relatedAssets: scriptAssetsMap[i.id!] || [],
}));
res.status(200).send(success(returnData));
},
);