| const { v4 } = require("uuid"); |
| const prisma = require("../utils/prisma"); |
| const { VALID_CHAT_MODE } = require("../utils/chats/stream"); |
|
|
| const EmbedConfig = { |
| writable: [ |
| |
| "enabled", |
| "allowlist_domains", |
| "allow_model_override", |
| "allow_temperature_override", |
| "allow_prompt_override", |
| "max_chats_per_day", |
| "max_chats_per_session", |
| "chat_mode", |
| "workspace_id", |
| "message_limit", |
| ], |
|
|
| new: async function (data, creatorId = null) { |
| try { |
| const embed = await prisma.embed_configs.create({ |
| data: { |
| uuid: v4(), |
| enabled: true, |
| chat_mode: validatedCreationData(data?.chat_mode, "chat_mode"), |
| allowlist_domains: validatedCreationData( |
| data?.allowlist_domains, |
| "allowlist_domains" |
| ), |
| allow_model_override: validatedCreationData( |
| data?.allow_model_override, |
| "allow_model_override" |
| ), |
| allow_temperature_override: validatedCreationData( |
| data?.allow_temperature_override, |
| "allow_temperature_override" |
| ), |
| allow_prompt_override: validatedCreationData( |
| data?.allow_prompt_override, |
| "allow_prompt_override" |
| ), |
| max_chats_per_day: validatedCreationData( |
| data?.max_chats_per_day, |
| "max_chats_per_day" |
| ), |
| max_chats_per_session: validatedCreationData( |
| data?.max_chats_per_session, |
| "max_chats_per_session" |
| ), |
| message_limit: validatedCreationData( |
| data?.message_limit, |
| "message_limit" |
| ), |
| createdBy: Number(creatorId) ?? null, |
| workspace: { |
| connect: { id: Number(data.workspace_id) }, |
| }, |
| }, |
| }); |
| return { embed, message: null }; |
| } catch (error) { |
| console.error(error.message); |
| return { embed: null, message: error.message }; |
| } |
| }, |
|
|
| update: async function (embedId = null, data = {}) { |
| if (!embedId) throw new Error("No embed id provided for update"); |
| const validKeys = Object.keys(data).filter((key) => |
| this.writable.includes(key) |
| ); |
| if (validKeys.length === 0) |
| return { embed: { id }, message: "No valid fields to update!" }; |
|
|
| const updates = {}; |
| validKeys.map((key) => { |
| updates[key] = validatedCreationData(data[key], key); |
| }); |
|
|
| try { |
| await prisma.embed_configs.update({ |
| where: { id: Number(embedId) }, |
| data: updates, |
| }); |
| return { success: true, error: null }; |
| } catch (error) { |
| console.error(error.message); |
| return { success: false, error: error.message }; |
| } |
| }, |
|
|
| get: async function (clause = {}) { |
| try { |
| const embedConfig = await prisma.embed_configs.findFirst({ |
| where: clause, |
| }); |
|
|
| return embedConfig || null; |
| } catch (error) { |
| console.error(error.message); |
| return null; |
| } |
| }, |
|
|
| getWithWorkspace: async function (clause = {}) { |
| try { |
| const embedConfig = await prisma.embed_configs.findFirst({ |
| where: clause, |
| include: { |
| workspace: true, |
| }, |
| }); |
|
|
| return embedConfig || null; |
| } catch (error) { |
| console.error(error.message); |
| return null; |
| } |
| }, |
|
|
| delete: async function (clause = {}) { |
| try { |
| await prisma.embed_configs.delete({ |
| where: clause, |
| }); |
| return true; |
| } catch (error) { |
| console.error(error.message); |
| return false; |
| } |
| }, |
|
|
| where: async function (clause = {}, limit = null, orderBy = null) { |
| try { |
| const results = await prisma.embed_configs.findMany({ |
| where: clause, |
| ...(limit !== null ? { take: limit } : {}), |
| ...(orderBy !== null ? { orderBy } : {}), |
| }); |
| return results; |
| } catch (error) { |
| console.error(error.message); |
| return []; |
| } |
| }, |
|
|
| whereWithWorkspace: async function ( |
| clause = {}, |
| limit = null, |
| orderBy = null |
| ) { |
| try { |
| const results = await prisma.embed_configs.findMany({ |
| where: clause, |
| include: { |
| workspace: true, |
| _count: { |
| select: { embed_chats: true }, |
| }, |
| }, |
| ...(limit !== null ? { take: limit } : {}), |
| ...(orderBy !== null ? { orderBy } : {}), |
| }); |
| return results; |
| } catch (error) { |
| console.error(error.message); |
| return []; |
| } |
| }, |
|
|
| |
| |
| |
| parseAllowedHosts: function (embed) { |
| if (!embed.allowlist_domains) return null; |
|
|
| try { |
| return JSON.parse(embed.allowlist_domains); |
| } catch { |
| console.error(`Failed to parse allowlist_domains for Embed ${embed.id}!`); |
| return []; |
| } |
| }, |
| }; |
|
|
| const BOOLEAN_KEYS = [ |
| "allow_model_override", |
| "allow_temperature_override", |
| "allow_prompt_override", |
| "enabled", |
| ]; |
|
|
| const NUMBER_KEYS = [ |
| "max_chats_per_day", |
| "max_chats_per_session", |
| "workspace_id", |
| "message_limit", |
| ]; |
|
|
| |
| function validatedCreationData(value, field) { |
| if (field === "chat_mode") { |
| if (!value || !VALID_CHAT_MODE.includes(value)) return "query"; |
| return value; |
| } |
|
|
| if (field === "allowlist_domains") { |
| try { |
| if (!value) return null; |
| return JSON.stringify( |
| |
| |
| value |
| .split(",") |
| .map((input) => { |
| let url = input; |
| if (!url.includes("http://") && !url.includes("https://")) |
| url = `https://${url}`; |
| try { |
| new URL(url); |
| return url; |
| } catch { |
| return null; |
| } |
| }) |
| .filter((u) => !!u) |
| ); |
| } catch { |
| return null; |
| } |
| } |
|
|
| if (BOOLEAN_KEYS.includes(field)) { |
| return value === true || value === false ? value : false; |
| } |
|
|
| if (NUMBER_KEYS.includes(field)) { |
| return isNaN(value) || Number(value) <= 0 ? null : Number(value); |
| } |
|
|
| return null; |
| } |
|
|
| module.exports = { EmbedConfig }; |
|
|