1 #pragma once
2 
3 #include "app.hpp"
4 #include "logging.hpp"
5 #include "query.hpp"
6 #include "registries/privilege_registry.hpp"
7 #include "utils/chassis_utils.hpp"
8 #include "utils/json_utils.hpp"
9 
10 #include <optional>
11 #include <string>
12 
13 namespace redfish
14 {
15 
16 inline void doThermalSubsystemCollection(
17     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
18     const std::string& chassisId,
19     const std::optional<std::string>& validChassisPath)
20 {
21     if (!validChassisPath)
22     {
23         BMCWEB_LOG_ERROR << "Not a valid chassis ID" << chassisId;
24         messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
25         return;
26     }
27 
28     asyncResp->res.addHeader(
29         boost::beast::http::field::link,
30         "</redfish/v1/JsonSchemas/ThermalSubsystem/ThermalSubsystem.json>; rel=describedby");
31     asyncResp->res.jsonValue["@odata.type"] =
32         "#ThermalSubsystem.v1_0_0.ThermalSubsystem";
33     asyncResp->res.jsonValue["Name"] = "Thermal Subsystem";
34     asyncResp->res.jsonValue["Id"] = "ThermalSubsystem";
35 
36     asyncResp->res.jsonValue["@odata.id"] = crow::utility::urlFromPieces(
37         "redfish", "v1", "Chassis", chassisId, "ThermalSubsystem");
38 
39     asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
40     asyncResp->res.jsonValue["Status"]["Health"] = "OK";
41 }
42 
43 inline void handleThermalSubsystemCollectionHead(
44     App& app, const crow::Request& req,
45     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
46     const std::string& chassisId)
47 {
48     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
49     {
50         return;
51     }
52 
53     auto respHandler = [asyncResp, chassisId](
54                            const std::optional<std::string>& validChassisPath) {
55         if (!validChassisPath)
56         {
57             messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
58             return;
59         }
60         asyncResp->res.addHeader(
61             boost::beast::http::field::link,
62             "</redfish/v1/JsonSchemas/ThermalSubsystem/ThermalSubsystem.json>; rel=describedby");
63     };
64     redfish::chassis_utils::getValidChassisPath(asyncResp, chassisId,
65                                                 std::bind_front(respHandler));
66 }
67 
68 inline void handleThermalSubsystemCollectionGet(
69     App& app, const crow::Request& req,
70     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
71     const std::string& chassisId)
72 {
73     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
74     {
75         return;
76     }
77 
78     redfish::chassis_utils::getValidChassisPath(
79         asyncResp, chassisId,
80         std::bind_front(doThermalSubsystemCollection, asyncResp, chassisId));
81 }
82 
83 inline void requestRoutesThermalSubsystem(App& app)
84 {
85     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/ThermalSubsystem/")
86         .privileges(redfish::privileges::headThermalSubsystem)
87         .methods(boost::beast::http::verb::head)(std::bind_front(
88             handleThermalSubsystemCollectionHead, std::ref(app)));
89 
90     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/ThermalSubsystem/")
91         .privileges(redfish::privileges::getThermalSubsystem)
92         .methods(boost::beast::http::verb::get)(std::bind_front(
93             handleThermalSubsystemCollectionGet, std::ref(app)));
94 }
95 
96 } // namespace redfish
97