chats.py 3.96 KB
Newer Older
Timothy J. Baek's avatar
Timothy J. Baek committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pydantic import BaseModel
from typing import List, Union, Optional
from peewee import *
from playhouse.shortcuts import model_to_dict


import json
import uuid
import time

from apps.web.internal.db import DB


####################
# Chat DB Schema
####################


class Chat(Model):
    id = CharField(unique=True)
Timothy J. Baek's avatar
Timothy J. Baek committed
21
    user_id = CharField()
Timothy J. Baek's avatar
Timothy J. Baek committed
22
23
24
25
26
27
28
29
30
31
32
33
    title = CharField()
    chat = TextField()  # Save Chat JSON as Text
    timestamp = DateField()

    class Meta:
        database = DB


class ChatModel(BaseModel):
    id: str
    user_id: str
    title: str
Timothy J. Baek's avatar
Timothy J. Baek committed
34
    chat: str
Timothy J. Baek's avatar
Timothy J. Baek committed
35
36
37
38
39
40
41
42
43
44
45
46
    timestamp: int  # timestamp in epoch


####################
# Forms
####################


class ChatForm(BaseModel):
    chat: dict


Timothy J. Baek's avatar
Timothy J. Baek committed
47
48
49
50
class ChatTitleForm(BaseModel):
    title: str


51
class ChatResponse(BaseModel):
Timothy J. Baek's avatar
Timothy J. Baek committed
52
    id: str
53
54
55
56
    user_id: str
    title: str
    chat: dict
    timestamp: int  # timestamp in epoch
Timothy J. Baek's avatar
Timothy J. Baek committed
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74


class ChatTitleIdResponse(BaseModel):
    id: str
    title: str


class ChatTable:
    def __init__(self, db):
        self.db = db
        db.create_tables([Chat])

    def insert_new_chat(self, user_id: str, form_data: ChatForm) -> Optional[ChatModel]:
        id = str(uuid.uuid4())
        chat = ChatModel(
            **{
                "id": id,
                "user_id": user_id,
Timothy J. Baek's avatar
Timothy J. Baek committed
75
76
77
78
                "title": form_data.chat["title"]
                if "title" in form_data.chat
                else "New Chat",
                "chat": json.dumps(form_data.chat),
Timothy J. Baek's avatar
Timothy J. Baek committed
79
80
81
82
83
84
85
86
87
                "timestamp": int(time.time()),
            }
        )

        result = Chat.create(**chat.model_dump())
        return chat if result else None

    def update_chat_by_id(self, id: str, chat: dict) -> Optional[ChatModel]:
        try:
88
89
90
91
92
            query = Chat.update(
                chat=json.dumps(chat),
                title=chat["title"] if "title" in chat else "New Chat",
                timestamp=int(time.time()),
            ).where(Chat.id == id)
Timothy J. Baek's avatar
Timothy J. Baek committed
93
94
95
96
97
98
99
            query.execute()

            chat = Chat.get(Chat.id == id)
            return ChatModel(**model_to_dict(chat))
        except:
            return None

Timothy J. Baek's avatar
Timothy J. Baek committed
100
101
102
103
104
105
106
107
108
109
110
111
112
113
    def update_chat_by_id(self, id: str, chat: dict) -> Optional[ChatModel]:
        try:
            query = Chat.update(
                chat=json.dumps(chat),
                title=chat["title"] if "title" in chat else "New Chat",
                timestamp=int(time.time()),
            ).where(Chat.id == id)
            query.execute()

            chat = Chat.get(Chat.id == id)
            return ChatModel(**model_to_dict(chat))
        except:
            return None

Timothy J. Baek's avatar
Timothy J. Baek committed
114
115
116
117
118
    def get_chat_lists_by_user_id(
        self, user_id: str, skip: int = 0, limit: int = 50
    ) -> List[ChatModel]:
        return [
            ChatModel(**model_to_dict(chat))
Timothy J. Baek's avatar
Timothy J. Baek committed
119
            for chat in Chat.select()
Timothy J. Baek's avatar
Timothy J. Baek committed
120
            .where(Chat.user_id == user_id)
121
            .order_by(Chat.timestamp.desc())
122
123
            # .limit(limit)
            # .offset(skip)
Timothy J. Baek's avatar
Timothy J. Baek committed
124
125
        ]

Timothy J. Baek's avatar
Timothy J. Baek committed
126
127
128
129
130
131
132
133
    def get_all_chats_by_user_id(self, user_id: str) -> List[ChatModel]:
        return [
            ChatModel(**model_to_dict(chat))
            for chat in Chat.select()
            .where(Chat.user_id == user_id)
            .order_by(Chat.timestamp.desc())
        ]

Timothy J. Baek's avatar
Timothy J. Baek committed
134
135
136
137
138
139
140
141
142
143
144
145
146
    def get_chat_by_id_and_user_id(self, id: str, user_id: str) -> Optional[ChatModel]:
        try:
            chat = Chat.get(Chat.id == id, Chat.user_id == user_id)
            return ChatModel(**model_to_dict(chat))
        except:
            return None

    def get_chats(self, skip: int = 0, limit: int = 50) -> List[ChatModel]:
        return [
            ChatModel(**model_to_dict(chat))
            for chat in Chat.select().limit(limit).offset(skip)
        ]

147
148
149
150
151
152
153
154
155
    def delete_chat_by_id_and_user_id(self, id: str, user_id: str) -> bool:
        try:
            query = Chat.delete().where((Chat.id == id) & (Chat.user_id == user_id))
            query.execute()  # Remove the rows, return number of rows removed.

            return True
        except:
            return False

Timothy J. Baek's avatar
Timothy J. Baek committed
156
157

Chats = ChatTable(DB)