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 VideocardHandler : IMessageHandler { private readonly IMongoDatabase _database; public VideocardHandler(IMongoDatabase database) { _database = database; } public async ValueTask HandleAsync(AgentSession sender, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage { switch (message) { case Collection videocards: await OnVideocardsAsync(sender, videocards, cancellationToken); break; } } private async ValueTask OnVideocardsAsync(AgentSession session, List? videocards, 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 (videocards is not null && videocards.Any()) { foreach (var videocard in videocards) { var filterDefinition = Builders.Filter.And(new List> { Builders.Filter.Eq(x => x.Host, hostEntity.Id), Builders.Filter.Eq(x => x.Name, videocard.Model) }); var updateDefinition = Builders.Update .SetOnInsert(p => p.Insert, date) .SetOnInsert(p => p.Host, hostEntity.Id) .SetOnInsert(p => p.Name, videocard.Model) .Set(p => p.Update, date) .Set(p => p.Batch, batch) .Set(p => p.Company, null) .Set(p => p.Memory, videocard.Memory) .Set(p => p.Driver, videocard.DriverVersion) .Set(p => p.Date, videocard.DriverDate); 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.HostVideocard().BulkWriteAsync(bulk, cancellationToken: cancellationToken); } } }