Something went wrong. Try again.
a tool for shared writing and social publishing
Something went wrong. Try again.
TypeScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164"use server";
import { drizzle } from "drizzle-orm/node-postgres";import { entities, identities, permission_tokens, permission_token_rights, entity_sets, facts, permission_token_on_homepage, email_auth_tokens,} from "drizzle/schema";import { redirect } from "next/navigation";import postgres from "postgres";import { v7 } from "uuid";import { sql, eq, and } from "drizzle-orm";import { cookies } from "next/headers";import { pool } from "supabase/pool";
export async function createNewLeaflet({ pageType, redirectUser, firstBlockType,}: { pageType: "canvas" | "doc"; redirectUser: boolean; firstBlockType?: "h1" | "text";}) { let auth_token = (await cookies()).get("auth_token")?.value; const client = await pool.connect(); const db = drizzle(client); let { permissionToken } = await db.transaction(async (tx) => { // Create a new entity set let [entity_set] = await tx.insert(entity_sets).values({}).returning(); // Create a root-entity
let [root_entity] = await tx .insert(entities) // And add it to that permission set .values({ set: entity_set.id, id: v7() }) .returning(); let [first_page] = await tx .insert(entities) // And add it to that permission set .values({ set: entity_set.id, id: v7() }) .returning(); //Create a new permission token let [permissionToken] = await tx .insert(permission_tokens) .values({ root_entity: root_entity.id }) .returning(); //and give it all the permission on that entity set let [rights] = await tx .insert(permission_token_rights) .values({ token: permissionToken.id, entity_set: entity_set.id, read: true, write: true, create_token: true, change_entity_set: true, }) .returning();
let [blockEntity] = await tx .insert(entities) // And add it to that permission set .values({ set: entity_set.id, id: v7() }) .returning(); await tx.insert(facts).values([ { id: v7(), entity: root_entity.id, attribute: "root/page", data: sql`${{ type: "ordered-reference", value: first_page.id, position: "a0" }}`, }, //Set theme/page-leaflet-watermark to true by default for new leaflets { id: v7(), entity: root_entity.id, attribute: "theme/page-leaflet-watermark", data: sql`${{ type: "boolean", value: true }}`, }, ]);
if (pageType === "canvas") { await tx.insert(facts).values([ { id: v7(), entity: first_page.id, attribute: "page/type", data: sql`${{ type: "page-type-union", value: "canvas" }}`, }, { id: v7(), entity: first_page.id, attribute: "canvas/block", data: sql`${{ type: "spatial-reference", value: blockEntity.id, position: { x: 8, y: 12 } }}::jsonb`, }, { id: v7(), entity: blockEntity.id, attribute: "block/type", data: sql`${{ type: "block-type-union", value: "text" }}::jsonb`, }, ]); } else { await tx.insert(facts).values([ { id: v7(), entity: first_page.id, attribute: "card/block", data: sql`${{ type: "ordered-reference", value: blockEntity.id, position: "a0" }}::jsonb`, }, ...(firstBlockType === "text" ? [ { id: v7(), entity: blockEntity.id, attribute: "block/type", data: sql`${{ type: "block-type-union", value: "text" }}::jsonb`, }, ] : [ { id: v7(), entity: blockEntity.id, attribute: "block/type", data: sql`${{ type: "block-type-union", value: "heading" }}::jsonb`, }, { id: v7(), entity: blockEntity.id, attribute: "block/heading-level", data: sql`${{ type: "number", value: 1 }}::jsonb`, }, ]), ]); } if (auth_token) { await tx.execute(sql` WITH auth_token AS ( SELECT identities.id as identity_id FROM email_auth_tokens LEFT JOIN identities ON email_auth_tokens.identity = identities.id WHERE email_auth_tokens.id = ${auth_token} AND email_auth_tokens.confirmed = true AND identities.id IS NOT NULL ) INSERT INTO permission_token_on_homepage (token, identity) SELECT ${permissionToken.id}, identity_id FROM auth_token `); }
return { permissionToken, rights, root_entity, entity_set }; });
client.release(); if (redirectUser) redirect(`/${permissionToken.id}?focusFirstBlock`); return permissionToken.id;}