const { Pinecone } = require('../utils/pinecone'); const { reqBody } = require('../utils/http'); const { Workspace } = require('../models/workspace'); const { Document } = require('../models/documents'); const { DocumentVectors } = require('../models/vectors'); const { WorkspaceChats } = require('../models/workspaceChats'); const { convertToChatHistory } = require('../utils/chats'); function workspaceEndpoints(app) { if (!app) return; app.post('/workspace/new', async (request, response) => { const { name = null } = reqBody(request); const { workspace, message } = await Workspace.new(name); response.status(200).json({ workspace, message }) }) app.post('/workspace/:slug/update-embeddings', async (request, response) => { const { slug = null } = request.params; const { adds = [], deletes = [] } = reqBody(request); const currWorkspace = await Workspace.get(`slug = '${slug}'`); if (!currWorkspace) { response.sendStatus(400).end(); return; } await Document.removeDocuments(currWorkspace, deletes); await Document.addDocuments(currWorkspace, adds); const updatedWorkspace = await Workspace.get(`slug = '${slug}'`); response.status(200).json({ workspace: updatedWorkspace }) }) app.delete('/workspace/:slug', async (request, response) => { const { slug = '' } = request.params const workspace = await Workspace.get(`slug = '${slug}'`); if (!workspace) { response.sendStatus(400).end(); return; } await Workspace.delete(`slug = '${slug.toLowerCase()}'`); await DocumentVectors.deleteForWorkspace(workspace.id); await Document.delete(`workspaceId = ${Number(workspace.id)}`) await WorkspaceChats.delete(`workspaceId = ${Number(workspace.id)}`) try { await Pinecone['delete-namespace']({ namespace: slug }) } catch (e) { console.error(e.message) } response.sendStatus(200).end() }) app.get('/workspaces', async (_, response) => { const workspaces = await Workspace.where(); response.status(200).json({ workspaces }) }) app.get('/workspace/:slug', async (request, response) => { const { slug } = request.params const workspace = await Workspace.get(`slug = '${slug}'`); response.status(200).json({ workspace }) }) app.get('/workspace/:slug/chats', async (request, response) => { const { slug } = request.params const workspace = await Workspace.get(`slug = '${slug}'`); if (!workspace) { response.sendStatus(400).end() return; } const history = await WorkspaceChats.forWorkspace(workspace.id) response.status(200).json({ history: convertToChatHistory(history) }) }) } module.exports = { workspaceEndpoints }