MCPcopy
hub / github.com/BuilderIO/agent-native / createShareLink

Function createShareLink

templates/slides/server/handlers/share.ts:44–97  ·  view source on GitHub ↗
(event: any, deckId: string)

Source from the content-addressed store, hash-verified

42});
43
44async function createShareLink(event: any, deckId: string) {
45 const db = getDb();
46 let storedDeck: any;
47 let title = "Untitled";
48
49 try {
50 const access = await assertAccess("deck", deckId, "admin");
51 title = access.resource.title ?? "Untitled";
52 storedDeck = JSON.parse(access.resource.data);
53 } catch (err) {
54 if (err instanceof ForbiddenError) {
55 setResponseStatus(event, err.statusCode);
56 return { error: err.message };
57 }
58 throw err;
59 }
60
61 if (!Array.isArray(storedDeck?.slides) || storedDeck.slides.length === 0) {
62 setResponseStatus(event, 400);
63 return { error: "Deck with slides is required" };
64 }
65
66 const token = crypto.randomBytes(12).toString("base64url");
67 const now = new Date().toISOString();
68
69 const slides = storedDeck.slides.map((s: any) => ({
70 id: s.id,
71 content: s.content,
72 notes: "", // never share speaker notes
73 layout: s.layout,
74 background: s.background,
75 }));
76
77 await db.insert(schema.deckShareLinks).values({
78 token,
79 title: title || storedDeck.title || "Untitled",
80 slides: JSON.stringify(slides),
81 aspectRatio: storedDeck.aspectRatio ?? null,
82 createdAt: now,
83 });
84
85 // Prune expired rows opportunistically (no await — background)
86 db.delete(schema.deckShareLinks)
87 .where(
88 lt(
89 schema.deckShareLinks.createdAt,
90 new Date(Date.now() - THIRTY_DAYS_MS).toISOString(),
91 ),
92 )
93 .catch(() => {});
94
95 const response: ShareDeckResponse = { shareToken: token };
96 return response;
97}
98
99/**
100 * GET /api/share/:token

Callers 1

share.tsFile · 0.85

Calls 3

getDbFunction · 0.90
assertAccessFunction · 0.90
deleteMethod · 0.65

Tested by

no test coverage detected