peerplays_migrated/libraries/chain/include/graphene/chain/offer_object.hpp
Michel Santos 8ec87b404f Enhance secondary_index
Enhance secondary_index by distinguishing between
previous objects loaded from persistence versus
new objects created during the session
2022-01-03 09:49:44 -05:00

117 lines
4.1 KiB
C++

#pragma once
#include <graphene/chain/types.hpp>
#include <graphene/protocol/operations.hpp>
#include <graphene/db/generic_index.hpp>
namespace graphene
{
namespace chain
{
class database;
struct by_expiration_date
{
};
class offer_object : public graphene::db::abstract_object<offer_object>
{
public:
static const uint8_t space_id = protocol_ids;
static const uint8_t type_id = offer_object_type;
account_id_type issuer;
set<nft_id_type> item_ids;
optional<account_id_type> bidder;
optional<asset> bid_price;
asset minimum_price;
asset maximum_price;
bool buying_item;
fc::time_point_sec offer_expiration_date;
offer_id_type get_id() const { return id; }
};
class offer_history_object
: public graphene::db::abstract_object<offer_history_object>
{
public:
static const uint8_t space_id = implementation_ids;
static const uint8_t type_id = impl_offer_history_object_type;
account_id_type issuer;
set<nft_id_type> item_ids;
optional<account_id_type> bidder;
optional<asset> bid_price;
asset minimum_price;
asset maximum_price;
bool buying_item;
fc::time_point_sec offer_expiration_date;
result_type result;
offer_history_id_type get_id() const { return id; }
};
class offer_item_index : public secondary_index
{
public:
virtual void object_loaded(const object &obj) override;
virtual void object_created(const object &obj) override;
virtual void object_removed(const object &obj) override;
virtual void about_to_modify(const object &before) override{};
virtual void object_modified(const object &after) override;
set<nft_id_type> _locked_items;
};
struct compare_by_expiration_date
{
bool operator()(const fc::time_point_sec &o1,
const fc::time_point_sec &o2) const
{
return o1 < o2;
}
};
using offer_multi_index_type = multi_index_container<
offer_object,
indexed_by<
ordered_unique<tag<by_id>, member<object, object_id_type, &object::id>>,
ordered_non_unique<tag<by_expiration_date>,
member<offer_object, fc::time_point_sec,
&offer_object::offer_expiration_date>,
compare_by_expiration_date>>>;
using offer_history_multi_index_type = multi_index_container<
offer_history_object,
indexed_by<
ordered_unique<tag<by_id>, member<object, object_id_type, &object::id>>,
ordered_non_unique<tag<by_expiration_date>,
member<offer_history_object, fc::time_point_sec,
&offer_history_object::offer_expiration_date>,
compare_by_expiration_date>>>;
using offer_index = generic_index<offer_object, offer_multi_index_type>;
using offer_history_index =
generic_index<offer_history_object, offer_history_multi_index_type>;
} // namespace chain
} // namespace graphene
MAP_OBJECT_ID_TO_TYPE(graphene::chain::offer_object)
MAP_OBJECT_ID_TO_TYPE(graphene::chain::offer_history_object)
FC_REFLECT_DERIVED(graphene::chain::offer_object, (graphene::db::object),
(issuer)(item_ids)(bidder)(bid_price)(minimum_price)(
maximum_price)(buying_item)(offer_expiration_date))
FC_REFLECT_DERIVED(graphene::chain::offer_history_object,
(graphene::db::object),
(issuer)(item_ids)(bidder)(bid_price)(minimum_price)(
maximum_price)(buying_item)(offer_expiration_date)(result))