| const { SystemRoles, CacheKeys, roleDefaults } = require('librechat-data-provider'); |
| const getLogStores = require('~/cache/getLogStores'); |
| const Role = require('~/models/schema/roleSchema'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| const getRoleByName = async function (roleName, fieldsToSelect = null) { |
| try { |
| const cache = getLogStores(CacheKeys.ROLES); |
| const cachedRole = await cache.get(roleName); |
| if (cachedRole) { |
| return cachedRole; |
| } |
| let query = Role.findOne({ name: roleName }); |
| if (fieldsToSelect) { |
| query = query.select(fieldsToSelect); |
| } |
| let role = await query.lean().exec(); |
|
|
| if (!role && SystemRoles[roleName]) { |
| role = roleDefaults[roleName]; |
| role = await new Role(role).save(); |
| await cache.set(roleName, role); |
| return role.toObject(); |
| } |
| await cache.set(roleName, role); |
| return role; |
| } catch (error) { |
| throw new Error(`Failed to retrieve or create role: ${error.message}`); |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| const updateRoleByName = async function (roleName, updates) { |
| try { |
| const cache = getLogStores(CacheKeys.ROLES); |
| const role = await Role.findOneAndUpdate( |
| { name: roleName }, |
| { $set: updates }, |
| { new: true, lean: true }, |
| ) |
| .select('-__v') |
| .lean() |
| .exec(); |
| await cache.set(roleName, role); |
| return role; |
| } catch (error) { |
| throw new Error(`Failed to update role: ${error.message}`); |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| const initializeRoles = async function () { |
| const defaultRoles = [SystemRoles.ADMIN, SystemRoles.USER]; |
|
|
| for (const roleName of defaultRoles) { |
| let role = await Role.findOne({ name: roleName }).select('name').lean(); |
| if (!role) { |
| role = new Role(roleDefaults[roleName]); |
| await role.save(); |
| } |
| } |
| }; |
|
|
| module.exports = { |
| getRoleByName, |
| initializeRoles, |
| updateRoleByName, |
| }; |
|
|