using Insight.Domain.Interfaces; using Insight.Domain.Messages; using Insight.Domain.Messages.Agent; using Insight.Infrastructure; using Insight.Infrastructure.Entities; using MongoDB.Bson; using MongoDB.Driver; namespace Insight.Server.Network.Handlers.Agent; public class SoftwareHandler : IMessageHandler { private readonly IMongoDatabase _database; public SoftwareHandler(IMongoDatabase database) { _database = database; } public async ValueTask HandleAsync(AgentSession sender, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage { if (message is ApplicationList applications) { await OnApplicationsAsync(sender, applications, cancellationToken); } } private async ValueTask OnApplicationsAsync(AgentSession session, List applications, CancellationToken cancellationToken) { var agentEntity = await _database.Agent().Find(Builders.Filter.Eq(p => p.Id, session.Id)).FirstOrDefaultAsync(cancellationToken); if (agentEntity is null) return; var hostEntity = await _database.Host().Find(Builders.Filter.Eq(p => p.Agent, agentEntity.Id)).FirstOrDefaultAsync(cancellationToken); if (hostEntity is null) return; var batch = ObjectId.GenerateNewId().ToString(); var date = DateTime.Now; var bulk = new List>(); if (applications is not null && applications.Any()) { foreach (var app in applications) { var filterDefinition = Builders.Filter.And(new List> { Builders.Filter.Eq(x => x.Host, hostEntity.Id), Builders.Filter.Eq(x => x.Name, app.Name), Builders.Filter.Eq(x => x.Architecture, app.Architecture?.ToString()) }); var updateDefinition = Builders.Update .SetOnInsert(p => p.Insert, date) .SetOnInsert(p => p.Host, hostEntity.Id) .SetOnInsert(p => p.Name, app.Name) .SetOnInsert(p => p.Architecture, app.Architecture?.ToString()) .Set(p => p.Update, date) .Set(p => p.Batch, batch) .Set(p => p.Company, app.Publisher) .Set(p => p.Version, app.Version) .Set(p => p.InstallDate, app.InstallDate); bulk.Add(new UpdateOneModel(filterDefinition, updateDefinition) { IsUpsert = true }); } } bulk.Add(new DeleteManyModel(Builders.Filter.And(new List> { Builders.Filter.Eq(x => x.Host, hostEntity.Id), Builders.Filter.Ne(x => x.Batch, batch) }))); var result = await _database.HostApplication().BulkWriteAsync(bulk, cancellationToken: cancellationToken); } }