nitropage
Version:
A free and open source, extensible visual page builder based on SolidStart.
109 lines (96 loc) • 2.48 kB
text/typescript
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");