2026-03-24 12:55:15 +08:00

60 lines
1.9 KiB
TypeScript

import express from "express";
import u from "@/utils";
import { z } from "zod";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
import { o_assets } from "@/types/database";
const router = express.Router();
export default router.post(
"/",
validateFields({
projectId: z.number(),
}),
async (req, res) => {
const { projectId } = req.body;
const parentAssetsData = await u.db("o_assets").where("projectId", projectId).whereNotNull("assetId");
const parentIds = parentAssetsData.map((i) => i.id);
const sonAssetsData = await u.db("o_assets").whereIn("assetsId", parentIds);
const sonAssetsMap: Record<number, o_assets[]> = {};
const imageIds = [...parentAssetsData.map((i) => i.imageId).concat(sonAssetsData.map((i) => i.imageId))].filter(Boolean);
const imagePaths = await u
.db("o_image")
.whereIn("id", imageIds as unknown as string[])
.select("id", "filePath");
const imageSignUrls = await Promise.all(
imagePaths.map(async (i) => {
return { id: i.id, src: i.filePath ? await u.oss.getFileUrl(i.filePath) : null };
}),
);
const imageUrlMap: Record<number, string | null> = {};
imageSignUrls.forEach((i, index) => {
imageUrlMap[i.id!] = i.src;
});
sonAssetsData.forEach((i) => {
if (!sonAssetsMap[i.assetsId!]) {
sonAssetsMap[i.assetsId!] = [];
}
const obj = {
assetsId: i.id,
name: i.name,
desc: i.describe,
src: imageUrlMap[i.imageId!] ?? null,
derive: sonAssetsMap[i.id!] ?? [],
};
sonAssetsMap[i.assetsId!].push(obj);
});
const returnData = parentAssetsData.map((i) => {
return {
assetsId: i.id,
name: i.name,
desc: i.describe,
src: imageUrlMap[i.imageId!] ?? null,
derive: sonAssetsMap[i.id!] ?? [],
};
});
res.status(200).send(success(returnData));
},
);