Files
webstudio/apps/builder/app/shared/marketplace/db.server.ts
T
Bogdan Chadkin 07decaa02a refactor: migrate project build to postgrest (#3854)
Migrated prisma with postgrest in project build.
Got two cases

- in many cases it is ok to use a couple of select queries since round
trip is low
- transactions can be avoided with late binding to user
2024-08-01 19:14:34 +02:00

75 lines
2.1 KiB
TypeScript

import { prisma } from "@webstudio-is/prisma-client";
import { MarketplaceProduct } from "@webstudio-is/project-build";
import type { BuildData, MarketplaceOverviewItem } from "./types";
import {
loadApprovedProdBuildByProjectId,
parseConfig,
} from "@webstudio-is/project-build/index.server";
import type { AppContext } from "@webstudio-is/trpc-interface/index.server";
import { Project } from "@webstudio-is/project";
import { loadAssetsByProject } from "@webstudio-is/asset-uploader/index.server";
export const getBuildProdData = async (
{ projectId }: { projectId: Project["id"] },
context: AppContext
): Promise<BuildData> => {
const build = await loadApprovedProdBuildByProjectId(context, projectId);
const assets = await loadAssetsByProject(projectId, context, {
skipPermissionsCheck: true,
});
return {
assets: assets.map((asset) => [asset.id, asset]),
build,
};
};
export const getItems = async (): Promise<Array<MarketplaceOverviewItem>> => {
const approvedMarketplaceProducts =
await prisma.approvedMarketplaceProduct.findMany();
const items: MarketplaceOverviewItem[] = [];
for (const approvedMarketplaceProduct of approvedMarketplaceProducts) {
const parsedProduct = MarketplaceProduct.safeParse(
parseConfig(approvedMarketplaceProduct.marketplaceProduct)
);
if (parsedProduct.success === false) {
console.error(parsedProduct.error.formErrors.fieldErrors);
continue;
}
items.push({
projectId: approvedMarketplaceProduct.projectId,
authorizationToken:
approvedMarketplaceProduct.authorizationToken ?? undefined,
...parsedProduct.data,
});
}
const assetIds = items
.map((item) => item.thumbnailAssetId)
.filter((value): value is string => value != null);
const assets =
assetIds.length > 0
? await prisma.asset.findMany({
where: {
id: {
in: assetIds,
},
},
})
: [];
return items.map((item) => {
return {
...item,
thumbnailAssetName: assets.find(
(asset) => asset.id === item.thumbnailAssetId
)?.name,
};
});
};