a tool for shared writing and social publishing
1"use server"; 2 3import { eq, and } from "drizzle-orm"; 4import { drizzle } from "drizzle-orm/node-postgres"; 5import { permission_token_rights, permission_tokens } from "drizzle/schema"; 6import { pool } from "supabase/pool"; 7export async function getShareLink( 8 token: { id: string; entity_set: string }, 9 rootEntity: string, 10) { 11 const client = await pool.connect(); 12 const db = drizzle(client); 13 let link = await db.transaction(async (tx) => { 14 // This will likely error out when if we have multiple permission 15 // token rights associated with a single token 16 let [tokenW] = await tx 17 .select() 18 .from(permission_tokens) 19 .leftJoin( 20 permission_token_rights, 21 eq(permission_token_rights.token, permission_tokens.id), 22 ) 23 .where(eq(permission_tokens.id, token.id)); 24 if ( 25 !tokenW.permission_token_rights || 26 tokenW.permission_token_rights.create_token !== true || 27 tokenW.permission_tokens.root_entity !== rootEntity || 28 tokenW.permission_token_rights.entity_set !== token.entity_set 29 ) { 30 return null; 31 } 32 33 let [existingToken] = await tx 34 .select() 35 .from(permission_tokens) 36 .rightJoin( 37 permission_token_rights, 38 eq(permission_token_rights.token, permission_tokens.id), 39 ) 40 .where( 41 and( 42 eq(permission_token_rights.read, true), 43 eq(permission_token_rights.write, false), 44 eq(permission_token_rights.create_token, false), 45 eq(permission_token_rights.change_entity_set, false), 46 eq(permission_token_rights.entity_set, token.entity_set), 47 eq(permission_tokens.root_entity, rootEntity), 48 ), 49 ); 50 if (existingToken) { 51 return existingToken.permission_tokens; 52 } 53 let [newToken] = await tx 54 .insert(permission_tokens) 55 .values({ root_entity: rootEntity }) 56 .returning(); 57 await tx.insert(permission_token_rights).values({ 58 entity_set: token.entity_set, 59 token: newToken.id, 60 read: true, 61 write: false, 62 create_token: false, 63 change_entity_set: false, 64 }); 65 return newToken; 66 }); 67 68 client.release(); 69 return link; 70}