12973963eSXiaochao Ma #pragma once
22973963eSXiaochao Ma 
32973963eSXiaochao Ma #include "app.hpp"
4ce05f6c4SNan Zhou #include "logging.hpp"
52973963eSXiaochao Ma #include "query.hpp"
62973963eSXiaochao Ma #include "registries/privilege_registry.hpp"
72973963eSXiaochao Ma #include "utils/chassis_utils.hpp"
82973963eSXiaochao Ma #include "utils/json_utils.hpp"
92973963eSXiaochao Ma 
10ce05f6c4SNan Zhou #include <optional>
11ce05f6c4SNan Zhou #include <string>
12ce05f6c4SNan Zhou 
132973963eSXiaochao Ma namespace redfish
142973963eSXiaochao Ma {
152973963eSXiaochao Ma 
162973963eSXiaochao Ma inline void doThermalSubsystemCollection(
172973963eSXiaochao Ma     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
182973963eSXiaochao Ma     const std::string& chassisId,
192973963eSXiaochao Ma     const std::optional<std::string>& validChassisPath)
202973963eSXiaochao Ma {
212973963eSXiaochao Ma     if (!validChassisPath)
222973963eSXiaochao Ma     {
232973963eSXiaochao Ma         BMCWEB_LOG_ERROR << "Not a valid chassis ID" << chassisId;
242973963eSXiaochao Ma         messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
252973963eSXiaochao Ma         return;
262973963eSXiaochao Ma     }
27*1aee751cSGeorge Liu 
28*1aee751cSGeorge Liu     asyncResp->res.addHeader(
29*1aee751cSGeorge Liu         boost::beast::http::field::link,
30*1aee751cSGeorge Liu         "</redfish/v1/JsonSchemas/ThermalSubsystem/ThermalSubsystem.json>; rel=describedby");
312973963eSXiaochao Ma     asyncResp->res.jsonValue["@odata.type"] =
322973963eSXiaochao Ma         "#ThermalSubsystem.v1_0_0.ThermalSubsystem";
332973963eSXiaochao Ma     asyncResp->res.jsonValue["Name"] = "Thermal Subsystem";
342973963eSXiaochao Ma     asyncResp->res.jsonValue["Id"] = "ThermalSubsystem";
352973963eSXiaochao Ma 
362973963eSXiaochao Ma     asyncResp->res.jsonValue["@odata.id"] = crow::utility::urlFromPieces(
372973963eSXiaochao Ma         "redfish", "v1", "Chassis", chassisId, "ThermalSubsystem");
382973963eSXiaochao Ma 
392973963eSXiaochao Ma     asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
402973963eSXiaochao Ma     asyncResp->res.jsonValue["Status"]["Health"] = "OK";
412973963eSXiaochao Ma }
422973963eSXiaochao Ma 
43*1aee751cSGeorge Liu inline void handleThermalSubsystemCollectionHead(
442973963eSXiaochao Ma     App& app, const crow::Request& req,
452973963eSXiaochao Ma     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
46*1aee751cSGeorge Liu     const std::string& chassisId)
472973963eSXiaochao Ma {
482973963eSXiaochao Ma     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
492973963eSXiaochao Ma     {
502973963eSXiaochao Ma         return;
512973963eSXiaochao Ma     }
52*1aee751cSGeorge Liu 
53*1aee751cSGeorge Liu     auto respHandler = [asyncResp, chassisId](
54*1aee751cSGeorge Liu                            const std::optional<std::string>& validChassisPath) {
55*1aee751cSGeorge Liu         if (!validChassisPath)
56*1aee751cSGeorge Liu         {
57*1aee751cSGeorge Liu             messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
58*1aee751cSGeorge Liu             return;
59*1aee751cSGeorge Liu         }
60*1aee751cSGeorge Liu         asyncResp->res.addHeader(
61*1aee751cSGeorge Liu             boost::beast::http::field::link,
62*1aee751cSGeorge Liu             "</redfish/v1/JsonSchemas/ThermalSubsystem/ThermalSubsystem.json>; rel=describedby");
63*1aee751cSGeorge Liu     };
64*1aee751cSGeorge Liu     redfish::chassis_utils::getValidChassisPath(asyncResp, chassisId,
65*1aee751cSGeorge Liu                                                 std::bind_front(respHandler));
66*1aee751cSGeorge Liu }
67*1aee751cSGeorge Liu 
68*1aee751cSGeorge Liu inline void handleThermalSubsystemCollectionGet(
69*1aee751cSGeorge Liu     App& app, const crow::Request& req,
70*1aee751cSGeorge Liu     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
71*1aee751cSGeorge Liu     const std::string& chassisId)
72*1aee751cSGeorge Liu {
73*1aee751cSGeorge Liu     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
74*1aee751cSGeorge Liu     {
75*1aee751cSGeorge Liu         return;
76*1aee751cSGeorge Liu     }
772973963eSXiaochao Ma 
782973963eSXiaochao Ma     redfish::chassis_utils::getValidChassisPath(
792973963eSXiaochao Ma         asyncResp, chassisId,
802973963eSXiaochao Ma         std::bind_front(doThermalSubsystemCollection, asyncResp, chassisId));
812973963eSXiaochao Ma }
822973963eSXiaochao Ma 
832973963eSXiaochao Ma inline void requestRoutesThermalSubsystem(App& app)
842973963eSXiaochao Ma {
852973963eSXiaochao Ma     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/ThermalSubsystem/")
86*1aee751cSGeorge Liu         .privileges(redfish::privileges::headThermalSubsystem)
87*1aee751cSGeorge Liu         .methods(boost::beast::http::verb::head)(std::bind_front(
88*1aee751cSGeorge Liu             handleThermalSubsystemCollectionHead, std::ref(app)));
89*1aee751cSGeorge Liu 
90*1aee751cSGeorge Liu     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/ThermalSubsystem/")
912973963eSXiaochao Ma         .privileges(redfish::privileges::getThermalSubsystem)
922973963eSXiaochao Ma         .methods(boost::beast::http::verb::get)(std::bind_front(
932973963eSXiaochao Ma             handleThermalSubsystemCollectionGet, std::ref(app)));
942973963eSXiaochao Ma }
952973963eSXiaochao Ma 
962973963eSXiaochao Ma } // namespace redfish
97