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);
}