You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/projects/IoTNode/Services/IoTNodeEventHandler.cs

91 lines
3.3 KiB

using Application.Domain.Entities;
using CSScriptLib;
using Hangfire;
using Infrastructure.Data;
using Infrastructure.Events;
using Infrastructure.Extensions;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Concurrent;
using System.Linq;
namespace IoTNode.Services
{
public class IoTNodeEventHandler :
IEventHander<EntityInsertedEvent<IoTTimer>>,
IEventHander<EntityUpdatedEvent<IoTTimer>>,
IEventHander<EntityDeletedEvent<IoTTimer>>,
IEventHander<EntityInsertedEvent<IoTTigger>>,
IEventHander<EntityUpdatedEvent<IoTTigger>>,
IEventHander<EntityDeletedEvent<IoTTigger>>,
IEventHander<EntityUpdatedEvent<Data>>
{
public static ConcurrentDictionary<Guid, IoTTigger> Tiggers = new ConcurrentDictionary<Guid, IoTTigger>();
private readonly IServiceProvider _sp;
public IoTNodeEventHandler(IServiceProvider sp)
{
this._sp = sp;
}
public void Handle(EntityInsertedEvent<IoTTimer> message)
{
RecurringJob.AddOrUpdate<IoTNodeJob>(message.Data.Id.ToString(), o => o.TimerHanle(message.Data.Id), message.Data.Cron, TimeZoneInfo.Local);
}
public void Handle(EntityUpdatedEvent<IoTTimer> message)
{
RecurringJob.AddOrUpdate<IoTNodeJob>(message.Data.Id.ToString(), o => o.TimerHanle(message.Data.Id), message.Data.Cron, TimeZoneInfo.Local);
}
public void Handle(EntityDeletedEvent<IoTTimer> message)
{
RecurringJob.RemoveIfExists(message.Data.Id.ToString());
}
public void Handle(EntityInsertedEvent<IoTTigger> message)
{
Tiggers.TryAdd(message.Data.Id, message.Data);
}
public void Handle(EntityUpdatedEvent<IoTTigger> message)
{
Tiggers.TryRemove(message.Data.Id, out IoTTigger tigger);
Tiggers.TryAdd(message.Data.Id, message.Data);
}
public void Handle(EntityDeletedEvent<IoTTigger> message)
{
Tiggers.TryRemove(message.Data.Id, out IoTTigger tigger);
}
public void Handle(EntityUpdatedEvent<Data> message)
{
var data = message.Data;
using var scope = this._sp.CreateScope();
foreach (var item in Tiggers)
{
var tigger = item.Value;
if (tigger.DataId == data.Id)
{
var methodText = $"bool Valid(string name,string key,{data.Type.ToString().ToLower()} value,string description){{ return {tigger.Condition};}}";
try
{
dynamic method = CSScript.Evaluator.LoadMethod(methodText);
dynamic value = data.GetValue();
var result = method.Valid(data.Name, data.Key, value, data.Description);
if (result)
{
var job = scope.ServiceProvider.GetService<IoTNodeJob>();
job.TiggerHandle(tigger.Id);
}
}
catch (Exception ex)
{
ex.PrintStack();
}
}
}
}
}
}