mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-20 18:30:15 +01:00
✨ feat: Implement Group Management Methods for CRUD Operations
This commit is contained in:
parent
82a1f554b5
commit
4166eac99d
1 changed files with 127 additions and 0 deletions
127
api/models/groupMethods.js
Normal file
127
api/models/groupMethods.js
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
const Group = require('./group');
|
||||
const User = require('./User'); // Adjust the path as needed
|
||||
|
||||
/**
|
||||
* Retrieve a group by ID and convert the found group document to a plain object.
|
||||
*
|
||||
* @param {string} groupId - The ID of the group to find and return as a plain object.
|
||||
* @param {string|string[]} [fieldsToSelect] - The fields to include or exclude in the returned document.
|
||||
* @returns {Promise<Object|null>} A plain object representing the group document, or `null` if no group is found.
|
||||
*/
|
||||
const getGroupById = (groupId, fieldsToSelect = null) => {
|
||||
const query = Group.findById(groupId);
|
||||
if (fieldsToSelect) {
|
||||
query.select(fieldsToSelect);
|
||||
}
|
||||
return query.lean();
|
||||
};
|
||||
|
||||
/**
|
||||
* Search for a single group based on partial data and return a matching group document as a plain object.
|
||||
*
|
||||
* @param {Partial<Object>} searchCriteria - The partial data to use for searching the group.
|
||||
* @param {string|string[]} [fieldsToSelect] - The fields to include or exclude in the returned document.
|
||||
* @returns {Promise<Object|null>} A plain object representing the group document, or `null` if no group is found.
|
||||
*/
|
||||
const findGroup = (searchCriteria, fieldsToSelect = null) => {
|
||||
const query = Group.findOne(searchCriteria);
|
||||
if (fieldsToSelect) {
|
||||
query.select(fieldsToSelect);
|
||||
}
|
||||
return query.lean();
|
||||
};
|
||||
|
||||
/**
|
||||
* Update a group with new data without overwriting existing properties.
|
||||
*
|
||||
* @param {string} groupId - The ID of the group to update.
|
||||
* @param {Object} updateData - An object containing the properties to update.
|
||||
* @returns {Promise<Object|null>} The updated group document as a plain object, or `null` if no group is found.
|
||||
*/
|
||||
const updateGroup = (groupId, updateData) => {
|
||||
return Group.findByIdAndUpdate(
|
||||
groupId,
|
||||
{ $set: updateData },
|
||||
{ new: true, runValidators: true },
|
||||
).lean();
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a new group.
|
||||
*
|
||||
* @param {Object} data - The group data to be created.
|
||||
* @returns {Promise<Object>} The created group document.
|
||||
*/
|
||||
const createGroup = async (data) => {
|
||||
return await Group.create(data);
|
||||
};
|
||||
|
||||
/**
|
||||
* Count the number of group documents in the collection based on the provided filter.
|
||||
*
|
||||
* @param {Object} [filter={}] - The filter to apply when counting the documents.
|
||||
* @returns {Promise<number>} The count of documents that match the filter.
|
||||
*/
|
||||
const countGroups = (filter = {}) => {
|
||||
return Group.countDocuments(filter);
|
||||
};
|
||||
|
||||
/**
|
||||
* Delete a group by its unique ID only if no user is assigned to it.
|
||||
*
|
||||
* @param {string} groupId - The ID of the group to delete.
|
||||
* @returns {Promise<{ deletedCount: number, message: string }>} An object indicating the number of deleted documents.
|
||||
*/
|
||||
const deleteGroupById = async (groupId) => {
|
||||
// Check if any users reference the group
|
||||
const userCount = await User.countDocuments({ groups: groupId });
|
||||
if (userCount > 0) {
|
||||
return { deletedCount: 0, message: `Cannot delete group; it is assigned to ${userCount} user(s).` };
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await Group.deleteOne({ _id: groupId });
|
||||
if (result.deletedCount === 0) {
|
||||
return { deletedCount: 0, message: 'No group found with that ID.' };
|
||||
}
|
||||
return { deletedCount: result.deletedCount, message: 'Group was deleted successfully.' };
|
||||
} catch (error) {
|
||||
throw new Error('Error deleting group: ' + error.message);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Override deletion of a group by its unique ID.
|
||||
* This function first removes the group ObjectId from all users' groups arrays,
|
||||
* then proceeds to delete the group document.
|
||||
*
|
||||
* @param {string} groupId - The ID of the group to delete.
|
||||
* @returns {Promise<{ deletedCount: number, message: string }>} An object indicating the deletion result.
|
||||
*/
|
||||
const overrideDeleteGroupById = async (groupId) => {
|
||||
// Remove group references from all users
|
||||
await User.updateMany(
|
||||
{ groups: groupId },
|
||||
{ $pull: { groups: groupId } },
|
||||
);
|
||||
|
||||
try {
|
||||
const result = await Group.deleteOne({ _id: groupId });
|
||||
if (result.deletedCount === 0) {
|
||||
return { deletedCount: 0, message: 'No group found with that ID.' };
|
||||
}
|
||||
return { deletedCount: result.deletedCount, message: 'Group was deleted successfully (override).' };
|
||||
} catch (error) {
|
||||
throw new Error('Error deleting group: ' + error.message);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
getGroupById,
|
||||
findGroup,
|
||||
updateGroup,
|
||||
createGroup,
|
||||
countGroups,
|
||||
deleteGroupById,
|
||||
overrideDeleteGroupById,
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue