Scorum
advertising_api.hpp
Go to the documentation of this file.
1 #pragma once
8 
9 #include <boost/range/algorithm/transform.hpp>
10 #include <boost/range/algorithm/sort.hpp>
11 
12 namespace scorum {
13 namespace app {
15 {
16 public:
17  impl(chain::database& db, chain::data_service_factory_i& services)
18  : _db(db)
19  , _services(services)
20  , _adv_service(_services.advertising_property_service())
21  , _account_service(_services.account_service())
22  , _banner_budget_service(_services.banner_budget_service())
23  , _post_budget_service(_services.post_budget_service())
24  , _dyn_props_service(_services.dynamic_global_property_service())
25  {
26  }
27 
28  fc::optional<account_api_obj> get_moderator() const
29  {
30  auto& adv_property_object = _adv_service.get();
31 
32  if (adv_property_object.moderator == SCORUM_MISSING_MODERATOR_ACCOUNT)
33  return {};
34 
35  auto& moderator_account = _account_service.get_account(adv_property_object.moderator);
36  return account_api_obj(moderator_account, _db);
37  }
38 
39  std::vector<budget_api_obj> get_user_budgets(const std::string& user) const
40  {
41  auto post_budgets = _post_budget_service.get_budgets(user);
42  auto banner_budgets = _banner_budget_service.get_budgets(user);
43 
44  std::vector<budget_api_obj> ret;
45  ret.reserve(post_budgets.size() + banner_budgets.size());
46 
47  boost::transform(post_budgets, std::back_inserter(ret),
48  [](const post_budget_object& o) { return budget_api_obj(o); });
49  boost::transform(banner_budgets, std::back_inserter(ret),
50  [](const banner_budget_object& o) { return budget_api_obj(o); });
51 
52  boost::sort(ret, [](const budget_api_obj& l, const budget_api_obj& r) { return l.created > r.created; });
53 
54  return ret;
55  }
56 
57  fc::optional<budget_api_obj> get_budget(const uuid_type& uuid, budget_type type) const
58  {
59  switch (type)
60  {
61  case budget_type::post:
62  return get_budget(_post_budget_service, uuid);
63 
64  case budget_type::banner:
65  return get_budget(_banner_budget_service, uuid);
66  }
67 
68  FC_THROW("unreachable");
69  }
70 
71  std::vector<budget_api_obj> get_current_winners(budget_type type) const
72  {
73  switch (type)
74  {
75  case budget_type::post:
77 
78  case budget_type::banner:
80  }
81 
82  FC_THROW("unreachable");
83  }
84 
85  std::vector<percent_type> get_auction_coefficients(budget_type type) const
86  {
87  switch (type)
88  {
89  case budget_type::post:
90  return std::vector<percent_type>{ _adv_service.get().auction_post_coefficients.begin(),
91  _adv_service.get().auction_post_coefficients.end() };
92 
93  case budget_type::banner:
94  return std::vector<percent_type>{ _adv_service.get().auction_banner_coefficients.begin(),
95  _adv_service.get().auction_banner_coefficients.end() };
96  }
97 
98  FC_THROW("unreachable");
99  }
100 
101 private:
102  template <budget_type budget_type_v>
103  fc::optional<budget_api_obj> get_budget(const chain::adv_budget_service_i<budget_type_v>& budget_service,
104  const uuid_type& uuid) const
105  {
106  fc::optional<budget_api_obj> ret;
107 
108  if (budget_service.is_exists(uuid))
109  ret = budget_service.get(uuid);
110 
111  return ret;
112  }
113 
114  template <budget_type budget_type_v>
115  std::vector<budget_api_obj>
117  {
119 
120  auto head_block_time = _dyn_props_service.get().time;
121  const auto& auction_coeffs = _adv_service.get().get_auction_coefficients<budget_type_v>();
122 
123  auto budgets = budget_service.get_top_budgets(head_block_time, auction_coeffs.size());
124 
125  std::vector<budget_api_obj> ret;
126  ret.reserve(auction_coeffs.size());
127 
128  boost::transform(budgets, std::back_inserter(ret), [](const object_type& o) { return budget_api_obj(o); });
129 
130  return ret;
131  }
132 
133 public:
135 
136  chain::data_service_factory_i& _services;
142 };
143 }
144 }
chain::account_service_i & _account_service
std::vector< budget_api_obj > get_current_winners(budget_type type) const
chain::post_budget_service_i & _post_budget_service
std::vector< percent_type > get_auction_coefficients(budget_type type) const
std::vector< budget_api_obj > get_user_budgets(const std::string &user) const
chain::banner_budget_service_i & _banner_budget_service
chain::advertising_property_service_i & _adv_service
chain::dynamic_global_property_service_i & _dyn_props_service
fc::optional< account_api_obj > get_moderator() const
impl(chain::database &db, chain::data_service_factory_i &services)
chain::data_service_factory_i & _services
fc::optional< budget_api_obj > get_budget(const uuid_type &uuid, budget_type type) const
tracks the blockchain state in an extensible manner
Definition: database.hpp:52
Definition: asset.cpp:15
boost::uuids::uuid uuid_type
Definition: types.hpp:53
virtual const account_object & get_account(const account_name_type &) const =0
virtual budgets_type get_budgets() const =0
virtual bool is_exists(const uuid_type &uuid) const =0
virtual budgets_type get_top_budgets(const fc::time_point_sec &until, uint16_t limit) const =0
virtual const adv_budget_object< budget_type_v > & get(const oid< adv_budget_object< budget_type_v >> &) const =0
virtual const object_type & get() const =0