1*5ae1f7f3Szhanghch05 #pragma once
2*5ae1f7f3Szhanghch05 
3*5ae1f7f3Szhanghch05 #include "app.hpp"
4*5ae1f7f3Szhanghch05 #include "query.hpp"
5*5ae1f7f3Szhanghch05 #include "registries/privilege_registry.hpp"
6*5ae1f7f3Szhanghch05 #include "utils/chassis_utils.hpp"
7*5ae1f7f3Szhanghch05 
8*5ae1f7f3Szhanghch05 #include <functional>
9*5ae1f7f3Szhanghch05 #include <memory>
10*5ae1f7f3Szhanghch05 #include <optional>
11*5ae1f7f3Szhanghch05 #include <string>
12*5ae1f7f3Szhanghch05 
13*5ae1f7f3Szhanghch05 namespace redfish
14*5ae1f7f3Szhanghch05 {
15*5ae1f7f3Szhanghch05 inline void
doThermalMetrics(const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & chassisId,const std::optional<std::string> & validChassisPath)16*5ae1f7f3Szhanghch05     doThermalMetrics(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
17*5ae1f7f3Szhanghch05                      const std::string& chassisId,
18*5ae1f7f3Szhanghch05                      const std::optional<std::string>& validChassisPath)
19*5ae1f7f3Szhanghch05 {
20*5ae1f7f3Szhanghch05     if (!validChassisPath)
21*5ae1f7f3Szhanghch05     {
22*5ae1f7f3Szhanghch05         messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
23*5ae1f7f3Szhanghch05         return;
24*5ae1f7f3Szhanghch05     }
25*5ae1f7f3Szhanghch05 
26*5ae1f7f3Szhanghch05     asyncResp->res.addHeader(
27*5ae1f7f3Szhanghch05         boost::beast::http::field::link,
28*5ae1f7f3Szhanghch05         "</redfish/v1/JsonSchemas/ThermalMetrics/ThermalMetrics.json>; rel=describedby");
29*5ae1f7f3Szhanghch05     asyncResp->res.jsonValue["@odata.type"] =
30*5ae1f7f3Szhanghch05         "#ThermalMetrics.v1_0_1.ThermalMetrics";
31*5ae1f7f3Szhanghch05     asyncResp->res.jsonValue["@odata.id"] = boost::urls::format(
32*5ae1f7f3Szhanghch05         "/redfish/v1/Chassis/{}/ThermalSubsystem/ThermalMetrics", chassisId);
33*5ae1f7f3Szhanghch05     asyncResp->res.jsonValue["Id"] = "ThermalMetrics";
34*5ae1f7f3Szhanghch05     asyncResp->res.jsonValue["Name"] = "Thermal Metrics";
35*5ae1f7f3Szhanghch05 }
36*5ae1f7f3Szhanghch05 
handleThermalMetricsHead(App & app,const crow::Request & req,const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & chassisId)37*5ae1f7f3Szhanghch05 inline void handleThermalMetricsHead(
38*5ae1f7f3Szhanghch05     App& app, const crow::Request& req,
39*5ae1f7f3Szhanghch05     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
40*5ae1f7f3Szhanghch05     const std::string& chassisId)
41*5ae1f7f3Szhanghch05 {
42*5ae1f7f3Szhanghch05     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
43*5ae1f7f3Szhanghch05     {
44*5ae1f7f3Szhanghch05         return;
45*5ae1f7f3Szhanghch05     }
46*5ae1f7f3Szhanghch05 
47*5ae1f7f3Szhanghch05     redfish::chassis_utils::getValidChassisPath(
48*5ae1f7f3Szhanghch05         asyncResp, chassisId,
49*5ae1f7f3Szhanghch05         [asyncResp,
50*5ae1f7f3Szhanghch05          chassisId](const std::optional<std::string>& validChassisPath) {
51*5ae1f7f3Szhanghch05         if (!validChassisPath)
52*5ae1f7f3Szhanghch05         {
53*5ae1f7f3Szhanghch05             messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
54*5ae1f7f3Szhanghch05             return;
55*5ae1f7f3Szhanghch05         }
56*5ae1f7f3Szhanghch05         asyncResp->res.addHeader(
57*5ae1f7f3Szhanghch05             boost::beast::http::field::link,
58*5ae1f7f3Szhanghch05             "</redfish/v1/JsonSchemas/ThermalMetrics/ThermalMetrics.json>; rel=describedby");
59*5ae1f7f3Szhanghch05     });
60*5ae1f7f3Szhanghch05 }
61*5ae1f7f3Szhanghch05 
62*5ae1f7f3Szhanghch05 inline void
handleThermalMetricsGet(App & app,const crow::Request & req,const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & chassisId)63*5ae1f7f3Szhanghch05     handleThermalMetricsGet(App& app, const crow::Request& req,
64*5ae1f7f3Szhanghch05                             const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
65*5ae1f7f3Szhanghch05                             const std::string& chassisId)
66*5ae1f7f3Szhanghch05 {
67*5ae1f7f3Szhanghch05     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
68*5ae1f7f3Szhanghch05     {
69*5ae1f7f3Szhanghch05         return;
70*5ae1f7f3Szhanghch05     }
71*5ae1f7f3Szhanghch05 
72*5ae1f7f3Szhanghch05     redfish::chassis_utils::getValidChassisPath(
73*5ae1f7f3Szhanghch05         asyncResp, chassisId,
74*5ae1f7f3Szhanghch05         std::bind_front(doThermalMetrics, asyncResp, chassisId));
75*5ae1f7f3Szhanghch05 }
76*5ae1f7f3Szhanghch05 
requestRoutesThermalMetrics(App & app)77*5ae1f7f3Szhanghch05 inline void requestRoutesThermalMetrics(App& app)
78*5ae1f7f3Szhanghch05 {
79*5ae1f7f3Szhanghch05     BMCWEB_ROUTE(app,
80*5ae1f7f3Szhanghch05                  "/redfish/v1/Chassis/<str>/ThermalSubsystem/ThermalMetrics/")
81*5ae1f7f3Szhanghch05         .privileges(redfish::privileges::headThermalMetrics)
82*5ae1f7f3Szhanghch05         .methods(boost::beast::http::verb::head)(
83*5ae1f7f3Szhanghch05             std::bind_front(handleThermalMetricsHead, std::ref(app)));
84*5ae1f7f3Szhanghch05 
85*5ae1f7f3Szhanghch05     BMCWEB_ROUTE(app,
86*5ae1f7f3Szhanghch05                  "/redfish/v1/Chassis/<str>/ThermalSubsystem/ThermalMetrics/")
87*5ae1f7f3Szhanghch05         .privileges(redfish::privileges::getThermalMetrics)
88*5ae1f7f3Szhanghch05         .methods(boost::beast::http::verb::get)(
89*5ae1f7f3Szhanghch05             std::bind_front(handleThermalMetricsGet, std::ref(app)));
90*5ae1f7f3Szhanghch05 }
91*5ae1f7f3Szhanghch05 } // namespace redfish
92