vision-agent / lib /kv /chat.ts
MingruiZhang's picture
feat: Component UI and lastUpdated timestamp (#21)
bfbf1a7 unverified
raw
history blame
No virus
2.85 kB
'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);
}