From 0ba71c83c1b17e1e4906da80d2f202864c6a79f4 Mon Sep 17 00:00:00 2001 From: Richard Garcia Date: Mon, 30 Mar 2026 13:19:33 -0300 Subject: [PATCH] feat(#16): implement search indexes for mongo database collections --- .../Extensions/DataPersistenceExtension.cs | 2 + .../Extensions/IndexesExtension.cs | 65 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 Applications/Backend/Source/HttpsRichardy.Federation.Infrastructure.IoC/Extensions/IndexesExtension.cs diff --git a/Applications/Backend/Source/HttpsRichardy.Federation.Infrastructure.IoC/Extensions/DataPersistenceExtension.cs b/Applications/Backend/Source/HttpsRichardy.Federation.Infrastructure.IoC/Extensions/DataPersistenceExtension.cs index dd4772a..f85e4e7 100644 --- a/Applications/Backend/Source/HttpsRichardy.Federation.Infrastructure.IoC/Extensions/DataPersistenceExtension.cs +++ b/Applications/Backend/Source/HttpsRichardy.Federation.Infrastructure.IoC/Extensions/DataPersistenceExtension.cs @@ -10,6 +10,8 @@ public static void AddDataPersistence(this IServiceCollection services, ISetting var mongoClient = new MongoClient(settings.Database.ConnectionString); var database = mongoClient.GetDatabase(settings.Database.DatabaseName); + database.EnsureIndexes(); + return database; }); diff --git a/Applications/Backend/Source/HttpsRichardy.Federation.Infrastructure.IoC/Extensions/IndexesExtension.cs b/Applications/Backend/Source/HttpsRichardy.Federation.Infrastructure.IoC/Extensions/IndexesExtension.cs new file mode 100644 index 0000000..e1602fe --- /dev/null +++ b/Applications/Backend/Source/HttpsRichardy.Federation.Infrastructure.IoC/Extensions/IndexesExtension.cs @@ -0,0 +1,65 @@ +namespace HttpsRichardy.Federation.Infrastructure.IoC.Extensions; + +[ExcludeFromCodeCoverage] +public static class IndexesExtension +{ + public static void EnsureIndexes(this IMongoDatabase database) + { + #pragma warning disable IDE0055 + + var userCollection = database.GetCollection("federation.users"); + var permissionCollection = database.GetCollection("federation.permissions"); + var groupCollection = database.GetCollection("federation.groups"); + + var tokenCollection = database.GetCollection("federation.tokens"); + var realmCollection = database.GetCollection("federation.realms"); + + var userIndexes = new[] + { + new CreateIndexModel(Builders.IndexKeys.Ascending(user => user.Username)), + new CreateIndexModel(Builders.IndexKeys.Ascending(user => user.IsDeleted)), + new CreateIndexModel(Builders.IndexKeys + .Ascending(user => user.Username) + .Ascending(user => user.RealmId)) + }; + + var groupIndexes = new[] + { + new CreateIndexModel(Builders.IndexKeys.Ascending(group => group.Name)), + new CreateIndexModel(Builders.IndexKeys.Ascending(group => group.RealmId)), + new CreateIndexModel(Builders.IndexKeys + .Ascending(group => group.RealmId) + .Ascending(group => group.Name)) + }; + + var permissionIndexes = new[] + { + new CreateIndexModel(Builders.IndexKeys.Ascending(permission => permission.Name)), + new CreateIndexModel(Builders.IndexKeys.Ascending(permission => permission.RealmId)), + new CreateIndexModel(Builders.IndexKeys + .Ascending(permission => permission.RealmId) + .Ascending(permission => permission.Name)) + }; + + var tokenIndexes = new[] + { + new CreateIndexModel(Builders.IndexKeys.Ascending(token => token.UserId)), + new CreateIndexModel(Builders.IndexKeys.Ascending(token => token.RealmId)), + new CreateIndexModel(Builders.IndexKeys + .Ascending(token => token.UserId) + .Ascending(token => token.RealmId)) + }; + + var realmIndexes = new[] + { + new CreateIndexModel(Builders.IndexKeys.Ascending(realm => realm.Name)), + new CreateIndexModel(Builders.IndexKeys.Ascending(realm => realm.ClientId)) + }; + + userCollection.Indexes.CreateMany(userIndexes); + permissionCollection.Indexes.CreateMany(permissionIndexes); + groupCollection.Indexes.CreateMany(groupIndexes); + tokenCollection.Indexes.CreateMany(tokenIndexes); + realmCollection.Indexes.CreateMany(realmIndexes); + } +}