xref: /openbmc/bmcweb/features/redfish/lib/odata.hpp (revision d5c0172e0335df05db2eaae3dae2c7d3def56089)
1*d5c0172eSEd Tanous #pragma once
2*d5c0172eSEd Tanous 
3*d5c0172eSEd Tanous #include "app.hpp"
4*d5c0172eSEd Tanous #include "error_messages.hpp"
5*d5c0172eSEd Tanous #include "http_request.hpp"
6*d5c0172eSEd Tanous #include "http_response.hpp"
7*d5c0172eSEd Tanous #include "query.hpp"
8*d5c0172eSEd Tanous #include "registries/privilege_registry.hpp"
9*d5c0172eSEd Tanous #include "utility.hpp"
10*d5c0172eSEd Tanous 
11*d5c0172eSEd Tanous #include <boost/url/format.hpp>
12*d5c0172eSEd Tanous #include <nlohmann/json.hpp>
13*d5c0172eSEd Tanous 
14*d5c0172eSEd Tanous #include <memory>
15*d5c0172eSEd Tanous #include <ranges>
16*d5c0172eSEd Tanous #include <string>
17*d5c0172eSEd Tanous #include <string_view>
18*d5c0172eSEd Tanous 
19*d5c0172eSEd Tanous namespace redfish
20*d5c0172eSEd Tanous {
21*d5c0172eSEd Tanous 
22*d5c0172eSEd Tanous inline void redfishOdataGet(const crow::Request& /*req*/,
23*d5c0172eSEd Tanous                             const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
24*d5c0172eSEd Tanous {
25*d5c0172eSEd Tanous     nlohmann::json::object_t obj;
26*d5c0172eSEd Tanous     obj["@odata.context"] = "/redfish/v1/$metadata";
27*d5c0172eSEd Tanous     nlohmann::json::array_t value;
28*d5c0172eSEd Tanous     for (std::string_view service :
29*d5c0172eSEd Tanous          {"$metadata", "odata", "JsonSchemas", "Service", "ServiceRoot",
30*d5c0172eSEd Tanous           "Systems", "Chassis", "Managers", "SessionService", "AccountService",
31*d5c0172eSEd Tanous           "UpdateService"})
32*d5c0172eSEd Tanous     {
33*d5c0172eSEd Tanous         nlohmann::json::object_t serviceObj;
34*d5c0172eSEd Tanous         serviceObj["kind"] = "Singleton";
35*d5c0172eSEd Tanous         serviceObj["name"] = "$metadata";
36*d5c0172eSEd Tanous         boost::urls::url url = boost::urls::format("/redfish/v1/{}", service);
37*d5c0172eSEd Tanous         if (service == "Service")
38*d5c0172eSEd Tanous         {
39*d5c0172eSEd Tanous             url = boost::urls::url("/redfish/v1");
40*d5c0172eSEd Tanous         }
41*d5c0172eSEd Tanous         serviceObj["url"] = url;
42*d5c0172eSEd Tanous         value.emplace_back(std::move(serviceObj));
43*d5c0172eSEd Tanous     }
44*d5c0172eSEd Tanous 
45*d5c0172eSEd Tanous     obj["value"] = std::move(value);
46*d5c0172eSEd Tanous 
47*d5c0172eSEd Tanous     asyncResp->res.jsonValue = std::move(obj);
48*d5c0172eSEd Tanous }
49*d5c0172eSEd Tanous 
50*d5c0172eSEd Tanous inline void requestRoutesOdata(App& app)
51*d5c0172eSEd Tanous {
52*d5c0172eSEd Tanous     BMCWEB_ROUTE(app, "/redfish/v1/odata/")
53*d5c0172eSEd Tanous         .methods(boost::beast::http::verb::get)(redfishOdataGet);
54*d5c0172eSEd Tanous }
55*d5c0172eSEd Tanous 
56*d5c0172eSEd Tanous } // namespace redfish
57