1 #pragma once
2 
3 #include <boost/container/flat_map.hpp>
4 
5 #include <string>
6 #include <vector>
7 
8 namespace redfish
9 {
10 namespace collection_util
11 {
12 
13 /**
14  * @brief Populate the collection "Members" from a GetSubTreePaths search of
15  *        inventory
16  *
17  * @param[i,o] aResp  Async response object
18  * @param[i]   collectionPath  Redfish collection path which is used for the
19  *             Members Redfish Path
20  * @param[i]   interfaces  List of interfaces to constrain the GetSubTree search
21  * @param[in]  subtree     D-Bus base path to constrain search to.
22  *
23  * @return void
24  */
25 inline void
26     getCollectionMembers(std::shared_ptr<AsyncResp> aResp,
27                          const std::string& collectionPath,
28                          const std::vector<const char*>& interfaces,
29                          const char* subtree = "/xyz/openbmc_project/inventory")
30 {
31     BMCWEB_LOG_DEBUG << "Get collection members for: " << collectionPath;
32     crow::connections::systemBus->async_method_call(
33         [collectionPath,
34          aResp{std::move(aResp)}](const boost::system::error_code ec,
35                                   const std::vector<std::string>& objects) {
36             if (ec)
37             {
38                 BMCWEB_LOG_DEBUG << "DBUS response error";
39                 messages::internalError(aResp->res);
40                 return;
41             }
42             nlohmann::json& members = aResp->res.jsonValue["Members"];
43             members = nlohmann::json::array();
44 
45             for (const auto& object : objects)
46             {
47                 sdbusplus::message::object_path path(object);
48                 std::string leaf = path.filename();
49                 if (leaf.empty())
50                 {
51                     continue;
52                 }
53                 std::string newPath = collectionPath;
54                 newPath += '/';
55                 newPath += leaf;
56                 members.push_back({{"@odata.id", std::move(newPath)}});
57             }
58             aResp->res.jsonValue["Members@odata.count"] = members.size();
59         },
60         "xyz.openbmc_project.ObjectMapper",
61         "/xyz/openbmc_project/object_mapper",
62         "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", subtree, 0,
63         interfaces);
64 }
65 
66 } // namespace collection_util
67 } // namespace redfish
68