@@ -370,7 +370,7 @@ pub mod insert_events {
370
370
371
371
use crate :: {
372
372
access:: { self , check_access} ,
373
- db:: { accounting:: spend_amount, DbPool , PoolError , RedisError } ,
373
+ db:: { accounting:: spend_amount, CampaignRemaining , DbPool , PoolError , RedisError } ,
374
374
payout:: get_payout,
375
375
spender:: fee:: calculate_fee,
376
376
Application , Auth , ResponseError , Session ,
@@ -384,12 +384,8 @@ pub mod insert_events {
384
384
} ,
385
385
Address , Campaign , CampaignId , DomainError , UnifiedNum , ValidatorDesc ,
386
386
} ;
387
- use redis:: aio:: MultiplexedConnection ;
388
387
use thiserror:: Error ;
389
388
390
- // TODO AIP#61: Use the Campaign Modify const here
391
- pub const CAMPAIGN_REMAINING_KEY : & str = "campaignRemaining" ;
392
-
393
389
#[ derive( Debug , Error ) ]
394
390
pub enum Error {
395
391
#[ error( transparent) ]
@@ -492,7 +488,7 @@ pub mod insert_events {
492
488
match payout {
493
489
Some ( ( earner, payout) ) => spend_for_event (
494
490
& app. pool ,
495
- app. redis . clone ( ) ,
491
+ & app. campaign_remaining ,
496
492
campaign,
497
493
earner,
498
494
leader,
@@ -515,7 +511,7 @@ pub mod insert_events {
515
511
516
512
pub async fn spend_for_event (
517
513
pool : & DbPool ,
518
- mut redis : MultiplexedConnection ,
514
+ campaign_remaining : & CampaignRemaining ,
519
515
campaign : & Campaign ,
520
516
earner : Address ,
521
517
leader : & ValidatorDesc ,
@@ -534,14 +530,16 @@ pub mod insert_events {
534
530
. sum :: < Option < UnifiedNum > > ( )
535
531
. ok_or ( EventError :: EventPayoutOverflow ) ?;
536
532
537
- if !has_enough_remaining_budget ( & mut redis , campaign. id , spending) . await ? {
533
+ if !has_enough_remaining_budget ( campaign_remaining , campaign. id , spending) . await ? {
538
534
return Err ( Error :: Event (
539
535
EventError :: CampaignRemainingNotEnoughForPayout ,
540
536
) ) ;
541
537
}
542
538
543
539
// The event payout decreases the remaining budget for the Campaign
544
- let remaining = decrease_remaining_budget ( & mut redis, campaign. id , spending) . await ?;
540
+ let remaining = campaign_remaining
541
+ . decrease_by ( campaign. id , spending)
542
+ . await ?;
545
543
546
544
// Update the Accounting records accordingly
547
545
let channel_id = campaign. channel . id ( ) ;
@@ -563,40 +561,22 @@ pub mod insert_events {
563
561
}
564
562
565
563
async fn has_enough_remaining_budget (
566
- redis : & mut MultiplexedConnection ,
564
+ campaign_remaining : & CampaignRemaining ,
567
565
campaign : CampaignId ,
568
566
amount : UnifiedNum ,
569
567
) -> Result < bool , RedisError > {
570
- let key = format ! ( "{}:{}" , CAMPAIGN_REMAINING_KEY , campaign) ;
571
-
572
- let remaining = redis:: cmd ( "GET" )
573
- . arg ( & key)
574
- . query_async :: < _ , Option < i64 > > ( redis)
568
+ let remaining = campaign_remaining
569
+ . get_remaining_opt ( campaign)
575
570
. await ?
576
571
. unwrap_or_default ( ) ;
577
572
578
573
Ok ( remaining > 0 && remaining. unsigned_abs ( ) > amount. to_u64 ( ) )
579
574
}
580
575
581
- async fn decrease_remaining_budget (
582
- redis : & mut MultiplexedConnection ,
583
- campaign : CampaignId ,
584
- amount : UnifiedNum ,
585
- ) -> Result < i64 , RedisError > {
586
- let key = format ! ( "{}:{}" , CAMPAIGN_REMAINING_KEY , campaign) ;
587
-
588
- let remaining = redis:: cmd ( "DECRBY" )
589
- . arg ( & key)
590
- . arg ( amount. to_u64 ( ) )
591
- . query_async :: < _ , i64 > ( redis)
592
- . await ?;
593
-
594
- Ok ( remaining)
595
- }
596
-
597
576
#[ cfg( test) ]
598
577
mod test {
599
578
use primitives:: util:: tests:: prep_db:: { ADDRESSES , DUMMY_CAMPAIGN } ;
579
+ use redis:: aio:: MultiplexedConnection ;
600
580
601
581
use crate :: db:: {
602
582
redis_pool:: TESTS_POOL ,
@@ -605,27 +585,13 @@ pub mod insert_events {
605
585
606
586
use super :: * ;
607
587
608
- /// Helper function to get the Campaign Remaining budget in Redis for the tests
609
- async fn get_campaign_remaining (
610
- redis : & mut MultiplexedConnection ,
611
- campaign : CampaignId ,
612
- ) -> Option < i64 > {
613
- let key = format ! ( "{}:{}" , CAMPAIGN_REMAINING_KEY , campaign) ;
614
-
615
- redis:: cmd ( "GET" )
616
- . arg ( & key)
617
- . query_async ( redis)
618
- . await
619
- . expect ( "Should set Campaign remaining key" )
620
- }
621
-
622
588
/// Helper function to set the Campaign Remaining budget in Redis for the tests
623
589
async fn set_campaign_remaining (
624
590
redis : & mut MultiplexedConnection ,
625
591
campaign : CampaignId ,
626
592
remaining : i64 ,
627
593
) {
628
- let key = format ! ( "{}:{}" , CAMPAIGN_REMAINING_KEY , campaign) ;
594
+ let key = CampaignRemaining :: get_key ( campaign) ;
629
595
630
596
redis:: cmd ( "SET" )
631
597
. arg ( & key)
@@ -638,12 +604,14 @@ pub mod insert_events {
638
604
#[ tokio:: test]
639
605
async fn test_has_enough_remaining_budget ( ) {
640
606
let mut redis = TESTS_POOL . get ( ) . await . expect ( "Should get redis connection" ) ;
607
+ let campaign_remaining = CampaignRemaining :: new ( redis. connection . clone ( ) ) ;
641
608
let campaign = DUMMY_CAMPAIGN . id ;
642
609
let amount = UnifiedNum :: from ( 10_000 ) ;
643
610
644
- let no_remaining_budget_set = has_enough_remaining_budget ( & mut redis, campaign, amount)
645
- . await
646
- . expect ( "Should check campaign remaining" ) ;
611
+ let no_remaining_budget_set =
612
+ has_enough_remaining_budget ( & campaign_remaining, campaign, amount)
613
+ . await
614
+ . expect ( "Should check campaign remaining" ) ;
647
615
assert ! (
648
616
!no_remaining_budget_set,
649
617
"No remaining budget set, should return false"
@@ -652,7 +620,7 @@ pub mod insert_events {
652
620
set_campaign_remaining ( & mut redis, campaign, 9_000 ) . await ;
653
621
654
622
let not_enough_remaining_budget =
655
- has_enough_remaining_budget ( & mut redis , campaign, amount)
623
+ has_enough_remaining_budget ( & campaign_remaining , campaign, amount)
656
624
. await
657
625
. expect ( "Should check campaign remaining" ) ;
658
626
assert ! (
@@ -663,7 +631,7 @@ pub mod insert_events {
663
631
set_campaign_remaining ( & mut redis, campaign, 11_000 ) . await ;
664
632
665
633
let has_enough_remaining_budget =
666
- has_enough_remaining_budget ( & mut redis , campaign, amount)
634
+ has_enough_remaining_budget ( & campaign_remaining , campaign, amount)
667
635
. await
668
636
. expect ( "Should check campaign remaining" ) ;
669
637
@@ -677,19 +645,22 @@ pub mod insert_events {
677
645
async fn test_decreasing_remaining_budget ( ) {
678
646
let mut redis = TESTS_POOL . get ( ) . await . expect ( "Should get redis connection" ) ;
679
647
let campaign = DUMMY_CAMPAIGN . id ;
648
+ let campaign_remaining = CampaignRemaining :: new ( redis. connection . clone ( ) ) ;
680
649
let amount = UnifiedNum :: from ( 5_000 ) ;
681
650
682
651
set_campaign_remaining ( & mut redis, campaign, 9_000 ) . await ;
683
652
684
- let remaining = decrease_remaining_budget ( & mut redis, campaign, amount)
653
+ let remaining = campaign_remaining
654
+ . decrease_by ( campaign, amount)
685
655
. await
686
656
. expect ( "Should decrease campaign remaining" ) ;
687
657
assert_eq ! (
688
658
4_000 , remaining,
689
659
"Should decrease remaining budget with amount and be positive"
690
660
) ;
691
661
692
- let remaining = decrease_remaining_budget ( & mut redis, campaign, amount)
662
+ let remaining = campaign_remaining
663
+ . decrease_by ( campaign, amount)
693
664
. await
694
665
. expect ( "Should decrease campaign remaining" ) ;
695
666
assert_eq ! (
@@ -702,6 +673,7 @@ pub mod insert_events {
702
673
async fn test_spending_for_events_with_enough_remaining_budget ( ) {
703
674
let mut redis = TESTS_POOL . get ( ) . await . expect ( "Should get redis connection" ) ;
704
675
let database = DATABASE_POOL . get ( ) . await . expect ( "Should get a DB pool" ) ;
676
+ let campaign_remaining = CampaignRemaining :: new ( redis. connection . clone ( ) ) ;
705
677
706
678
setup_test_migrations ( database. pool . clone ( ) )
707
679
. await
@@ -719,7 +691,7 @@ pub mod insert_events {
719
691
{
720
692
let spend_event = spend_for_event (
721
693
& database. pool ,
722
- redis . connection . clone ( ) ,
694
+ & campaign_remaining ,
723
695
& campaign,
724
696
publisher,
725
697
leader,
@@ -745,7 +717,7 @@ pub mod insert_events {
745
717
746
718
let spend_event = spend_for_event (
747
719
& database. pool ,
748
- redis . connection . clone ( ) ,
720
+ & campaign_remaining ,
749
721
& campaign,
750
722
publisher,
751
723
leader,
@@ -765,8 +737,9 @@ pub mod insert_events {
765
737
// Follower fee: 100
766
738
// Follower payout: 300 * 100 / 1000 = 30
767
739
assert_eq ! (
768
- 10_640_i64 ,
769
- get_campaign_remaining( & mut redis. connection, campaign. id)
740
+ Some ( 10_640_i64 ) ,
741
+ campaign_remaining
742
+ . get_remaining_opt( campaign. id)
770
743
. await
771
744
. expect( "Should have key" )
772
745
)
0 commit comments