const { GLOBAL_PROJECT_NAME } = require('librechat-data-provider').Constants; const { Project } = require('~/db/models'); /** * Retrieve a project by ID and convert the found project document to a plain object. * * @param {string} projectId - The ID of the project to find and return as a plain object. * @param {string|string[]} [fieldsToSelect] - The fields to include or exclude in the returned document. * @returns {Promise} A plain object representing the project document, or `null` if no project is found. */ const getProjectById = async function (projectId, fieldsToSelect = null) { const query = Project.findById(projectId); if (fieldsToSelect) { query.select(fieldsToSelect); } return await query.lean(); }; /** * Retrieve a project by name and convert the found project document to a plain object. * If the project with the given name doesn't exist and the name is "instance", create it and return the lean version. * * @param {string} projectName - The name of the project to find or create. * @param {string|string[]} [fieldsToSelect] - The fields to include or exclude in the returned document. * @returns {Promise} A plain object representing the project document. */ const getProjectByName = async function (projectName, fieldsToSelect = null) { const query = { name: projectName }; const update = { $setOnInsert: { name: projectName } }; const options = { new: true, upsert: projectName === GLOBAL_PROJECT_NAME, lean: true, select: fieldsToSelect, }; return await Project.findOneAndUpdate(query, update, options); }; /** * Add an array of prompt group IDs to a project's promptGroupIds array, ensuring uniqueness. * * @param {string} projectId - The ID of the project to update. * @param {string[]} promptGroupIds - The array of prompt group IDs to add to the project. * @returns {Promise} The updated project document. */ const addGroupIdsToProject = async function (projectId, promptGroupIds) { return await Project.findByIdAndUpdate( projectId, { $addToSet: { promptGroupIds: { $each: promptGroupIds } } }, { new: true }, ); }; /** * Remove an array of prompt group IDs from a project's promptGroupIds array. * * @param {string} projectId - The ID of the project to update. * @param {string[]} promptGroupIds - The array of prompt group IDs to remove from the project. * @returns {Promise} The updated project document. */ const removeGroupIdsFromProject = async function (projectId, promptGroupIds) { return await Project.findByIdAndUpdate( projectId, { $pull: { promptGroupIds: { $in: promptGroupIds } } }, { new: true }, ); }; /** * Remove a prompt group ID from all projects. * * @param {string} promptGroupId - The ID of the prompt group to remove from projects. * @returns {Promise} */ const removeGroupFromAllProjects = async (promptGroupId) => { await Project.updateMany({}, { $pull: { promptGroupIds: promptGroupId } }); }; /** * Add an array of agent IDs to a project's agentIds array, ensuring uniqueness. * * @param {string} projectId - The ID of the project to update. * @param {string[]} agentIds - The array of agent IDs to add to the project. * @returns {Promise} The updated project document. */ const addAgentIdsToProject = async function (projectId, agentIds) { return await Project.findByIdAndUpdate( projectId, { $addToSet: { agentIds: { $each: agentIds } } }, { new: true }, ); }; /** * Remove an array of agent IDs from a project's agentIds array. * * @param {string} projectId - The ID of the project to update. * @param {string[]} agentIds - The array of agent IDs to remove from the project. * @returns {Promise} The updated project document. */ const removeAgentIdsFromProject = async function (projectId, agentIds) { return await Project.findByIdAndUpdate( projectId, { $pull: { agentIds: { $in: agentIds } } }, { new: true }, ); }; /** * Remove an agent ID from all projects. * * @param {string} agentId - The ID of the agent to remove from projects. * @returns {Promise} */ const removeAgentFromAllProjects = async (agentId) => { await Project.updateMany({}, { $pull: { agentIds: agentId } }); }; module.exports = { getProjectById, getProjectByName, /* prompts */ addGroupIdsToProject, removeGroupIdsFromProject, removeGroupFromAllProjects, /* agents */ addAgentIdsToProject, removeAgentIdsFromProject, removeAgentFromAllProjects, };