@@ -26,6 +26,11 @@ constexpr eosio::name pool_account(eosio::name pool)
26
26
constexpr eosio::name master_pool = pool_account(" master" _n);
27
27
eosio::name distribution_fund;
28
28
29
+ const eosio::name account_min = eosio::name{0 };
30
+ const eosio::name account_max = eosio::name{~uint64_t (0 )};
31
+ const eosio::block_timestamp block_timestamp_min = eosio::block_timestamp{0 };
32
+ const eosio::block_timestamp block_timestamp_max = eosio::block_timestamp{~uint32_t (0 )};
33
+
29
34
// TODO: switch to uint64_t (js BigInt) after we upgrade to nodejs >= 15
30
35
extern " C" void __wasm_call_ctors ();
31
36
[[clang::export_name(" initialize" )]] void initialize (uint32_t eden_account_low,
@@ -89,6 +94,7 @@ struct by_pk;
89
94
struct by_invitee ;
90
95
struct by_group ;
91
96
struct by_round ;
97
+ struct by_createdAt ;
92
98
93
99
template <typename T, typename ... Indexes>
94
100
using mic = boost::
@@ -119,6 +125,11 @@ using ordered_by_round = boost::multi_index::ordered_unique< //
119
125
boost::multi_index::tag<by_round>,
120
126
boost::multi_index::key<&T::by_round>>;
121
127
128
+ template <typename T>
129
+ using ordered_by_createdAt = boost::multi_index::ordered_unique< //
130
+ boost::multi_index::tag<by_createdAt>,
131
+ boost::multi_index::key<&T::by_createdAt>>;
132
+
122
133
uint64_t available_pk (const auto & table, const auto & first)
123
134
{
124
135
auto & idx = table.template get <by_pk>();
@@ -294,6 +305,8 @@ using induction_index = mic<induction_object,
294
305
ordered_by_pk<induction_object>,
295
306
ordered_by_invitee<induction_object>>;
296
307
308
+ using MemberCreatedAtKey = std::pair<eosio::block_timestamp, eosio::name>;
309
+
297
310
struct member
298
311
{
299
312
eosio::name account;
@@ -302,6 +315,7 @@ struct member
302
315
eden::new_member_profile profile;
303
316
std::string inductionVideo;
304
317
bool participating = false ;
318
+ eosio::block_timestamp createdAt;
305
319
};
306
320
307
321
struct member_object : public chainbase ::object<member_table, member_object>
@@ -312,8 +326,14 @@ struct member_object : public chainbase::object<member_table, member_object>
312
326
member member;
313
327
314
328
eosio::name by_pk () const { return member.account ; }
329
+ MemberCreatedAtKey by_createdAt () const {
330
+ return {member.createdAt , member.account };
331
+ }
315
332
};
316
- using member_index = mic<member_object, ordered_by_id<member_object>, ordered_by_pk<member_object>>;
333
+ using member_index = mic<member_object,
334
+ ordered_by_id<member_object>,
335
+ ordered_by_pk<member_object>,
336
+ ordered_by_createdAt<member_object>>;
317
337
318
338
struct election_object : public chainbase ::object<election_table, election_object>
319
339
{
@@ -637,6 +657,7 @@ struct Member
637
657
const eden::new_member_profile* profile () const { return member ? &member->profile : nullptr ; }
638
658
const std::string* inductionVideo () const { return member ? &member->inductionVideo : nullptr ; }
639
659
bool participating () const { return member && member->participating ; }
660
+ eosio::block_timestamp createdAt () const { return member->createdAt ; }
640
661
641
662
MemberElectionConnection elections (std::optional<eosio::block_timestamp> gt,
642
663
std::optional<eosio::block_timestamp> ge,
@@ -664,6 +685,7 @@ EOSIO_REFLECT2(
664
685
profile,
665
686
inductionVideo,
666
687
participating,
688
+ createdAt,
667
689
method (elections, " gt" , " ge" , " lt" , " le" , " first" , " last" , " before" , " after" ),
668
690
method(distributionFunds, " gt" , " ge" , " lt" , " le" , " first" , " last" , " before" , " after" ))
669
691
@@ -1256,6 +1278,7 @@ void inductdonate(const action_context& context,
1256
1278
obj.member .inductionWitnesses = induction.induction .witnesses ;
1257
1279
obj.member .profile = induction.induction .profile ;
1258
1280
obj.member .inductionVideo = induction.induction .video ;
1281
+ obj.member .createdAt = eosio::block_timestamp (context.block .timestamp );
1259
1282
});
1260
1283
transfer_funds (context.block .timestamp , payer, master_pool, quantity,
1261
1284
history_desc::inductdonate);
@@ -1773,6 +1796,34 @@ struct Query
1773
1796
[](auto & members, auto key) { return members.upper_bound (key); });
1774
1797
}
1775
1798
1799
+ MemberConnection membersByCreatedAt (std::optional<eosio::block_timestamp> gt,
1800
+ std::optional<eosio::block_timestamp> ge,
1801
+ std::optional<eosio::block_timestamp> lt,
1802
+ std::optional<eosio::block_timestamp> le,
1803
+ std::optional<uint32_t > first,
1804
+ std::optional<uint32_t > last,
1805
+ std::optional<std::string> before,
1806
+ std::optional<std::string> after) const
1807
+ {
1808
+ return clchain::make_connection<MemberConnection, MemberCreatedAtKey>(
1809
+ gt ? std::optional{MemberCreatedAtKey{*gt, account_max}} //
1810
+ : std::nullopt, //
1811
+ ge ? std::optional{MemberCreatedAtKey{*ge, account_min}} //
1812
+ : std::nullopt, //
1813
+ lt ? std::optional{MemberCreatedAtKey{*lt, account_min}} //
1814
+ : std::nullopt, //
1815
+ le ? std::optional{MemberCreatedAtKey{*le, account_max}} //
1816
+ : std::nullopt, //
1817
+ first, last, before, after, //
1818
+ db.members .get <by_createdAt>(), //
1819
+ [](auto & obj) { return obj.by_createdAt (); }, //
1820
+ [](auto & obj) {
1821
+ return Member{obj.member .account , &obj.member };
1822
+ },
1823
+ [](auto & members, auto key) { return members.lower_bound (key); },
1824
+ [](auto & members, auto key) { return members.upper_bound (key); });
1825
+ }
1826
+
1776
1827
ElectionConnection elections (std::optional<eosio::block_timestamp> gt,
1777
1828
std::optional<eosio::block_timestamp> ge,
1778
1829
std::optional<eosio::block_timestamp> lt,
@@ -1816,6 +1867,7 @@ EOSIO_REFLECT2(Query,
1816
1867
distributionFund,
1817
1868
method (balances, " gt" , " ge" , " lt" , " le" , " first" , " last" , " before" , " after" ),
1818
1869
method(members, " gt" , " ge" , " lt" , " le" , " first" , " last" , " before" , " after" ),
1870
+ method(membersByCreatedAt, " gt" , " ge" , " lt" , " le" , " first" , " last" , " before" , " after" ),
1819
1871
method(elections, " gt" , " ge" , " lt" , " le" , " first" , " last" , " before" , " after" ),
1820
1872
method(distributions, " gt" , " ge" , " lt" , " le" , " first" , " last" , " before" , " after" ))
1821
1873
0 commit comments