| | import { AccessRoleIds, ResourceType, PermissionBits } from 'librechat-data-provider'; |
| | import type { Model, Types, DeleteResult } from 'mongoose'; |
| | import type { IAccessRole } from '~/types'; |
| | import { RoleBits } from '~/common'; |
| |
|
| | export function createAccessRoleMethods(mongoose: typeof import('mongoose')) { |
| | |
| | |
| | |
| | |
| | |
| | async function findRoleById(roleId: string | Types.ObjectId): Promise<IAccessRole | null> { |
| | const AccessRole = mongoose.models.AccessRole as Model<IAccessRole>; |
| | return await AccessRole.findById(roleId).lean(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | async function findRoleByIdentifier( |
| | accessRoleId: string | Types.ObjectId, |
| | ): Promise<IAccessRole | null> { |
| | const AccessRole = mongoose.models.AccessRole as Model<IAccessRole>; |
| | return await AccessRole.findOne({ accessRoleId }).lean(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | async function findRolesByResourceType(resourceType: string): Promise<IAccessRole[]> { |
| | const AccessRole = mongoose.models.AccessRole as Model<IAccessRole>; |
| | return await AccessRole.find({ resourceType }).lean(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | async function findRoleByPermissions( |
| | resourceType: string, |
| | permBits: PermissionBits | RoleBits, |
| | ): Promise<IAccessRole | null> { |
| | const AccessRole = mongoose.models.AccessRole as Model<IAccessRole>; |
| | return await AccessRole.findOne({ resourceType, permBits }).lean(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | async function createRole(roleData: Partial<IAccessRole>): Promise<IAccessRole> { |
| | const AccessRole = mongoose.models.AccessRole as Model<IAccessRole>; |
| | return await AccessRole.create(roleData); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | async function updateRole( |
| | accessRoleId: string | Types.ObjectId, |
| | updateData: Partial<IAccessRole>, |
| | ): Promise<IAccessRole | null> { |
| | const AccessRole = mongoose.models.AccessRole as Model<IAccessRole>; |
| | return await AccessRole.findOneAndUpdate( |
| | { accessRoleId }, |
| | { $set: updateData }, |
| | { new: true }, |
| | ).lean(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | async function deleteRole(accessRoleId: string | Types.ObjectId): Promise<DeleteResult> { |
| | const AccessRole = mongoose.models.AccessRole as Model<IAccessRole>; |
| | return await AccessRole.deleteOne({ accessRoleId }); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | async function getAllRoles(): Promise<IAccessRole[]> { |
| | const AccessRole = mongoose.models.AccessRole as Model<IAccessRole>; |
| | return await AccessRole.find().lean(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | async function seedDefaultRoles() { |
| | const AccessRole = mongoose.models.AccessRole as Model<IAccessRole>; |
| | const defaultRoles = [ |
| | { |
| | accessRoleId: AccessRoleIds.AGENT_VIEWER, |
| | name: 'com_ui_role_viewer', |
| | description: 'com_ui_role_viewer_desc', |
| | resourceType: ResourceType.AGENT, |
| | permBits: RoleBits.VIEWER, |
| | }, |
| | { |
| | accessRoleId: AccessRoleIds.AGENT_EDITOR, |
| | name: 'com_ui_role_editor', |
| | description: 'com_ui_role_editor_desc', |
| | resourceType: ResourceType.AGENT, |
| | permBits: RoleBits.EDITOR, |
| | }, |
| | { |
| | accessRoleId: AccessRoleIds.AGENT_OWNER, |
| | name: 'com_ui_role_owner', |
| | description: 'com_ui_role_owner_desc', |
| | resourceType: ResourceType.AGENT, |
| | permBits: RoleBits.OWNER, |
| | }, |
| | { |
| | accessRoleId: AccessRoleIds.PROMPTGROUP_VIEWER, |
| | name: 'com_ui_role_viewer', |
| | description: 'com_ui_role_viewer_desc', |
| | resourceType: ResourceType.PROMPTGROUP, |
| | permBits: RoleBits.VIEWER, |
| | }, |
| | { |
| | accessRoleId: AccessRoleIds.PROMPTGROUP_EDITOR, |
| | name: 'com_ui_role_editor', |
| | description: 'com_ui_role_editor_desc', |
| | resourceType: ResourceType.PROMPTGROUP, |
| | permBits: RoleBits.EDITOR, |
| | }, |
| | { |
| | accessRoleId: AccessRoleIds.PROMPTGROUP_OWNER, |
| | name: 'com_ui_role_owner', |
| | description: 'com_ui_role_owner_desc', |
| | resourceType: ResourceType.PROMPTGROUP, |
| | permBits: RoleBits.OWNER, |
| | }, |
| | ]; |
| |
|
| | const result: Record<string, IAccessRole> = {}; |
| |
|
| | for (const role of defaultRoles) { |
| | const upsertedRole = await AccessRole.findOneAndUpdate( |
| | { accessRoleId: role.accessRoleId }, |
| | { $setOnInsert: role }, |
| | { upsert: true, new: true }, |
| | ).lean(); |
| |
|
| | result[role.accessRoleId] = upsertedRole; |
| | } |
| |
|
| | return result; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | async function getRoleForPermissions( |
| | resourceType: string, |
| | permBits: PermissionBits | RoleBits, |
| | ): Promise<IAccessRole | null> { |
| | const AccessRole = mongoose.models.AccessRole as Model<IAccessRole>; |
| | const exactMatch = await AccessRole.findOne({ resourceType, permBits }).lean(); |
| | if (exactMatch) { |
| | return exactMatch; |
| | } |
| |
|
| | |
| | const roles = await AccessRole.find({ resourceType }).sort({ permBits: -1 }).lean(); |
| |
|
| | return roles.find((role) => (role.permBits & permBits) === role.permBits) || null; |
| | } |
| |
|
| | return { |
| | createRole, |
| | updateRole, |
| | deleteRole, |
| | getAllRoles, |
| | findRoleById, |
| | seedDefaultRoles, |
| | findRoleByIdentifier, |
| | getRoleForPermissions, |
| | findRoleByPermissions, |
| | findRolesByResourceType, |
| | }; |
| | } |
| |
|
| | export type AccessRoleMethods = ReturnType<typeof createAccessRoleMethods>; |
| |
|