UNPKG

nitropage

Version:

A free and open source, extensible visual page builder based on SolidStart.

109 lines (96 loc) 2.48 kB
import { getUser } from "#lib/auth/server"; import { demoEnabled } from "#lib/demo"; import { useDatabase } from "#lib/server/prisma"; import { deleteProject as deleteProject_, getDomainAvailability as getDomainAvailability_, updateProject as updateProject_, } from "#lib/server/project"; import { throwOnDemo } from "#lib/server/util"; import { createId } from "@paralleldrive/cuid2"; import { action, createAsync, query, redirect, useParams, } from "@solidjs/router"; export const getProject = query(async ({ id }: { id: string }) => { "use server"; await getUser({ assert: {} }); const db = useDatabase(); return await db.nitroProject.findUniqueOrThrow({ where: { id, }, }); }, "np-project"); export const useProject = (opts = { deferStream: true }) => { const params = useParams(); return createAsync(() => getProject({ id: params.project! }), opts); }; export const createProject = action( async ({ csrf = "", title, domain, }: { csrf: string; title: string; domain: string; }) => { "use server"; await getUser({ assert: { csrf } }); throwOnDemo(); const db = useDatabase(); const newProject = await db.nitroProject.create({ data: { title, domain, publicId: createId(), }, }); return newProject; }, "np-createProject", ); export const deleteProject = action( async (csrf = "", params: Parameters<typeof deleteProject_>[0]) => { "use server"; await getUser({ assert: { csrf } }); throwOnDemo(); await deleteProject_(params); }, "np-deleteProject", ); export const updateProject = action( async (csrf = "", params: Parameters<typeof updateProject_>[0]) => { "use server"; await getUser({ assert: { csrf } }); await updateProject_(params); }, "np-updateProject", ); export const getDomainAvailability = async ( csrf = "", params: Parameters<typeof getDomainAvailability_>[0], ) => { "use server"; // TODO: Remove explicit csrf parameters await getUser({ assert: { csrf } }); return await getDomainAvailability_(params); }; export const getProjects = query(async () => { "use server"; await getUser({ assert: {} }); const db = useDatabase(); const result = await db.nitroProject.findMany({ orderBy: { title: "asc", }, }); if (demoEnabled() && result[0]) { throw redirect(`/admin/project/${result[0].id}`); } return result; }, "np-projects");