nitropage
Version:
A free and open source, extensible visual page builder based on SolidStart.
82 lines (72 loc) • 2.03 kB
text/typescript
import { State } from "#../types";
import { omitEqualProperties } from "../../../../utils/object/omit";
import { logger } from "../../log";
import { useDatabase } from "../../prisma";
import { DEBUG_PAGE_UPDATE } from "../../util";
import { mergeElementData, omitDisabledElementData } from "./elementData";
const updatePresets = async ({
projectId,
prevPresets,
presets,
}: {
projectId: string;
prevPresets?: State["presets"];
presets: State["presets"];
}) => {
const deletedIds: string[] = [];
const db = useDatabase();
for (const preset of Object.values(presets)) {
preset.data = omitDisabledElementData(preset.data);
if (preset.new) {
await db.nitroPreset.create({
select: { id: true },
data: {
id: preset.id,
name: preset.name,
data: JSON.stringify(preset.data),
blueprint: preset.blueprint,
project: {
connect: {
id: projectId,
},
},
},
});
} else {
const dbPreset = await db.nitroPreset.findUnique({
select: { id: true, data: true },
where: { id: preset.id },
});
if (!dbPreset) {
deletedIds.push(preset.id);
continue;
}
const prevPreset = prevPresets?.[preset.id];
const nextData = omitEqualProperties(preset, prevPreset, ["name"]);
const [presetData, dataIsDirty] = mergeElementData(
JSON.parse(dbPreset.data),
preset.data,
prevPreset?.data,
"preset",
);
if (!Object.keys(nextData).length && !dataIsDirty) continue;
if (DEBUG_PAGE_UPDATE) logger.info("Update preset", preset.id);
await db.nitroPreset.update({
select: {
id: true,
},
where: {
id: preset.id,
},
data: {
...nextData,
data: dataIsDirty ? JSON.stringify(presetData) : undefined,
},
});
}
}
return {
deletedIds,
};
};
export default updatePresets;