From 0526dd252a696eb26ef699915121bbc03cbad0d3 Mon Sep 17 00:00:00 2001
From: Ermal Kaleci <ermalkaleci@gmail.com>
Date: Mon, 30 Dec 2019 01:23:40 +0100
Subject: [PATCH] update ended auctions cleanup (#67)

* update ended auctions cleanup

* update

* update
---
 auction/src/lib.rs   | 33 +++++++++++++++------------------
 auction/src/tests.rs | 17 +++++++++++++++++
 2 files changed, 32 insertions(+), 18 deletions(-)

diff --git a/auction/src/lib.rs b/auction/src/lib.rs
index 7c7aff7..b6c1604 100644
--- a/auction/src/lib.rs
+++ b/auction/src/lib.rs
@@ -4,7 +4,7 @@ use frame_support::{decl_error, decl_event, decl_module, decl_storage, ensure, P
 use frame_system::{self as system, ensure_signed};
 use orml_utilities::{LinkedItem, LinkedList};
 use sp_runtime::{
-	traits::{MaybeSerializeDeserialize, Member, SimpleArithmetic, Zero},
+	traits::{MaybeSerializeDeserialize, Member, One, Saturating, SimpleArithmetic, Zero},
 	DispatchResult,
 };
 
@@ -87,22 +87,7 @@ decl_module! {
 		}
 
 		fn on_finalize(now: T::BlockNumber) {
-			let head_key: Option<T::AuctionId> = None;
-			if let Some(mut head_item) = <AuctionEndTime<T>>::get((now, head_key)) {
-				while let Some(auction_id) = head_item.next {
-					if let Some(auction) = Self::auctions(auction_id) {
-						T::Handler::on_auction_ended(auction_id, auction.bid);
-						<Auctions<T>>::remove(auction_id);
-					}
-					head_item = <AuctionEndTime<T>>::get((now, Some(auction_id))).unwrap_or_else(|| LinkedItem {
-							prev: None,
-							next: None,
-						});
-					<AuctionEndTime<T>>::remove((now, Some(auction_id)));
-				}
-
-				<AuctionEndTime<T>>::remove((now, head_key));
-			}
+			Self::_on_finalize(now);
 		}
 	}
 }
@@ -117,7 +102,19 @@ decl_error! {
 	}
 }
 
-impl<T: Trait> Module<T> {}
+impl<T: Trait> Module<T> {
+	fn _on_finalize(now: T::BlockNumber) {
+		let ended_auctions = <AuctionEndTimeList<T>>::take_all(&now);
+		let mut count = Self::auctions_count();
+		ended_auctions.for_each(|auction_id| {
+			if let Some(auction) = <Auctions<T>>::take(&auction_id) {
+				T::Handler::on_auction_ended(auction_id, auction.bid.clone());
+				count = count.saturating_sub(T::AuctionId::one());
+			}
+		});
+		<AuctionsCount<T>>::put(count);
+	}
+}
 
 impl<T: Trait> Auction<T::AccountId, T::BlockNumber> for Module<T> {
 	type AuctionId = T::AuctionId;
diff --git a/auction/src/tests.rs b/auction/src/tests.rs
index bc91e95..79e4f58 100644
--- a/auction/src/tests.rs
+++ b/auction/src/tests.rs
@@ -5,6 +5,7 @@
 use super::*;
 use frame_support::assert_ok;
 use mock::{AuctionModule, ExtBuilder, Runtime, ALICE};
+use sp_runtime::traits::OnFinalize;
 
 #[test]
 fn new_auction_should_work() {
@@ -69,3 +70,19 @@ fn bid_should_fail() {
 		);
 	});
 }
+
+#[test]
+fn cleanup_auction_should_work() {
+	ExtBuilder::default().build().execute_with(|| {
+		assert_eq!(AuctionModule::new_auction(10, Some(100)), 0);
+		assert_eq!(AuctionModule::auctions_count(), 1);
+		assert_eq!(AuctionModule::new_auction(10, Some(50)), 1);
+		assert_eq!(AuctionModule::auctions_count(), 2);
+		AuctionModule::on_finalize(1);
+		assert_eq!(AuctionModule::auctions_count(), 2);
+		AuctionModule::on_finalize(50);
+		assert_eq!(AuctionModule::auctions_count(), 1);
+		AuctionModule::on_finalize(100);
+		assert_eq!(AuctionModule::auctions_count(), 0);
+	});
+}
-- 
GitLab