mirror of
https://github.com/sqlchat/sqlchat.git
synced 2025-07-28 17:53:21 +08:00
feat: implement connection and database types
This commit is contained in:
@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from "react";
|
||||
import { toast } from "react-hot-toast";
|
||||
import TextareaAutosize from "react-textarea-autosize";
|
||||
import { localUser, useChatStore, useMessageStore } from "../../store";
|
||||
import { CreatorRole } from "../../types";
|
||||
import { generateUUID } from "../../utils";
|
||||
import Icon from "../Icon";
|
||||
|
||||
@ -45,6 +46,7 @@ const MessageTextarea = (props: Props) => {
|
||||
id: generateUUID(),
|
||||
chatId: chatStore.currentChat.id,
|
||||
creatorId: localUser.id,
|
||||
creatorRole: CreatorRole.User,
|
||||
createdAt: Date.now(),
|
||||
content: value,
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import axios from "axios";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { defaultChat, getAssistantById, getPromptOfAssistant, localUser, useChatStore, useMessageStore } from "../../store";
|
||||
import { Chat, Message, UserRole } from "../../types";
|
||||
import { Chat, CreatorRole, Message } from "../../types";
|
||||
import { generateUUID } from "../../utils";
|
||||
import Icon from "../Icon";
|
||||
import Header from "./Header";
|
||||
@ -50,11 +50,11 @@ const ChatView = () => {
|
||||
const { data } = await axios.post<string>("/api/chat", {
|
||||
messages: [
|
||||
{
|
||||
role: "system",
|
||||
role: CreatorRole.System,
|
||||
content: prompt,
|
||||
},
|
||||
...messageList.map((message) => ({
|
||||
role: message.creatorId === localUser.id ? UserRole.User : UserRole.Assistant,
|
||||
role: message.creatorId === localUser.id ? CreatorRole.User : CreatorRole.Assistant,
|
||||
content: message.content,
|
||||
})),
|
||||
],
|
||||
@ -63,6 +63,7 @@ const ChatView = () => {
|
||||
id: generateUUID(),
|
||||
chatId: currentChat.id,
|
||||
creatorId: currentChat.assistantId,
|
||||
creatorRole: CreatorRole.Assistant,
|
||||
createdAt: Date.now(),
|
||||
content: data,
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { first } from "lodash-es";
|
||||
import { Id, User, UserRole } from "../types";
|
||||
import { Id, User } from "../types";
|
||||
|
||||
// Assistant is a special user.
|
||||
export const assistantList: User[] = [
|
||||
@ -8,7 +8,6 @@ export const assistantList: User[] = [
|
||||
name: "SQL Chat",
|
||||
description: "🤖️ I'm an expert in SQL. I can answer your questions about databases and SQL.",
|
||||
avatar: "",
|
||||
role: UserRole.Assistant,
|
||||
},
|
||||
];
|
||||
|
||||
|
@ -1,10 +1,12 @@
|
||||
import { create } from "zustand";
|
||||
import { persist } from "zustand/middleware";
|
||||
import { Chat, User } from "../types";
|
||||
import { Chat, UNKNOWN_ID, User } from "../types";
|
||||
import { generateUUID } from "../utils";
|
||||
|
||||
export const defaultChat: Chat = {
|
||||
id: generateUUID(),
|
||||
connectionId: UNKNOWN_ID,
|
||||
databaseName: "",
|
||||
assistantId: "sql-assistant",
|
||||
};
|
||||
|
||||
@ -20,10 +22,12 @@ export const useChatStore = create<ChatState>()(
|
||||
(set) => ({
|
||||
chatList: [defaultChat],
|
||||
currentChat: defaultChat,
|
||||
createChat: (user: User) => {
|
||||
createChat: (assistant: User) => {
|
||||
const chat: Chat = {
|
||||
id: generateUUID(),
|
||||
assistantId: user.id,
|
||||
connectionId: UNKNOWN_ID,
|
||||
databaseName: "",
|
||||
assistantId: assistant.id,
|
||||
};
|
||||
set((state) => ({
|
||||
chatList: [...state.chatList, chat],
|
||||
|
@ -1,9 +1,8 @@
|
||||
import { User, UserRole } from "../types";
|
||||
import { User } from "../types";
|
||||
|
||||
export const localUser: User = {
|
||||
id: "local-user",
|
||||
name: "Local user",
|
||||
description: "",
|
||||
avatar: "",
|
||||
role: UserRole.User,
|
||||
};
|
||||
|
@ -2,5 +2,7 @@ import { Id } from "./common";
|
||||
|
||||
export interface Chat {
|
||||
id: string;
|
||||
connectionId: Id;
|
||||
databaseName: string;
|
||||
assistantId: Id;
|
||||
}
|
||||
|
@ -1,2 +1,4 @@
|
||||
export type Id = string;
|
||||
export type Timestamp = number;
|
||||
|
||||
export const UNKNOWN_ID = "unknown";
|
||||
|
18
types/connection.ts
Normal file
18
types/connection.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { Id } from "./common";
|
||||
|
||||
enum Engine {
|
||||
MySQL = "MYSQL",
|
||||
PostgreSQL = "POSTGRESQL",
|
||||
}
|
||||
|
||||
export interface Connection {
|
||||
id: Id;
|
||||
title: string;
|
||||
engineType: Engine;
|
||||
host: string;
|
||||
port: string;
|
||||
username: string;
|
||||
password: string;
|
||||
// database is only required for PostgreSQL.
|
||||
database?: string;
|
||||
}
|
14
types/database.ts
Normal file
14
types/database.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import { Id } from "./common";
|
||||
|
||||
export interface Database {
|
||||
connectionId: Id;
|
||||
name: string;
|
||||
tableList: Table[];
|
||||
}
|
||||
|
||||
interface Table {
|
||||
name: string;
|
||||
// structure is a string of the table structure.
|
||||
// It's mainly used for providing a chat context for the assistant.
|
||||
structure: string;
|
||||
}
|
@ -1,9 +1,16 @@
|
||||
import { Id, Timestamp } from "./";
|
||||
|
||||
export enum CreatorRole {
|
||||
System = "system",
|
||||
User = "user",
|
||||
Assistant = "assistant",
|
||||
}
|
||||
|
||||
export interface Message {
|
||||
id: Id;
|
||||
chatId: string;
|
||||
creatorId: Id;
|
||||
creatorRole: CreatorRole;
|
||||
createdAt: Timestamp;
|
||||
content: string;
|
||||
}
|
||||
|
@ -1,13 +1,6 @@
|
||||
export enum UserRole {
|
||||
System = "system",
|
||||
User = "user",
|
||||
Assistant = "assistant",
|
||||
}
|
||||
|
||||
export interface User {
|
||||
id: string;
|
||||
name: string;
|
||||
description: string;
|
||||
avatar: string;
|
||||
role: UserRole;
|
||||
}
|
||||
|
Reference in New Issue
Block a user