| const prisma = require("../utils/prisma"); |
| const slugifyModule = require("slugify"); |
| const { v4: uuidv4 } = require("uuid"); |
|
|
| const WorkspaceThread = { |
| defaultName: "Thread", |
| writable: ["name"], |
|
|
| |
| |
| |
| |
| |
| |
| |
| slugify: function (...args) { |
| slugifyModule.extend({ |
| "+": " plus ", |
| "!": " bang ", |
| "@": " at ", |
| "*": " splat ", |
| ".": " dot ", |
| ":": "", |
| "~": "", |
| "(": "", |
| ")": "", |
| "'": "", |
| '"': "", |
| "|": "", |
| }); |
| return slugifyModule(...args); |
| }, |
|
|
| new: async function (workspace, userId = null, data = {}) { |
| try { |
| const thread = await prisma.workspace_threads.create({ |
| data: { |
| name: data.name ? String(data.name) : this.defaultName, |
| slug: data.slug |
| ? this.slugify(data.slug, { lowercase: true }) |
| : uuidv4(), |
| user_id: userId ? Number(userId) : null, |
| workspace_id: workspace.id, |
| }, |
| }); |
|
|
| return { thread, message: null }; |
| } catch (error) { |
| console.error(error.message); |
| return { thread: null, message: error.message }; |
| } |
| }, |
|
|
| update: async function (prevThread = null, data = {}) { |
| if (!prevThread) throw new Error("No thread id provided for update"); |
|
|
| const validData = {}; |
| Object.entries(data).forEach(([key, value]) => { |
| if (!this.writable.includes(key)) return; |
| validData[key] = value; |
| }); |
|
|
| if (Object.keys(validData).length === 0) |
| return { thread: prevThread, message: "No valid fields to update!" }; |
|
|
| try { |
| const thread = await prisma.workspace_threads.update({ |
| where: { id: prevThread.id }, |
| data: validData, |
| }); |
| return { thread, message: null }; |
| } catch (error) { |
| console.error(error.message); |
| return { thread: null, message: error.message }; |
| } |
| }, |
|
|
| get: async function (clause = {}) { |
| try { |
| const thread = await prisma.workspace_threads.findFirst({ |
| where: clause, |
| }); |
|
|
| return thread || null; |
| } catch (error) { |
| console.error(error.message); |
| return null; |
| } |
| }, |
|
|
| delete: async function (clause = {}) { |
| try { |
| await prisma.workspace_threads.deleteMany({ |
| where: clause, |
| }); |
| return true; |
| } catch (error) { |
| console.error(error.message); |
| return false; |
| } |
| }, |
|
|
| where: async function ( |
| clause = {}, |
| limit = null, |
| orderBy = null, |
| include = null |
| ) { |
| try { |
| const results = await prisma.workspace_threads.findMany({ |
| where: clause, |
| ...(limit !== null ? { take: limit } : {}), |
| ...(orderBy !== null ? { orderBy } : {}), |
| ...(include !== null ? { include } : {}), |
| }); |
| return results; |
| } catch (error) { |
| console.error(error.message); |
| return []; |
| } |
| }, |
|
|
| |
| autoRenameThread: async function ({ |
| workspace = null, |
| thread = null, |
| user = null, |
| newName = null, |
| onRename = null, |
| }) { |
| if (!workspace || !thread || !newName) return false; |
| if (thread.name !== this.defaultName) return false; |
|
|
| const { WorkspaceChats } = require("./workspaceChats"); |
| const chatCount = await WorkspaceChats.count({ |
| workspaceId: workspace.id, |
| user_id: user?.id || null, |
| thread_id: thread.id, |
| }); |
| if (chatCount !== 1) return { renamed: false, thread }; |
| const { thread: updatedThread } = await this.update(thread, { |
| name: newName, |
| }); |
|
|
| onRename?.(updatedThread); |
| return true; |
| }, |
| }; |
|
|
| module.exports = { WorkspaceThread }; |
|
|