We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
namespace BotSharp.Plugin.MongoStorage; [BsonIgnoreExtraElements(Inherited = true)] public abstract class MongoBase { [BsonId(IdGenerator = typeof(StringGuidIdGenerator))] public string Id { get; set; } = default!; }
namespace BotSharp.Plugin.MongoStorage; public class MongoDbContext { private readonly MongoClient _mongoClient; private readonly string _mongoDbDatabaseName; private readonly string _collectionPrefix; private const string DB_NAME_INDEX = "authSource"; public MongoDbContext(BotSharpDatabaseSettings dbSettings) { var mongoDbConnectionString = dbSettings.BotSharpMongoDb; _mongoClient = new MongoClient(mongoDbConnectionString); _mongoDbDatabaseName = GetDatabaseName(mongoDbConnectionString); _collectionPrefix = dbSettings.TablePrefix.IfNullOrEmptyAs("BotSharp"); } private string GetDatabaseName(string mongoDbConnectionString) { var databaseName = mongoDbConnectionString.Substring(mongoDbConnectionString.LastIndexOf("/", StringComparison.InvariantCultureIgnoreCase) + 1); var symbol = "?"; if (databaseName.Contains(symbol)) { var markIdx = databaseName.IndexOf(symbol, StringComparison.InvariantCultureIgnoreCase); var db = databaseName.Substring(0, markIdx); if (!string.IsNullOrWhiteSpace(db)) { return db; } var queryStr = databaseName.Substring(markIdx + 1); var queries = queryStr.Split("&", StringSplitOptions.RemoveEmptyEntries).Select(x => new { Key = x.Split("=")[0], Value = x.Split("=")[1] }).ToList(); var source = queries.FirstOrDefault(x => x.Key.IsEqualTo(DB_NAME_INDEX)); if (source != null) { databaseName = source.Value; } } return databaseName; } private IMongoDatabase Database => _mongoClient.GetDatabase(_mongoDbDatabaseName); private bool CollectionExists(IMongoDatabase database, string collectionName) { var filter = Builders<BsonDocument>.Filter.Eq("name", collectionName); var collections = database.ListCollections(new ListCollectionsOptions { Filter = filter }); return collections.Any(); } private IMongoCollection<TDocument> GetCollectionOrCreate<TDocument>(string name) { if (string.IsNullOrWhiteSpace(name)) throw new ArgumentException($"The collection {name} cannot be empty."); string collectionName = $"{_collectionPrefix}_{name}"; if (!CollectionExists(Database, collectionName)) Database.CreateCollection(collectionName); var collection = Database.GetCollection<TDocument>(collectionName); return collection; } #region Indexes private IMongoCollection<ConversationDocument> CreateConversationIndex() { var collection = GetCollectionOrCreate<ConversationDocument>("Conversations"); var indexes = collection.Indexes.List().ToList(); var createTimeIndex = indexes.FirstOrDefault(x => x.GetElement("name").ToString().StartsWith("CreatedTime")); if (createTimeIndex == null) { var indexDef = Builders<ConversationDocument>.IndexKeys.Descending(x => x.CreatedTime); collection.Indexes.CreateOne(new CreateIndexModel<ConversationDocument>(indexDef)); } return collection; } private IMongoCollection<ConversationStateDocument> CreateConversationStateIndex() { var collection = GetCollectionOrCreate<ConversationStateDocument>($"ConversationStates"); var indexes = collection.Indexes.List().ToList(); var stateIndex = indexes.FirstOrDefault(x => x.GetElement("name").ToString().StartsWith("States.Key")); if (stateIndex == null) { var indexDef = Builders<ConversationStateDocument>.IndexKeys.Ascending("States.Key"); collection.Indexes.CreateOne(new CreateIndexModel<ConversationStateDocument>(indexDef)); } return collection; } private IMongoCollection<AgentTaskDocument> CreateAgentTaskIndex() { var collection = GetCollectionOrCreate<AgentTaskDocument>($"AgentTasks"); var indexes = collection.Indexes.List().ToList(); var createTimeIndex = indexes.FirstOrDefault(x => x.GetElement("name").ToString().StartsWith("CreatedTime")); if (createTimeIndex == null) { var indexDef = Builders<AgentTaskDocument>.IndexKeys.Descending(x => x.CreatedTime); collection.Indexes.CreateOne(new CreateIndexModel<AgentTaskDocument>(indexDef)); } return collection; } private IMongoCollection<ConversationContentLogDocument> CreateContentLogIndex() { var collection = GetCollectionOrCreate<ConversationContentLogDocument>($"ConversationContentLogs"); var indexes = collection.Indexes.List().ToList(); var createTimeIndex = indexes.FirstOrDefault(x => x.GetElement("name").ToString().StartsWith("CreateTime")); if (createTimeIndex == null) { var indexDef = Builders<ConversationContentLogDocument>.IndexKeys.Ascending(x => x.CreateTime); collection.Indexes.CreateOne(new CreateIndexModel<ConversationContentLogDocument>(indexDef)); } return collection; } private IMongoCollection<ConversationStateLogDocument> CreateStateLogIndex() { var collection = GetCollectionOrCreate<ConversationStateLogDocument>($"ConversationStateLogs"); var indexes = collection.Indexes.List().ToList(); var createTimeIndex = indexes.FirstOrDefault(x => x.GetElement("name").ToString().StartsWith("CreateTime")); if (createTimeIndex == null) { var indexDef = Builders<ConversationStateLogDocument>.IndexKeys.Ascending(x => x.CreateTime); collection.Indexes.CreateOne(new CreateIndexModel<ConversationStateLogDocument>(indexDef)); } return collection; } #endregion public IMongoCollection<AgentDocument> Agents => GetCollectionOrCreate<AgentDocument>("Agents"); public IMongoCollection<AgentTaskDocument> AgentTasks => CreateAgentTaskIndex(); public IMongoCollection<ConversationDocument> Conversations => CreateConversationIndex(); public IMongoCollection<ConversationDialogDocument> ConversationDialogs => GetCollectionOrCreate<ConversationDialogDocument>("ConversationDialogs"); public IMongoCollection<ConversationStateDocument> ConversationStates => CreateConversationStateIndex(); public IMongoCollection<ExecutionLogDocument> ExectionLogs => GetCollectionOrCreate<ExecutionLogDocument>("ExecutionLogs"); public IMongoCollection<LlmCompletionLogDocument> LlmCompletionLogs => GetCollectionOrCreate<LlmCompletionLogDocument>("LlmCompletionLogs"); public IMongoCollection<ConversationContentLogDocument> ContentLogs => CreateContentLogIndex(); public IMongoCollection<ConversationStateLogDocument> StateLogs => CreateStateLogIndex(); public IMongoCollection<UserDocument> Users => GetCollectionOrCreate<UserDocument>("Users"); public IMongoCollection<UserAgentDocument> UserAgents => GetCollectionOrCreate<UserAgentDocument>("UserAgents"); public IMongoCollection<PluginDocument> Plugins => GetCollectionOrCreate<PluginDocument>("Plugins"); public IMongoCollection<TranslationMemoryDocument> TranslationMemories => GetCollectionOrCreate<TranslationMemoryDocument>("TranslationMemories"); public IMongoCollection<KnowledgeCollectionConfigDocument> KnowledgeCollectionConfigs => GetCollectionOrCreate<KnowledgeCollectionConfigDocument>("KnowledgeCollectionConfigs"); public IMongoCollection<KnowledgeCollectionFileMetaDocument> KnowledgeCollectionFileMeta => GetCollectionOrCreate<KnowledgeCollectionFileMetaDocument>("KnowledgeCollectionFileMeta"); public IMongoCollection<RoleDocument> Roles => GetCollectionOrCreate<RoleDocument>("Roles"); public IMongoCollection<RoleAgentDocument> RoleAgents => GetCollectionOrCreate<RoleAgentDocument>("RoleAgents"); public IMongoCollection<CrontabItemDocument> CrontabItems => GetCollectionOrCreate<CrontabItemDocument>("CronTabItems"); public IMongoCollection<GlobalStatisticsDocument> GlobalStatistics => GetCollectionOrCreate<GlobalStatisticsDocument>("GlobalStatistics"); }
The text was updated successfully, but these errors were encountered:
PR has been submitted, please check #884
Sorry, something went wrong.
iceljc
No branches or pull requests
MongoBase
MongoDbContext.cs
The text was updated successfully, but these errors were encountered: