using Marco.Pms.Model.MongoDBModels; using Microsoft.Extensions.Configuration; using MongoDB.Bson; using MongoDB.Driver; using System.Collections; namespace Marco.Pms.CacheHelper { public class UpdateLogHelper { private readonly IMongoDatabase _mongoDatabase; public UpdateLogHelper(IConfiguration configuration) { var connectionString = configuration["MongoDB:ModificationConnectionString"]; var mongoUrl = new MongoUrl(connectionString); var client = new MongoClient(mongoUrl); // Your MongoDB connection string _mongoDatabase = client.GetDatabase(mongoUrl.DatabaseName); // Your MongoDB Database name } public async Task PushToUpdateLogsAsync(UpdateLogsObject oldObject, string collectionName) { var collection = _mongoDatabase.GetCollection(collectionName); await collection.InsertOneAsync(oldObject); } public async Task> GetFromUpdateLogsByEntityIdAsync(Guid entityId, string collectionName) { var collection = _mongoDatabase.GetCollection(collectionName); var filter = Builders.Filter.Eq(p => p.EntityId, entityId.ToString()); List result = await collection .Find(filter) .ToListAsync(); return result; } public async Task> GetFromUpdateLogsByUpdetedByIdAsync(Guid updatedById, string collectionName) { var collection = _mongoDatabase.GetCollection(collectionName); var filter = Builders.Filter.Eq(p => p.UpdatedById, updatedById.ToString()); List result = await collection .Find(filter) .ToListAsync(); return result; } public BsonDocument EntityToBsonDocument(object entity) { var bson = new BsonDocument(); var props = entity.GetType().GetProperties(); foreach (var prop in props) { var value = prop.GetValue(entity); if (value == null) { bson[prop.Name] = BsonNull.Value; continue; } if (value is Guid guidValue) { bson[prop.Name] = guidValue.ToString(); // store Guid as string } else if (value is string || value.GetType().IsPrimitive || value is DateTime) { bson[prop.Name] = BsonValue.Create(value); // simple types } else if (value is IEnumerable list && !(value is string)) { var array = new BsonArray(); foreach (var item in list) { array.Add(EntityToBsonDocument(item)); // recursive } bson[prop.Name] = array; } else { // nested object continue; } } return bson; } } }