nitropage
Version:
A free and open source, extensible visual page builder based on SolidStart.
75 lines (66 loc) • 1.87 kB
text/typescript
import { getPublicMedia } from "#data/media";
import { getUser } from "#lib/auth/server";
import {
decorateMedia,
deleteMedia as deleteMedia_,
flushMediaCache,
uploadMedia as uploadMedia_,
} from "#lib/server/media";
import { useDatabase } from "#lib/server/prisma";
import { throwOnDemo } from "#lib/server/util";
import { action, json, query, reload } from "@solidjs/router";
export const getMediaLibrary = query(
async ({ projectId }: { projectId: string }) => {
"use server";
await getUser({ assert: {} });
const db = useDatabase();
return (
await db.nitroMedia.findMany({
where: {
projectId,
},
})
).map(decorateMedia);
},
"np-mediaLibrary",
);
export const deleteMedia = action(async ({ id }: { id: string }) => {
"use server";
await getUser({ assert: { csrf: true } });
throwOnDemo();
await deleteMedia_(id);
return reload({ revalidate: getMediaLibrary.key });
});
export const uploadMedia = action(async (form: FormData) => {
"use server";
await getUser({ assert: { csrf: true } });
throwOnDemo();
const files = await uploadMedia_();
return json(files, { revalidate: getMediaLibrary.key });
});
export const updateMedia = action(
async (media: {
id: string;
color: string;
description: string;
focalPointX: number;
focalPointY: number;
}) => {
"use server";
await getUser({ assert: { csrf: true } });
const db = useDatabase();
const newMedia = await db.nitroMedia.update({
data: {
color: media.color,
focalPointX: media.focalPointX,
focalPointY: media.focalPointY,
description: media.description,
},
where: {
id: media.id,
},
});
await flushMediaCache(newMedia);
return reload({ revalidate: [getMediaLibrary.key, getPublicMedia.key] });
},
);