From bfb64dffc66f35d75f008fc388979f319d91a11e Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Fri, 17 Jul 2020 00:06:02 +0000 Subject: [PATCH] --- server/AyaNova/biz/NotifyEventProcessor.cs | 188 ++++++++++++--------- server/AyaNova/biz/NotifyEventType.cs | 8 +- 2 files changed, 110 insertions(+), 86 deletions(-) diff --git a/server/AyaNova/biz/NotifyEventProcessor.cs b/server/AyaNova/biz/NotifyEventProcessor.cs index 6bb52d97..794ecfaa 100644 --- a/server/AyaNova/biz/NotifyEventProcessor.cs +++ b/server/AyaNova/biz/NotifyEventProcessor.cs @@ -110,110 +110,134 @@ namespace AyaNova.Biz //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 - internal static async Task HandlePotentialNotificationEvent(AyaType ayaType, AyaEvent ayaEvent, BizObject newObject, BizObject currentObject, ) + internal static async Task HandlePotentialNotificationEvent(AyaType ayaType, AyaEvent ayaEvent, BizObject newObject, BizObject currentObject) { - log.LogTrace($"UpsertEvent processing: [{ev.ToString()}]"); + log.LogTrace($"HandlePotentialNotificationEvent processing: [AyaType:{ayaType}, AyaEvent:{ayaEvent}]"); try { - var HasTags = inTags != null && inTags.Count > 0; + // var HasTags = inTags != null && inTags.Count > 0; using (AyContext ct = AyaNova.Util.ServiceProviderProvider.DBContext) { - - //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) + //switch through AyaEvent then individual Ayatypes as required for event types + switch (ayaEvent) { - //CONDITION CHECK Tags condition - if (sub.Tags.Count > 0) - { - if (!HasTags) - continue;//not a match, this sub needs tags and we don't have any - - //bool existsCheck = list1.All(x => list2.Any(y => x.SupplierId == y.SupplierId)); - //would tell you if all of list1's items are in list2. - if (!sub.Tags.All(z => inTags.Any(x => x == z))) - continue; - } - - //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; - - //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.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: - //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; - } - - - - //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) + case AyaEvent.Created: + case AyaEvent.Modified: + case AyaEvent.Deleted: + default: +#if (DEBUG) + throw (new System.NotSupportedException($"NotifyEventProcessor:HandlePotentialNotificationEvent - AyaEvent {ayaEvent} was specified which is unexpected and not supported")); +#else + break; +#endif } + + + + + + + //################### FIRST ATTEMPT STUFF + // //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) + // { + // //CONDITION CHECK Tags condition + // if (sub.Tags.Count > 0) + // { + // if (!HasTags) + // continue;//not a match, this sub needs tags and we don't have any + + // //bool existsCheck = list1.All(x => list2.Any(y => x.SupplierId == y.SupplierId)); + // //would tell you if all of list1's items are in list2. + // if (!sub.Tags.All(z => inTags.Any(x => x == z))) + // continue; + // } + + // //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; + + // //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.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: + // //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; + // } + + + + // //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) + + + + // } + + } } catch (Exception ex) { - log.LogError(ex, $"Error adding notification event: [{ev.ToString()}]"); + log.LogError(ex, $"Error processing event"); } finally { - log.LogTrace($"Notify event processed: [{ev.ToString()}]"); + log.LogTrace($"Notify event processing completed"); } diff --git a/server/AyaNova/biz/NotifyEventType.cs b/server/AyaNova/biz/NotifyEventType.cs index 7371e9a3..654e571e 100644 --- a/server/AyaNova/biz/NotifyEventType.cs +++ b/server/AyaNova/biz/NotifyEventType.cs @@ -17,10 +17,10 @@ namespace AyaNova.Biz ContractExpiring = 5, CSRAccepted = 6, CSRRejected = 7, - WorkorderClosed = 8, - QuoteStatusChange = 9, - ObjectAge = 10, - ServiceBankDepleted = 11, + WorkorderClosed = 8,//Deprecated? Now fulfilled by workorder status specifically, or.. perhaps this still exists but as when wo set to any closed type status? There is a todo in client end related to thsi + QuoteStatusChange = 9,//quote created / modified + ObjectAge = 10,//upon object created, conditional on AgeValue + ServiceBankDepleted = 11,//any change to service bank triggers this check ReminderImminent = 12, ScheduledOnWorkorder = 13, ScheduledOnWorkorderImminent = 14,