File size: 1,590 Bytes
5da61b4
767afa7
2e28042
 
 
 
5da61b4
 
 
fc15a4c
 
 
 
2e28042
fc15a4c
 
 
5da61b4
fc15a4c
 
76d4779
fc15a4c
76d4779
fc15a4c
 
 
 
17a481a
fc15a4c
5da61b4
fc15a4c
 
 
76d4779
 
 
 
 
 
5da61b4
06e879d
fc15a4c
 
76d4779
fc15a4c
 
 
17a481a
fc15a4c
5da61b4
fc15a4c
 
17a481a
 
767afa7
17a481a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { base } from "$app/paths";
import { PUBLIC_ORIGIN, PUBLIC_SHARE_PREFIX } from "$env/static/public";
import { authCondition } from "$lib/server/auth";
import { collections } from "$lib/server/database";
import type { SharedConversation } from "$lib/types/SharedConversation";
import { sha256 } from "$lib/utils/sha256";
import { error } from "@sveltejs/kit";
import { ObjectId } from "mongodb";
import { nanoid } from "nanoid";

export async function POST({ params, url, locals }) {
	const conversation = await collections.conversations.findOne({
		_id: new ObjectId(params.id),
		...authCondition(locals),
	});

	if (!conversation) {
		throw error(404, "Conversation not found");
	}

	const hash = await sha256(JSON.stringify(conversation.messages));

	const existingShare = await collections.sharedConversations.findOne({ hash });

	if (existingShare) {
		return new Response(
			JSON.stringify({
				url: getShareUrl(url, existingShare._id),
			}),
			{ headers: { "Content-Type": "application/json" } }
		);
	}

	const shared: SharedConversation = {
		_id: nanoid(7),
		createdAt: new Date(),
		messages: conversation.messages,
		hash,
		updatedAt: new Date(),
		title: conversation.title,
		model: conversation.model,
	};

	await collections.sharedConversations.insertOne(shared);

	return new Response(
		JSON.stringify({
			url: getShareUrl(url, shared._id),
		}),
		{ headers: { "Content-Type": "application/json" } }
	);
}

function getShareUrl(url: URL, shareId: string): string {
	return `${PUBLIC_SHARE_PREFIX || `${PUBLIC_ORIGIN || url.origin}${base}`}/r/${shareId}`;
}