mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-01-28 21:26:13 +01:00
🔧 refactor: Organize Sharing/Agent Components and Improve Type Safety
refactor: organize Sharing/Agent components, improve type safety for resource types and access role ids, rename enums to PascalCase refactor: organize Sharing/Agent components, improve type safety for resource types and access role ids chore: move sharing related components to dedicated "Sharing" directory chore: remove PublicSharingToggle component and update index exports chore: move non-sidepanel agent components to `~/components/Agents` chore: move AgentCategoryDisplay component with tests chore: remove commented out code refactor: change PERMISSION_BITS from const to enum for better type safety refactor: reorganize imports in GenericGrantAccessDialog and update index exports for hooks refactor: update type definitions to use ACCESS_ROLE_IDS for improved type safety refactor: remove unused canAccessPromptResource middleware and related code refactor: remove unused prompt access roles from createAccessRoleMethods refactor: update resourceType in AclEntry type definition to remove unused 'prompt' value refactor: introduce ResourceType enum and update resourceType usage across data provider files for improved type safety refactor: update resourceType usage to ResourceType enum across sharing and permissions components for improved type safety refactor: standardize resourceType usage to ResourceType enum across agent and prompt models, permissions controller, and middleware for enhanced type safety refactor: update resourceType references from PROMPT_GROUP to PROMPTGROUP for consistency across models, middleware, and components refactor: standardize access role IDs and resource type usage across agent, file, and prompt models for improved type safety and consistency chore: add typedefs for TUpdateResourcePermissionsRequest and TUpdateResourcePermissionsResponse to enhance type definitions chore: move SearchPicker to PeoplePicker dir refactor: implement debouncing for query changes in SearchPicker for improved performance chore: fix typing, import order for agent admin settings fix: agent admin settings, prevent agent form submission refactor: rename `ACCESS_ROLE_IDS` to `AccessRoleIds` refactor: replace PermissionBits with PERMISSION_BITS refactor: replace PERMISSION_BITS with PermissionBits
This commit is contained in:
parent
ae732b2ebc
commit
81b32e400a
96 changed files with 781 additions and 798 deletions
|
|
@ -1,9 +1,10 @@
|
|||
import mongoose from 'mongoose';
|
||||
import { AccessRoleIds, ResourceType, PermissionBits } from 'librechat-data-provider';
|
||||
import { MongoMemoryServer } from 'mongodb-memory-server';
|
||||
import { createAccessRoleMethods } from './accessRole';
|
||||
import { PermissionBits, RoleBits } from '~/common';
|
||||
import accessRoleSchema from '~/schema/accessRole';
|
||||
import type * as t from '~/types';
|
||||
import { createAccessRoleMethods } from './accessRole';
|
||||
import accessRoleSchema from '~/schema/accessRole';
|
||||
import { RoleBits } from '~/common';
|
||||
|
||||
let mongoServer: MongoMemoryServer;
|
||||
let AccessRole: mongoose.Model<t.IAccessRole>;
|
||||
|
|
@ -32,7 +33,7 @@ describe('AccessRole Model Tests', () => {
|
|||
accessRoleId: 'test_viewer',
|
||||
name: 'Test Viewer',
|
||||
description: 'Test role for viewer permissions',
|
||||
resourceType: 'agent',
|
||||
resourceType: ResourceType.AGENT,
|
||||
permBits: RoleBits.VIEWER,
|
||||
};
|
||||
|
||||
|
|
@ -98,7 +99,7 @@ describe('AccessRole Model Tests', () => {
|
|||
accessRoleId: 'test_editor',
|
||||
name: 'Test Editor',
|
||||
description: 'Test role for editor permissions',
|
||||
resourceType: 'agent',
|
||||
resourceType: ResourceType.AGENT,
|
||||
permBits: RoleBits.EDITOR,
|
||||
},
|
||||
];
|
||||
|
|
@ -120,17 +121,17 @@ describe('AccessRole Model Tests', () => {
|
|||
// Create sample roles for testing
|
||||
await Promise.all([
|
||||
methods.createRole({
|
||||
accessRoleId: 'agent_viewer',
|
||||
accessRoleId: AccessRoleIds.AGENT_VIEWER,
|
||||
name: 'Agent Viewer',
|
||||
description: 'Can view agents',
|
||||
resourceType: 'agent',
|
||||
resourceType: ResourceType.AGENT,
|
||||
permBits: RoleBits.VIEWER,
|
||||
}),
|
||||
methods.createRole({
|
||||
accessRoleId: 'agent_editor',
|
||||
accessRoleId: AccessRoleIds.AGENT_EDITOR,
|
||||
name: 'Agent Editor',
|
||||
description: 'Can edit agents',
|
||||
resourceType: 'agent',
|
||||
resourceType: ResourceType.AGENT,
|
||||
permBits: RoleBits.EDITOR,
|
||||
}),
|
||||
methods.createRole({
|
||||
|
|
@ -154,7 +155,7 @@ describe('AccessRole Model Tests', () => {
|
|||
const agentRoles = await methods.findRolesByResourceType('agent');
|
||||
expect(agentRoles).toHaveLength(2);
|
||||
expect(agentRoles.map((r) => r.accessRoleId).sort()).toEqual(
|
||||
['agent_editor', 'agent_viewer'].sort(),
|
||||
[AccessRoleIds.AGENT_EDITOR, AccessRoleIds.AGENT_VIEWER].sort(),
|
||||
);
|
||||
|
||||
const projectRoles = await methods.findRolesByResourceType('project');
|
||||
|
|
@ -167,11 +168,11 @@ describe('AccessRole Model Tests', () => {
|
|||
test('should find role by permissions', async () => {
|
||||
const viewerRole = await methods.findRoleByPermissions('agent', RoleBits.VIEWER);
|
||||
expect(viewerRole).toBeDefined();
|
||||
expect(viewerRole?.accessRoleId).toBe('agent_viewer');
|
||||
expect(viewerRole?.accessRoleId).toBe(AccessRoleIds.AGENT_VIEWER);
|
||||
|
||||
const editorRole = await methods.findRoleByPermissions('agent', RoleBits.EDITOR);
|
||||
expect(editorRole).toBeDefined();
|
||||
expect(editorRole?.accessRoleId).toBe('agent_editor');
|
||||
expect(editorRole?.accessRoleId).toBe(AccessRoleIds.AGENT_EDITOR);
|
||||
});
|
||||
|
||||
test('should return null when no role matches the permissions', async () => {
|
||||
|
|
@ -192,19 +193,26 @@ describe('AccessRole Model Tests', () => {
|
|||
|
||||
// Verify the result contains the default roles
|
||||
expect(Object.keys(result).sort()).toEqual(
|
||||
['agent_editor', 'agent_owner', 'agent_viewer'].sort(),
|
||||
[
|
||||
AccessRoleIds.AGENT_EDITOR,
|
||||
AccessRoleIds.AGENT_OWNER,
|
||||
AccessRoleIds.AGENT_VIEWER,
|
||||
AccessRoleIds.PROMPTGROUP_EDITOR,
|
||||
AccessRoleIds.PROMPTGROUP_OWNER,
|
||||
AccessRoleIds.PROMPTGROUP_VIEWER,
|
||||
].sort(),
|
||||
);
|
||||
|
||||
// Verify each role exists in the database
|
||||
const agentViewerRole = await methods.findRoleByIdentifier('agent_viewer');
|
||||
const agentViewerRole = await methods.findRoleByIdentifier(AccessRoleIds.AGENT_VIEWER);
|
||||
expect(agentViewerRole).toBeDefined();
|
||||
expect(agentViewerRole?.permBits).toBe(RoleBits.VIEWER);
|
||||
|
||||
const agentEditorRole = await methods.findRoleByIdentifier('agent_editor');
|
||||
const agentEditorRole = await methods.findRoleByIdentifier(AccessRoleIds.AGENT_EDITOR);
|
||||
expect(agentEditorRole).toBeDefined();
|
||||
expect(agentEditorRole?.permBits).toBe(RoleBits.EDITOR);
|
||||
|
||||
const agentOwnerRole = await methods.findRoleByIdentifier('agent_owner');
|
||||
const agentOwnerRole = await methods.findRoleByIdentifier(AccessRoleIds.AGENT_OWNER);
|
||||
expect(agentOwnerRole).toBeDefined();
|
||||
expect(agentOwnerRole?.permBits).toBe(RoleBits.OWNER);
|
||||
});
|
||||
|
|
@ -212,10 +220,10 @@ describe('AccessRole Model Tests', () => {
|
|||
test('should not modify existing roles when seeding', async () => {
|
||||
// Create a modified version of a default role
|
||||
const customRole = {
|
||||
accessRoleId: 'agent_viewer',
|
||||
accessRoleId: AccessRoleIds.AGENT_VIEWER,
|
||||
name: 'Custom Viewer',
|
||||
description: 'Custom viewer description',
|
||||
resourceType: 'agent',
|
||||
resourceType: ResourceType.AGENT,
|
||||
permBits: RoleBits.VIEWER,
|
||||
};
|
||||
|
||||
|
|
@ -225,7 +233,7 @@ describe('AccessRole Model Tests', () => {
|
|||
await methods.seedDefaultRoles();
|
||||
|
||||
// Verify the custom role was not modified
|
||||
const role = await methods.findRoleByIdentifier('agent_viewer');
|
||||
const role = await methods.findRoleByIdentifier(AccessRoleIds.AGENT_VIEWER);
|
||||
expect(role?.name).toBe(customRole.name);
|
||||
expect(role?.description).toBe(customRole.description);
|
||||
});
|
||||
|
|
@ -238,27 +246,27 @@ describe('AccessRole Model Tests', () => {
|
|||
// Create sample roles with ascending permission levels
|
||||
await Promise.all([
|
||||
methods.createRole({
|
||||
accessRoleId: 'agent_viewer',
|
||||
accessRoleId: AccessRoleIds.AGENT_VIEWER,
|
||||
name: 'Agent Viewer',
|
||||
resourceType: 'agent',
|
||||
resourceType: ResourceType.AGENT,
|
||||
permBits: RoleBits.VIEWER, // 1
|
||||
}),
|
||||
methods.createRole({
|
||||
accessRoleId: 'agent_editor',
|
||||
accessRoleId: AccessRoleIds.AGENT_EDITOR,
|
||||
name: 'Agent Editor',
|
||||
resourceType: 'agent',
|
||||
resourceType: ResourceType.AGENT,
|
||||
permBits: RoleBits.EDITOR, // 3
|
||||
}),
|
||||
methods.createRole({
|
||||
accessRoleId: 'agent_manager',
|
||||
name: 'Agent Manager',
|
||||
resourceType: 'agent',
|
||||
resourceType: ResourceType.AGENT,
|
||||
permBits: RoleBits.MANAGER, // 7
|
||||
}),
|
||||
methods.createRole({
|
||||
accessRoleId: 'agent_owner',
|
||||
accessRoleId: AccessRoleIds.AGENT_OWNER,
|
||||
name: 'Agent Owner',
|
||||
resourceType: 'agent',
|
||||
resourceType: ResourceType.AGENT,
|
||||
permBits: RoleBits.OWNER, // 15
|
||||
}),
|
||||
]);
|
||||
|
|
@ -267,7 +275,7 @@ describe('AccessRole Model Tests', () => {
|
|||
test('should find exact matching role', async () => {
|
||||
const role = await methods.getRoleForPermissions('agent', RoleBits.EDITOR);
|
||||
expect(role).toBeDefined();
|
||||
expect(role?.accessRoleId).toBe('agent_editor');
|
||||
expect(role?.accessRoleId).toBe(AccessRoleIds.AGENT_EDITOR);
|
||||
expect(role?.permBits).toBe(RoleBits.EDITOR);
|
||||
});
|
||||
|
||||
|
|
@ -278,7 +286,7 @@ describe('AccessRole Model Tests', () => {
|
|||
// Should return VIEWER (1) as closest matching role without exceeding the permission bits
|
||||
const role = await methods.getRoleForPermissions('agent', customPerm);
|
||||
expect(role).toBeDefined();
|
||||
expect(role?.accessRoleId).toBe('agent_viewer');
|
||||
expect(role?.accessRoleId).toBe(AccessRoleIds.AGENT_VIEWER);
|
||||
});
|
||||
|
||||
test('should return null when no compatible role is found', async () => {
|
||||
|
|
@ -301,7 +309,7 @@ describe('AccessRole Model Tests', () => {
|
|||
// Query for agent roles
|
||||
const agentRole = await methods.getRoleForPermissions('agent', RoleBits.VIEWER);
|
||||
expect(agentRole).toBeDefined();
|
||||
expect(agentRole?.accessRoleId).toBe('agent_viewer');
|
||||
expect(agentRole?.accessRoleId).toBe(AccessRoleIds.AGENT_VIEWER);
|
||||
|
||||
// Query for project roles
|
||||
const projectRole = await methods.getRoleForPermissions('project', RoleBits.VIEWER);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue