This commit is contained in:
@@ -34,36 +34,67 @@ namespace AyaNova.Biz
|
||||
else
|
||||
log.LogWarning($"Ops problem notification: \"{message}\"");
|
||||
|
||||
await UpsertEvent(new NotifyEvent() { EventType = NotifyEventType.ServerOperationsProblem, Message = message });
|
||||
await AddGeneralNotifyEvent(NotifyEventType.ServerOperationsProblem, message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Add event if there are subscribers
|
||||
//several optional conditional parameters
|
||||
public static async Task UpsertEvent(NotifyEvent ev, List<string> inTags = null, long? IdValue = null, TimeSpan? AgeValue = null, decimal? DecValue = null)
|
||||
//This handles general notification events not requiring a decision or tied to an object that are basically just a immediate message to the user
|
||||
//e.g. ops problems, DefaultNotification, NotifyHealthCheck etc
|
||||
//optional user id to send directly to them
|
||||
public static async Task AddGeneralNotifyEvent(NotifyEventType eventType, string message, long userId=0)
|
||||
{
|
||||
#if (DEBUG)
|
||||
switch (eventType)
|
||||
{
|
||||
case NotifyEventType.BackupStatus:
|
||||
case NotifyEventType.DefaultNotification:
|
||||
case NotifyEventType.NotifyHealthCheck:
|
||||
case NotifyEventType.ServerOperationsProblem:
|
||||
break;
|
||||
default://this will likely be a development error, not a production error so no need to log etc
|
||||
throw (new System.NotSupportedException($"NotifyEventProcessor:AddGeneralNotifyEvent - Type of event {eventType} is unexpected and not supported"));
|
||||
}
|
||||
#endif
|
||||
//Default notification goes to a specific user only
|
||||
if(eventType==NotifyEventType.DefaultNotification){
|
||||
if(userId==0){
|
||||
//this will likely be a development error, not a production error so no need to log etc
|
||||
throw new System.ArgumentException("NotifyEventProcessor:AddGeneralNotifyEvent: DefaultNotification requires a user id but none was specified");
|
||||
}
|
||||
NotifyEvent n=new NotifyEvent(){EventType=eventType,UserId=userId, Message=message}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
//This is told about an event and then determines if there are any subscriptions related to that event and proceses them accordingly
|
||||
//todo: this should take some kind of general event type like the AyaEvent types (i.e. which CRUD operation is in effect if relevant)
|
||||
//and also a biz object before and after or just before if not a change and also a AyaType
|
||||
|
||||
//then *this* code will go through and look for subscriptions related to that event
|
||||
//this way the biz object code can be "dumb" about notifications in general and just let this code handle it as needed
|
||||
//will iterate the subscriptions and see if any apply here
|
||||
public static async Task HandlePotentialNotificationEvent(AyaType ayaType, AyaEvent ayaEvent, BizObject newObject, BizObject currentObject, )
|
||||
{
|
||||
|
||||
|
||||
log.LogTrace($"UpsertEvent processing: [{ev.ToString()}]");
|
||||
try
|
||||
{
|
||||
// List<NotifySubscription> subs = new List<NotifySubscription>();
|
||||
//Widget.updated.tags=yellow
|
||||
//find subs where widget.updated and either no tags or tags=yellow if tags
|
||||
//do I really need to remove old events? They should be zipping out the door pretty quickly.
|
||||
//only I guess if it's delayed like a time delayed one or send later kind of situation?
|
||||
var HasTags = inTags != null && inTags.Count > 0;
|
||||
|
||||
using (AyContext ct = AyaNova.Util.ServiceProviderProvider.DBContext)
|
||||
{
|
||||
|
||||
|
||||
//find all the subs that are relevant
|
||||
//find all the Notification subscription subs that are relevant
|
||||
//this first query ensures that the equality matching conditions of AyaType and EventType and idValue are matched leaving only more complex matches to rectify below
|
||||
var subs = await ct.NotifySubscription.AsNoTracking().Where(z => z.EventType == ev.EventType && z.AyaType == ev.AyaType && z.IdValue == ev.IdValue).ToListAsync();
|
||||
foreach (var sub in subs)
|
||||
{
|
||||
//Tags condition
|
||||
//CONDITION CHECK Tags condition
|
||||
if (sub.Tags.Count > 0)
|
||||
{
|
||||
if (!HasTags)
|
||||
@@ -75,24 +106,66 @@ namespace AyaNova.Biz
|
||||
continue;
|
||||
}
|
||||
|
||||
//Decimal value, so far only for "The Andy" so the only condition is that the event value be greater than or equal to subscription setting
|
||||
//CONDITION CHECK Decimal value, so far only for "The Andy" so the only condition is that the event value be greater than or equal to subscription setting
|
||||
if (ev.EventType == NotifyEventType.WorkorderTotalExceedsThreshold && ev.DecValue < sub.DecValue)
|
||||
continue;
|
||||
|
||||
//AgeValue
|
||||
//Here ready for delivery
|
||||
|
||||
//HANDLE RELATED INDIRECT EVENTS AND CLEANUP
|
||||
//some event types create related events here automatically (e.g. WorkorderStatusChange in turn will trigger workorderstatusage if subbed here)
|
||||
//Deleting an object or changing status etc will affect other events in turn so clean up for them here
|
||||
switch (ev.EventType)
|
||||
{
|
||||
case NotifyEventType.ObjectAge:
|
||||
case NotifyEventType.WorkorderStatusAge:
|
||||
case NotifyEventType.ObjectDeleted:
|
||||
{
|
||||
//object is deleted so remove any other events pending for it
|
||||
//current working concept is there is no reason to keep any event related to a freshly deleted object
|
||||
var deleteEventList = await ct.NotifyEvent.Where(z => z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType).ToListAsync();
|
||||
ct.NotifyEvent.RemoveRange(deleteEventList);
|
||||
await ct.SaveChangesAsync();
|
||||
|
||||
}
|
||||
break;
|
||||
case NotifyEventType.WorkorderStatusChange:
|
||||
{
|
||||
//Workorder status changed so remove any other prior workorderstatuschanged events and
|
||||
//remove any prior workorderstatusAge events for this object id
|
||||
|
||||
var deleteEventList = await ct.NotifyEvent.Where(z => z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType && ev.EventType == NotifyEventType.WorkorderStatusChange).ToListAsync();
|
||||
ct.NotifyEvent.RemoveRange(deleteEventList);
|
||||
await ct.SaveChangesAsync();
|
||||
|
||||
}
|
||||
break;
|
||||
case NotifyEventType.WorkorderStatusAge://delete any workorder status age ones because there is potentially a new status invalidating the old status
|
||||
case NotifyEventType.QuoteStatusAge:
|
||||
if (AgeValue != null && AgeValue < sub.AgeValue)//current object age value is less than subscription required age value? (not old enough)
|
||||
continue;//then skip it
|
||||
//Delete any existing ones
|
||||
var StaleAgedEvents = await ct.NotifyEvent.Where(z => z.EventType == ev.EventType && z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType).ToListAsync();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
//Here we know the sub matches so create the NotifyEvent here
|
||||
NotifyEvent ne = new NotifyEvent() { };
|
||||
|
||||
//AgeValue refresh?
|
||||
//Age based ones need to replace any prior existing age based ones made for the same object as they are the only ones that can sit in the queue for any length of time
|
||||
//and become invalidated (i.e. deadman type deliveries that sb removed if no longer applicable e.g. WorkorderStatusAge)
|
||||
switch (ev.EventType)
|
||||
{
|
||||
case NotifyEventType.ObjectAge://this is set on creation so it will never change unless the object is deleted
|
||||
case NotifyEventType.WorkorderStatusAge://delete any workorder status age ones because there is potentially a new status invalidating the old status
|
||||
case NotifyEventType.QuoteStatusAge:
|
||||
//Delete any existing ones
|
||||
var StaleAgedEvents = await ct.NotifyEvent.Where(z => z.EventType == ev.EventType && z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType).ToListAsync();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
//Here we know the sub matches the event and passes all the conditions so set the deliver date if necessary and save the NotifyEvent here
|
||||
//todo: create message here (delivery thing?)
|
||||
//todo: Attach report here or is that a delivery thing (delivery thing)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user