mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 17:00:15 +01:00
feat: Add granular role-based permissions system with Entra ID integration
- Implement RBAC with viewer/editor/owner roles using bitwise permissions
- Add AccessRole, AclEntry, and Group models for permission management
- Create PermissionService for core permission logic and validation
- Integrate Microsoft Graph API for Entra ID user/group search
- Add middleware for resource access validation with custom ID resolvers
- Implement bulk permission updates with transaction support
- Create permission management UI with people picker and role selection
- Add public sharing capabilities for resources
- Include database migration for existing agent ownership
- Support hybrid local/Entra ID identity management
- Add comprehensive test coverage for all new services
chore: Update @librechat/data-schemas to version 0.0.9 and export common module in index.ts
fix: Update userGroup tests to mock logger correctly and change principalId expectation from null to undefined
This commit is contained in:
parent
fa54c9ae90
commit
eed43e6662
88 changed files with 9992 additions and 539 deletions
55
packages/data-schemas/src/utils/transactions.ts
Normal file
55
packages/data-schemas/src/utils/transactions.ts
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
import logger from '~/config/winston';
|
||||
|
||||
/**
|
||||
* Checks if the connected MongoDB deployment supports transactions
|
||||
* This requires a MongoDB replica set configuration
|
||||
*
|
||||
* @returns True if transactions are supported, false otherwise
|
||||
*/
|
||||
export const supportsTransactions = async (
|
||||
mongoose: typeof import('mongoose'),
|
||||
): Promise<boolean> => {
|
||||
try {
|
||||
const session = await mongoose.startSession();
|
||||
try {
|
||||
session.startTransaction();
|
||||
|
||||
await mongoose.connection.db?.collection('__transaction_test__').findOne({}, { session });
|
||||
|
||||
await session.abortTransaction();
|
||||
logger.debug('MongoDB transactions are supported');
|
||||
return true;
|
||||
} catch (transactionError: unknown) {
|
||||
logger.debug(
|
||||
'MongoDB transactions not supported (transaction error):',
|
||||
(transactionError as Error)?.message || 'Unknown error',
|
||||
);
|
||||
return false;
|
||||
} finally {
|
||||
await session.endSession();
|
||||
}
|
||||
} catch (error) {
|
||||
logger.debug(
|
||||
'MongoDB transactions not supported (session error):',
|
||||
(error as Error)?.message || 'Unknown error',
|
||||
);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets whether the current MongoDB deployment supports transactions
|
||||
* Caches the result for performance
|
||||
*
|
||||
* @returns True if transactions are supported, false otherwise
|
||||
*/
|
||||
export const getTransactionSupport = async (
|
||||
mongoose: typeof import('mongoose'),
|
||||
transactionSupportCache: boolean | null,
|
||||
): Promise<boolean> => {
|
||||
let transactionsSupported = false;
|
||||
if (transactionSupportCache === null) {
|
||||
transactionsSupported = await supportsTransactions(mongoose);
|
||||
}
|
||||
return transactionsSupported;
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue