/// <summary> /// Processes an Event and Queues Messages to Subscribers /// </summary> /// <param name="Topic"></param> /// <param name="Event"></param> /// <param name="EventData"></param> /// <returns></returns> public async Task ProcessEvent(string Topic, string EventData) { logger.LogDebug($"Processing ({Topic})"); var topics = await metadataStore.GetTopicsAsync(); if (!topics.Contains(Topic, StringComparer.OrdinalIgnoreCase)) { logger.LogWarning($"Not a valid topic"); return; } var subscriptionDetails = await subscriberStore.GetSubscriptionsToTopic(Topic); if (subscriptionDetails == null || subscriptionDetails.Count() == 0) { logger.LogWarning($"No Subscribers"); return; } // Create Messages to Notify all Subscribers foreach (var subscriptionDetail in subscriptionDetails) { await subscriberQueueStore.EnqueueMessageAsync(new SubscriberMessage { DestinationUri = new Uri(subscriptionDetail.BaseUri, subscriptionDetail.RelativePath), SubscriberId = subscriptionDetail.SubscriberId, JsonBody = EventData }); } }
/// <summary> /// Processes an Update to an Object and Notifies any Subscribers of the Update /// </summary> /// <param name="ObjectType"></param> /// <param name="ObjectId"></param> /// <param name="jsonObject"></param> /// <returns></returns> public async Task UpdateObject(string ObjectType, string ObjectId, string jsonObject) { logger.LogDebug($"Processing ({ObjectType},{ObjectId})"); // Check for valid Metadata Type var objectTypes = await metadataStore.GetObjectTypesAsync(); if (!objectTypes.Any(ot => ot.Equals(ObjectType, StringComparison.OrdinalIgnoreCase))) { logger.LogWarning($"Not a valid ObjectType"); return; } // Update the Object var existingObject = await objectStore.GetObjectAsync(ObjectType, ObjectId); var storedObject = EventStoreSerialization.DeSerializeObject(existingObject ?? "{}"); var updatedObject = EventStoreSerialization.DeSerializeObject(jsonObject); storedObject["_id"] = ObjectId; foreach (var update in updatedObject) { storedObject[update.Key] = update.Value; } var newJson = EventStoreSerialization.SerializeObject(storedObject); await objectStore.SetObjectAsync(ObjectType, ObjectId, newJson); // Check for Subscribers var subscriptionDetails = await subscriberStore.GetSubscriptionsToObjectType(ObjectType); if (subscriptionDetails == null || subscriptionDetails.Count() == 0) { logger.LogWarning($"No Subscribers"); return; } // Create Messages to Notify all Subscribers foreach (var subscriptionDetail in subscriptionDetails) { await subscriberQueueStore.EnqueueMessageAsync(new SubscriberMessage { DestinationUri = new Uri(subscriptionDetail.BaseUri, subscriptionDetail.RelativePath), SubscriberId = subscriptionDetail.SubscriberId, JsonBody = newJson }); } }