insight/src/Server/Insight.Server/Network/Agent/Handlers/VideocardHandler.cs

74 lines
3.1 KiB
C#
Raw Normal View History

2023-09-21 22:10:55 +02:00
using Insight.Domain.Interfaces;
2023-11-17 17:12:41 +01:00
using Insight.Domain.Network;
using Insight.Domain.Network.Agent.Messages;
2023-09-21 18:58:32 +02:00
using Insight.Infrastructure.Entities;
using MongoDB.Bson;
using MongoDB.Driver;
2023-11-17 17:12:41 +01:00
namespace Insight.Server.Network.Agent.Handlers;
2023-09-21 22:10:55 +02:00
2023-12-18 16:31:00 +01:00
public class VideocardHandler(IMongoDatabase database) : IMessageHandler<AgentSession>
2023-09-21 18:58:32 +02:00
{
2023-12-18 16:31:00 +01:00
private readonly IMongoDatabase _database = database;
2023-09-21 18:58:32 +02:00
2023-09-21 22:10:55 +02:00
public async ValueTask HandleAsync<TMessage>(AgentSession sender, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage
{
2023-11-17 17:12:41 +01:00
switch (message)
2023-09-21 18:58:32 +02:00
{
2023-11-17 17:12:41 +01:00
case Collection<Videocard> videocards:
await OnVideocardsAsync(sender, videocards, cancellationToken);
break;
2023-09-21 18:58:32 +02:00
}
2023-09-21 22:10:55 +02:00
}
2023-09-21 18:58:32 +02:00
2023-09-21 22:10:55 +02:00
private async ValueTask OnVideocardsAsync(AgentSession session, List<Videocard>? videocards, CancellationToken cancellationToken)
{
var agentEntity = await _database.Agent().Find(Builders<AgentEntity>.Filter.Eq(p => p.Id, session.Id)).FirstOrDefaultAsync(cancellationToken);
if (agentEntity is null) return;
2023-09-21 18:58:32 +02:00
2023-09-21 22:10:55 +02:00
var hostEntity = await _database.Host().Find(Builders<HostEntity>.Filter.Eq(p => p.Agent, agentEntity.Id)).FirstOrDefaultAsync(cancellationToken);
if (hostEntity is null) return;
2023-09-21 18:58:32 +02:00
2023-09-21 22:10:55 +02:00
var batch = ObjectId.GenerateNewId().ToString();
var date = DateTime.Now;
2023-09-21 18:58:32 +02:00
2023-09-21 22:10:55 +02:00
var bulk = new List<WriteModel<HostVideocardEntity>>();
2023-09-21 18:58:32 +02:00
2023-12-18 16:31:00 +01:00
if (videocards is not null && videocards.Count != 0)
2023-09-21 22:10:55 +02:00
{
foreach (var videocard in videocards)
2023-09-21 18:58:32 +02:00
{
2023-09-21 22:10:55 +02:00
var filterDefinition = Builders<HostVideocardEntity>.Filter.And(new List<FilterDefinition<HostVideocardEntity>>
2023-09-21 18:58:32 +02:00
{
2023-09-21 22:10:55 +02:00
Builders<HostVideocardEntity>.Filter.Eq(x => x.Host, hostEntity.Id),
Builders<HostVideocardEntity>.Filter.Eq(x => x.Name, videocard.Model)
2023-09-21 18:58:32 +02:00
});
2023-09-21 22:10:55 +02:00
var updateDefinition = Builders<HostVideocardEntity>.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);
2023-09-21 18:58:32 +02:00
2023-09-21 22:10:55 +02:00
bulk.Add(new UpdateOneModel<HostVideocardEntity>(filterDefinition, updateDefinition)
{
IsUpsert = true
});
2023-09-21 18:58:32 +02:00
}
2023-09-21 22:10:55 +02:00
bulk.Add(new DeleteManyModel<HostVideocardEntity>(Builders<HostVideocardEntity>.Filter.And(new List<FilterDefinition<HostVideocardEntity>>
{
Builders<HostVideocardEntity>.Filter.Eq(x => x.Host, hostEntity.Id),
Builders<HostVideocardEntity>.Filter.Ne(x => x.Batch, batch)
})));
var result = await _database.HostVideocard().BulkWriteAsync(bulk, cancellationToken: cancellationToken);
2023-09-21 18:58:32 +02:00
}
}
}