blob: 386b4f63e27b6875ba4adcce28a1c67692a2ee1c [file] [log] [blame]
#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_EXPAND_QUERY_AGGREGATOR_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_EXPAND_QUERY_AGGREGATOR_H_
#include <memory>
#include <string>
#include <utility>
#include "absl/strings/string_view.h"
#include "nlohmann/json_fwd.hpp"
#include "tlbmc/redfish/query_parameters.h"
#include "dbus_utility.hpp" // NOLINT
#include "async_resp.hpp" // NOLINT
#include "http_request.hpp" // NOLINT
#include "router_interface.h"
namespace milotic_tlbmc {
// This class will be in charge of aggregating the responses from the expand
// query.
// This class references the implmentation in openbmc gbmcweb.
// https://gbmc.googlesource.com/gbmcweb/+/refs/heads/master/redfish-core/include/query.cpp#742
class ExpandQueryAggregator
: public std::enable_shared_from_this<ExpandQueryAggregator> {
public:
ExpandQueryAggregator() = default;
ExpandQueryAggregator(std::shared_ptr<bmcweb::AsyncResp> final_async_resp,
::crow::RouterInterface* router,
const QueryParameters& query_parameters)
: final_async_resp_(std::move(final_async_resp)),
smart_router_(router),
query_parameters_(query_parameters) {}
void StartQuery();
protected:
std::string CreateExpandQueryUrl(absl::string_view url,
const ExpandNode& expand_node);
void AddResponseToFinalResponse(const nlohmann::json::json_pointer& location,
::crow::Response& sub_response);
void PropogateErrorCodeIfNeeded(const nlohmann::json::json_pointer& location,
::crow::Response& sub_response);
unsigned DetermineFinalErrorCode(unsigned sub_response_code);
std::shared_ptr<bmcweb::AsyncResp> final_async_resp_;
::crow::RouterInterface* smart_router_;
const QueryParameters query_parameters_;
};
} // namespace milotic_tlbmc
#endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_EXPAND_QUERY_AGGREGATOR_H_