using Insight.Domain.Interfaces; using Insight.Domain.Network; using Insight.Domain.Network.Agent.Messages; using Insight.Infrastructure.Entities; using MongoDB.Bson; using MongoDB.Driver; namespace Insight.Server.Network.Agent.Handlers; public class ProcessorHandler : IMessageHandler { private readonly IMongoDatabase _database; public ProcessorHandler(IMongoDatabase database) { _database = database; } public async ValueTask HandleAsync(AgentSession sender, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage { switch (message) { case Collection processors: await OnProcessorsAsync(sender, processors, cancellationToken); break; } } private async ValueTask OnProcessorsAsync(AgentSession session, List processors, 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 (processors is not null && processors.Any()) { foreach (var processor in processors) { var filterDefinition = Builders.Filter.And(new List> { Builders.Filter.Eq(x => x.Host, hostEntity.Id), Builders.Filter.Eq(x => x.Index, processor.Index) }); var updateDefinition = Builders.Update .SetOnInsert(p => p.Insert, date) .SetOnInsert(p => p.Host, hostEntity.Id) .SetOnInsert(p => p.Index, processor.Index) .Set(p => p.Update, date) .Set(p => p.Batch, batch) .Set(p => p.Company, processor.Manufacturer) .Set(p => p.Name, processor.Name) .Set(p => p.Socket, processor.Socket) .Set(p => p.Serial, processor.SerialNumber) .Set(p => p.Version, processor.Version) .Set(p => p.Cores, processor.Cores) .Set(p => p.LogicalCores, processor.LogicalCores) .Set(p => p.Clock, processor.MaxSpeed) .Set(p => p.CurrentClock, processor.CurrentSpeed) .Set(p => p.L1Size, processor.L1Size) .Set(p => p.L2Size, processor.L2Size) .Set(p => p.L3Size, processor.L3Size) .Set(p => p.Virtualization, processor.Virtualization) .Set(p => p.PNP, processor.DeviceId); 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.HostProcessor().BulkWriteAsync(bulk, cancellationToken: cancellationToken); } }