File size: 1,392 Bytes
c3e8f3d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
58
59
60
61
62
63
64
65
66
67
68
69
70
'use server';

import { revalidatePath } from 'next/cache';
import { redirect } from 'next/navigation';
import { kv } from '@vercel/kv';

import { auth } from '@/auth';
import { type Chat } from '@/lib/types';

export async function getKVChats() {
	const session = await auth();
	const email = session?.user?.email;

	if (!email) {
		return [];
	}

	try {
		const pipeline = kv.pipeline();
		const chats: string[] = await kv.zrange(`user:chat:${email}`, 0, -1, {
			rev: true,
		});

		for (const chat of chats) {
			pipeline.hgetall(chat);
		}

		const results = await pipeline.exec();

		return results as Chat[];
	} catch (error) {
		return [];
	}
}

export async function getKVChat(id: string, userId: string) {
	const chat = await kv.hgetall<Chat>(`chat:${id}`);

	if (!chat || (userId && chat.userId !== userId)) {
		return null;
	}

	return chat;
}

export async function removeKVChat({ id, path }: { id: string; path: string }) {
	const session = await auth();

	if (!session) {
		return {
			error: 'Unauthorized',
		};
	}

	//Convert uid to string for consistent comparison with session.user.id
	const uid = String(await kv.hget(`chat:${id}`, 'userId'));

	if (uid !== session?.user?.id) {
		return {
			error: 'Unauthorized',
		};
	}

	await kv.del(`chat:${id}`);
	await kv.zrem(`user:chat:${session.user.id}`, `chat:${id}`);

	revalidatePath('/');
	return revalidatePath(path);
}