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