Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
campaign.cc
1 #include "campaign/campaign.h"
2 
3 namespace campaign {
4 
5 Campaign::Campaign(const Json::Value &json) {
6  try {
7  if (!json.isObject()) {
8  throw CampaignParseError();
9  }
10 
11  id = json["id"].asString();
12  if (id.empty()) {
13  throw CampaignParseError();
14  }
15 
16  name = json["name"].asString();
17  if (name.empty()) {
18  throw CampaignParseError();
19  }
20 
21  size = json.get("size", 0).asInt64();
22  autoAccept = json.get("autoAccept", false).asBool();
23 
24  for (const auto &o : json["metadata"]) {
25  if (!o.isObject()) {
26  continue;
27  }
28 
29  if (o["type"] == "DESCRIPTION") {
30  if (!description.empty()) {
31  throw CampaignParseError();
32  }
33  description = o["value"].asString();
34  } else if (o["type"] == "ESTIMATED_INSTALLATION_DURATION") {
35  if (estInstallationDuration != 0) {
36  throw CampaignParseError();
37  }
38  estInstallationDuration = std::stoi(o["value"].asString());
39  } else if (o["type"] == "ESTIMATED_PREPARATION_DURATION") {
40  if (estPreparationDuration != 0) {
41  throw CampaignParseError();
42  }
43  estPreparationDuration = std::stoi(o["value"].asString());
44  }
45  }
46 
47  } catch (const std::runtime_error &exc) {
48  LOG_ERROR << exc.what();
49  throw CampaignParseError();
50  } catch (...) {
51  throw CampaignParseError();
52  }
53 }
54 
55 void Campaign::getJson(Json::Value &out) const {
56  out.clear();
57 
58  out["id"] = id;
59  out["name"] = name;
60  out["size"] = Json::UInt(size);
61  out["autoAccept"] = autoAccept;
62 
63  out["metadata"][0]["type"] = "DESCRIPTION";
64  out["metadata"][0]["value"] = description;
65  out["metadata"][1]["type"] = "ESTIMATED_INSTALLATION_DURATION";
66  out["metadata"][1]["value"] = std::to_string(estInstallationDuration);
67  out["metadata"][2]["type"] = "ESTIMATED_PREPARATION_DURATION";
68  out["metadata"][2]["value"] = std::to_string(estPreparationDuration);
69 }
70 
71 std::vector<Campaign> Campaign::campaignsFromJson(const Json::Value &json) {
72  std::vector<Campaign> campaigns;
73 
74  Json::Value campaigns_array;
75  try {
76  if (!json.isObject()) {
77  throw CampaignParseError();
78  }
79  campaigns_array = json["campaigns"];
80  if (!campaigns_array.isArray()) {
81  throw CampaignParseError();
82  }
83  } catch (...) {
84  LOG_ERROR << "Invalid campaigns object: " << json;
85  return {};
86  }
87 
88  for (const auto &c : campaigns_array) {
89  try {
90  campaigns.emplace_back(Campaign(c));
91  } catch (const CampaignParseError &exc) {
92  LOG_ERROR << "Error parsing " << c << ": " << exc.what();
93  }
94  }
95  return campaigns;
96 }
97 
98 void Campaign::JsonFromCampaigns(const std::vector<Campaign> &in, Json::Value &out) {
99  out.clear();
100  auto i = 0;
101  Json::Value json;
102  for (const auto &c : in) {
103  c.getJson(json);
104  out["campaigns"][i] = json;
105  ++i;
106  }
107 }
108 
109 std::vector<Campaign> Campaign::fetchAvailableCampaigns(HttpInterface &http_client, const std::string &tls_server) {
110  HttpResponse response = http_client.get(tls_server + "/campaigner/campaigns", kMaxCampaignsMetaSize);
111  if (!response.isOk()) {
112  LOG_ERROR << "Failed to fetch list of available campaigns";
113  return {};
114  }
115 
116  auto json = response.getJson();
117 
118  LOG_TRACE << "Campaign: " << json;
119 
120  return campaignsFromJson(json);
121 }
122 } // namespace campaign
HttpInterface
Definition: httpinterface.h:38
HttpResponse
Definition: httpinterface.h:17