chatbot-template/app/actions.ts

125 lines
2.7 KiB
TypeScript
Raw Normal View History

2023-06-02 15:33:48 -04:00
'use server'
2023-05-19 12:33:56 -04:00
2023-06-02 15:33:48 -04:00
import { revalidatePath } from 'next/cache'
2023-06-16 21:52:01 +04:00
import { redirect } from 'next/navigation'
import { kv } from '@vercel/kv'
2023-06-16 21:52:01 +04:00
import { auth } from '@/auth'
import { type Chat } from '@/lib/types'
2023-06-11 11:14:39 -04:00
export async function getChats(userId?: string | null) {
if (!userId) {
return []
}
try {
const pipeline = kv.pipeline()
2023-06-15 16:29:05 +04:00
const chats: string[] = await kv.zrange(`user:chat:${userId}`, 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 getChat(id: string, userId: string) {
const chat = await kv.hgetall<Chat>(`chat:${id}`)
2023-06-16 21:52:01 +04:00
if (!chat || (userId && chat.userId !== userId)) {
return null
}
return chat
}
2023-05-19 12:33:56 -04:00
2023-06-13 17:31:15 -04:00
export async function removeChat({ id, path }: { id: string; path: string }) {
2023-06-16 12:03:09 -04:00
const session = await auth()
2023-06-13 17:31:15 -04:00
2023-06-16 11:49:14 -04:00
if (!session) {
2023-06-16 21:52:01 +04:00
return {
error: 'Unauthorized'
}
2023-06-13 17:31:15 -04:00
}
2023-06-02 15:33:48 -04:00
const uid = await kv.hget<string>(`chat:${id}`, 'userId')
// Convert both IDs to strings before comparing
// This is necessary because the session user ID is a string, while the chat user ID is a number
// The strict inequality check (!==) in JavaScript checks both value and type, so it would fail if the types are different
// By converting both IDs to strings, we ensure that the comparison is done between two strings, and it will work correctly even if the IDs are originally of different types
if (String(uid) !== String(session?.user?.id)) {
2023-06-16 21:52:01 +04:00
return {
error: 'Unauthorized'
}
2023-06-02 15:15:35 -04:00
}
2023-06-02 15:33:48 -04:00
await kv.del(`chat:${id}`)
2023-06-16 11:49:14 -04:00
await kv.zrem(`user:chat:${session.user.id}`, `chat:${id}`)
2023-05-19 12:33:56 -04:00
2023-06-02 15:33:48 -04:00
revalidatePath('/')
2023-06-16 21:52:01 +04:00
return revalidatePath(path)
2023-05-19 12:33:56 -04:00
}
2023-06-16 15:20:42 +04:00
export async function clearChats() {
2023-06-16 11:49:14 -04:00
const session = await auth()
2023-06-16 15:20:42 +04:00
2023-06-16 21:52:01 +04:00
if (!session?.user?.id) {
return {
error: 'Unauthorized'
}
2023-06-16 11:49:14 -04:00
}
2023-06-16 21:52:01 +04:00
const chats: string[] = await kv.zrange(`user:chat:${session.user.id}`, 0, -1)
if (!chats.length) {
return redirect('/')
}
2023-06-16 15:20:42 +04:00
const pipeline = kv.pipeline()
for (const chat of chats) {
pipeline.del(chat)
2023-06-16 11:49:14 -04:00
pipeline.zrem(`user:chat:${session.user.id}`, chat)
2023-06-16 15:20:42 +04:00
}
await pipeline.exec()
revalidatePath('/')
2023-06-16 21:52:01 +04:00
return redirect('/')
2023-06-16 15:20:42 +04:00
}
export async function getSharedChat(id: string) {
const chat = await kv.hgetall<Chat>(`chat:${id}`)
if (!chat || !chat.sharePath) {
return null
}
return chat
}
2023-06-16 15:20:42 +04:00
export async function shareChat(chat: Chat) {
2023-06-16 11:49:14 -04:00
const session = await auth()
2023-06-16 21:52:01 +04:00
if (!session?.user?.id || session.user.id !== chat.userId) {
return {
error: 'Unauthorized'
}
2023-06-16 15:20:42 +04:00
}
const payload = {
...chat,
sharePath: `/share/${chat.id}`
2023-06-16 15:20:42 +04:00
}
await kv.hmset(`chat:${chat.id}`, payload)
2023-06-16 15:20:42 +04:00
return payload
}