Spaces:
Sleeping
Sleeping
File size: 2,849 Bytes
c3e8f3d bfbf1a7 84c9f51 c3e8f3d a86b547 bfbf1a7 c3e8f3d f80b091 c3e8f3d f80b091 c3e8f3d bfbf1a7 c3e8f3d bfbf1a7 f80b091 c3e8f3d d0a1b70 bfbf1a7 d0a1b70 c3e8f3d 38448fc a86b547 f80b091 c3e8f3d 84c9f51 bfbf1a7 84c9f51 973f0d8 84c9f51 bfbf1a7 84c9f51 973f0d8 84c9f51 c3e8f3d f80b091 c3e8f3d f80b091 c3e8f3d f80b091 c3e8f3d f80b091 c3e8f3d f80b091 c3e8f3d 84c9f51 f80b091 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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
'use server';
import { revalidatePath } from 'next/cache';
import { kv } from '@vercel/kv';
import { auth, authEmail } from '@/auth';
import { ChatEntity, MessageBase } from '@/lib/types';
import { notFound, redirect } from 'next/navigation';
import { nanoid } from '../utils';
export async function getKVChats() {
const { email } = await authEmail();
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()) as ChatEntity[];
return results.sort((r1, r2) => r2.updatedAt - r1.updatedAt);
} catch (error) {
return [];
}
}
export async function adminGetAllKVChats() {
const { isAdmin } = await authEmail();
if (!isAdmin) {
notFound();
}
try {
const pipeline = kv.pipeline();
const chats: string[] = await kv.zrange(`user:chat:all`, 0, -1, {
rev: true,
});
for (const chat of chats) {
pipeline.hgetall(chat);
}
const results = (await pipeline.exec()) as ChatEntity[];
return results.sort((r1, r2) => r2.updatedAt - r1.updatedAt);
} catch (error) {
return [];
}
}
export async function getKVChat(id: string) {
// const { email, isAdmin } = await authEmail();
const chat = await kv.hgetall<ChatEntity>(`chat:${id}`);
if (!chat) {
redirect('/');
}
return chat;
}
export async function createKVChat(chat: ChatEntity) {
// const { email, isAdmin } = await authEmail();
const { email } = await authEmail();
await kv.hmset(`chat:${chat.id}`, chat);
if (email) {
await kv.zadd(`user:chat:${email}`, {
score: Date.now(),
member: `chat:${chat.id}`,
});
}
await kv.zadd('user:chat:all', {
score: Date.now(),
member: `chat:${chat.id}`,
});
revalidatePath('/chat', 'layout');
}
export async function saveKVChatMessage(id: string, message: MessageBase) {
const chat = await kv.hgetall<ChatEntity>(`chat:${id}`);
if (!chat) {
notFound();
}
const { messages } = chat;
await kv.hmset(`chat:${id}`, {
...chat,
messages: [...messages, message],
updatedAt: Date.now(),
});
revalidatePath('/chat', 'layout');
}
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('/chat/layout', 'layout');
return revalidatePath(path);
}
|