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'
2023-06-11 00:23:23 +04:00
import { kv } from '@vercel/kv'
2023-06-16 21:52:01 +04:00
import { auth } from '@/auth'
2023-06-11 00:23:23 +04:00
import { type Chat } from '@/lib/types'
2023-06-11 11:14:39 -04:00
export async function getChats ( userId? : string | null ) {
if ( ! userId ) {
return [ ]
}
2023-06-11 00:23:23 +04:00
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
} )
2023-06-11 00:23:23 +04:00
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
2023-06-11 00:23:23 +04:00
}
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-05-19 14:13:38 -04:00
2023-06-02 15:33:48 -04:00
const uid = await kv . hget < string > ( ` chat: ${ id } ` , 'userId' )
2023-06-16 16:18:52 +04:00
2023-11-27 19:31:17 +01:00
// 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-16 16:18:52 +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 )
2023-06-21 02:01:22 +03:00
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
}
2023-06-16 16:18:52 +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 = {
2023-06-16 16:18:52 +04:00
. . . chat ,
sharePath : ` /share/ ${ chat . id } `
2023-06-16 15:20:42 +04:00
}
2023-06-16 16:18:52 +04:00
await kv . hmset ( ` chat: ${ chat . id } ` , payload )
2023-06-16 15:20:42 +04:00
return payload
}