forked from
leaflet.pub/leaflet
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}