Make UserSubscription as shared_ptr in Subscription

Currently UserSubscription are used as value in Subscription. This
causes the copy of the object between subscriptionsMap and
subscriptionConfigMap when doing PATCH.

Using a shared_ptr for UserSubscription avoids the memory copy of it.

Tested:

- Using Redfish Event Listener, test subscriptions and eventing.
- Redfish Service Validator passes

Change-Id: I5821b72f28ba737a5c9b75288d377766c84c6a6a
Signed-off-by: Myung Bae <myungbae@us.ibm.com>
diff --git a/include/event_service_store.hpp b/include/event_service_store.hpp
index bf4e545..b0a1d97 100644
--- a/include/event_service_store.hpp
+++ b/include/event_service_store.hpp
@@ -310,7 +310,7 @@
 class EventServiceStore
 {
   public:
-    boost::container::flat_map<std::string, UserSubscription>
+    boost::container::flat_map<std::string, std::shared_ptr<UserSubscription>>
         subscriptionsConfigMap;
     EventServiceConfig eventServiceConfig;
 
@@ -324,18 +324,6 @@
     {
         return eventServiceConfig;
     }
-
-    void updateUserSubscriptionConfig(const UserSubscription& userSub)
-    {
-        const std::string& id = userSub.id;
-        auto obj = subscriptionsConfigMap.find(id);
-        if (obj == subscriptionsConfigMap.end())
-        {
-            BMCWEB_LOG_INFO("No UserSubscription exist with ID:{}", id);
-            return;
-        }
-        obj->second = userSub;
-    }
 };
 
 } // namespace persistent_data
diff --git a/include/persistent_data.hpp b/include/persistent_data.hpp
index ef2adf3..afcdb14 100644
--- a/include/persistent_data.hpp
+++ b/include/persistent_data.hpp
@@ -172,11 +172,11 @@
                             BMCWEB_LOG_DEBUG("Restored subscription: {} {}",
                                              newSub->id, newSub->customText);
 
-                            boost::container::flat_map<
-                                std::string, UserSubscription>& configMap =
-                                EventServiceStore::getInstance()
-                                    .subscriptionsConfigMap;
-                            configMap.emplace(newSub->id, *newSub);
+                            EventServiceStore::getInstance()
+                                .subscriptionsConfigMap.emplace(
+                                    newSub->id,
+                                    std::make_shared<UserSubscription>(
+                                        std::move(*newSub)));
                         }
                     }
                     else
@@ -299,7 +299,11 @@
         for (const auto& it :
              EventServiceStore::getInstance().subscriptionsConfigMap)
         {
-            const UserSubscription& subValue = it.second;
+            if (it.second == nullptr)
+            {
+                continue;
+            }
+            const UserSubscription& subValue = *it.second;
             if (subValue.subscriptionType == "SSE")
             {
                 BMCWEB_LOG_DEBUG("The subscription type is SSE, so skipping.");