Use url_view for telemetry uris

This change refactor telemetry code to use bmcweb utility function for
uri construction, which is safe and preferred way, instead of string
operations.

Testing done:
- Some basic GET operations done on Telemetry, no regression.

Signed-off-by: Szymon Dompke <szymon.dompke@intel.com>
Change-Id: I6de5d79a078944d398357f27dc0c201c130c4302
diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 90c7e87..759c798 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -504,14 +504,16 @@
     void filterAndSendReports(const std::string& reportId,
                               const telemetry::TimestampReadings& var)
     {
-        std::string mrdUri = telemetry::metricReportDefinitionUri + ("/" + id);
+        boost::urls::url mrdUri =
+            crow::utility::urlFromPieces("redfish", "v1", "TelemetryService",
+                                         "MetricReportDefinitions", reportId);
 
         // Empty list means no filter. Send everything.
         if (!metricReportDefinitions.empty())
         {
             if (std::find(metricReportDefinitions.begin(),
                           metricReportDefinitions.end(),
-                          mrdUri) == metricReportDefinitions.end())
+                          mrdUri.string()) == metricReportDefinitions.end())
             {
                 return;
             }
diff --git a/redfish-core/include/utils/telemetry_utils.hpp b/redfish-core/include/utils/telemetry_utils.hpp
index 8aeff0d..6930d0a 100644
--- a/redfish-core/include/utils/telemetry_utils.hpp
+++ b/redfish-core/include/utils/telemetry_utils.hpp
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "dbus_utility.hpp"
+#include "utility.hpp"
 
 namespace redfish
 {
@@ -9,10 +10,6 @@
 {
 constexpr const char* service = "xyz.openbmc_project.Telemetry";
 constexpr const char* reportInterface = "xyz.openbmc_project.Telemetry.Report";
-constexpr const char* metricReportDefinitionUri =
-    "/redfish/v1/TelemetryService/MetricReportDefinitions";
-constexpr const char* metricReportUri =
-    "/redfish/v1/TelemetryService/MetricReports";
 
 inline std::string getDbusReportPath(const std::string& id)
 {
diff --git a/redfish-core/lib/metric_report.hpp b/redfish-core/lib/metric_report.hpp
index 89bd8db..2fb8d82 100644
--- a/redfish-core/lib/metric_report.hpp
+++ b/redfish-core/lib/metric_report.hpp
@@ -14,6 +14,9 @@
 namespace telemetry
 {
 
+constexpr const char* metricReportUri =
+    "/redfish/v1/TelemetryService/MetricReports";
+
 using Readings =
     std::vector<std::tuple<std::string, std::string, double, uint64_t>>;
 using TimestampReadings = std::tuple<uint64_t, Readings>;
@@ -39,11 +42,16 @@
                        const TimestampReadings& timestampReadings)
 {
     json["@odata.type"] = "#MetricReport.v1_3_0.MetricReport";
-    json["@odata.id"] = telemetry::metricReportUri + std::string("/") + id;
+    json["@odata.id"] =
+        crow::utility::urlFromPieces("redfish", "v1", "TelemetryService",
+                                     "MetricReports", id)
+            .string();
     json["Id"] = id;
     json["Name"] = id;
     json["MetricReportDefinition"]["@odata.id"] =
-        telemetry::metricReportDefinitionUri + std::string("/") + id;
+        crow::utility::urlFromPieces("redfish", "v1", "TelemetryService",
+                                     "MetricReportDefinitions", id)
+            .string();
 
     const auto& [timestamp, readings] = timestampReadings;
     json["Timestamp"] = crow::utility::getDateTimeUintMs(timestamp);
@@ -62,7 +70,7 @@
                 asyncResp->res.jsonValue["@odata.type"] =
                     "#MetricReportCollection.MetricReportCollection";
                 asyncResp->res.jsonValue["@odata.id"] =
-                    "/redfish/v1/TelemetryService/MetricReports";
+                    telemetry::metricReportUri;
                 asyncResp->res.jsonValue["Name"] = "Metric Report Collection";
                 const std::vector<const char*> interfaces{
                     telemetry::reportInterface};
diff --git a/redfish-core/lib/metric_report_definition.hpp b/redfish-core/lib/metric_report_definition.hpp
index a27ec6b..e960af7 100644
--- a/redfish-core/lib/metric_report_definition.hpp
+++ b/redfish-core/lib/metric_report_definition.hpp
@@ -18,6 +18,9 @@
 namespace telemetry
 {
 
+constexpr const char* metricReportDefinitionUri =
+    "/redfish/v1/TelemetryService/MetricReportDefinitions";
+
 using ReadingParameters =
     std::vector<std::tuple<sdbusplus::message::object_path, std::string,
                            std::string, std::string>>;
@@ -30,11 +33,15 @@
     asyncResp->res.jsonValue["@odata.type"] =
         "#MetricReportDefinition.v1_3_0.MetricReportDefinition";
     asyncResp->res.jsonValue["@odata.id"] =
-        telemetry::metricReportDefinitionUri + std::string("/") + id;
+        crow::utility::urlFromPieces("redfish", "v1", "TelemetryService",
+                                     "MetricReportDefinitions", id)
+            .string();
     asyncResp->res.jsonValue["Id"] = id;
     asyncResp->res.jsonValue["Name"] = id;
     asyncResp->res.jsonValue["MetricReport"]["@odata.id"] =
-        telemetry::metricReportUri + std::string("/") + id;
+        crow::utility::urlFromPieces("redfish", "v1", "TelemetryService",
+                                     "MetricReports", id)
+            .string();
     asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
     asyncResp->res.jsonValue["ReportUpdates"] = "Overwrite";
 
@@ -365,7 +372,7 @@
                     "#MetricReportDefinitionCollection."
                     "MetricReportDefinitionCollection";
                 asyncResp->res.jsonValue["@odata.id"] =
-                    "/redfish/v1/TelemetryService/MetricReportDefinitions";
+                    telemetry::metricReportDefinitionUri;
                 asyncResp->res.jsonValue["Name"] =
                     "Metric Definition Collection";
                 const std::vector<const char*> interfaces{
diff --git a/redfish-core/lib/trigger.hpp b/redfish-core/lib/trigger.hpp
index cdd5781..da6a5db 100644
--- a/redfish-core/lib/trigger.hpp
+++ b/redfish-core/lib/trigger.hpp
@@ -143,9 +143,11 @@
     nlohmann::json reports = nlohmann::json::array();
     for (const std::string& name : reportNames)
     {
-        reports.push_back({
-            {"@odata.id", metricReportDefinitionUri + std::string("/") + name},
-        });
+        reports.push_back(
+            {{"@odata.id",
+              crow::utility::urlFromPieces("redfish", "v1", "TelemetryService",
+                                           "MetricReportDefinitions", name)
+                  .string()}});
     }
 
     return reports;
@@ -214,7 +216,9 @@
     }
 
     json["@odata.type"] = "#Triggers.v1_2_0.Triggers";
-    json["@odata.id"] = triggerUri + std::string("/") + id;
+    json["@odata.id"] = crow::utility::urlFromPieces(
+                            "redfish", "v1", "TelemetryService", "Triggers", id)
+                            .string();
     json["Id"] = id;
     json["Name"] = *name;
 
@@ -282,8 +286,7 @@
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
                 asyncResp->res.jsonValue["@odata.type"] =
                     "#TriggersCollection.TriggersCollection";
-                asyncResp->res.jsonValue["@odata.id"] =
-                    "/redfish/v1/TelemetryService/Triggers";
+                asyncResp->res.jsonValue["@odata.id"] = telemetry::triggerUri;
                 asyncResp->res.jsonValue["Name"] = "Triggers Collection";
                 const std::vector<const char*> interfaces{
                     telemetry::triggerInterface};