@@ -565,6 +565,7 @@ pub mod insert_events {
565
565
566
566
use crate :: {
567
567
access:: { self , check_access} ,
568
+ analytics,
568
569
db:: { accounting:: spend_amount, CampaignRemaining , DbPool , PoolError , RedisError } ,
569
570
payout:: get_payout,
570
571
spender:: fee:: calculate_fee,
@@ -577,6 +578,7 @@ pub mod insert_events {
577
578
sentry:: { Event , SuccessResponse } ,
578
579
Address , Campaign , CampaignId , DomainError , UnifiedNum , ValidatorDesc ,
579
580
} ;
581
+ use slog:: error;
580
582
use thiserror:: Error ;
581
583
582
584
#[ derive( Debug , Error ) ]
@@ -674,34 +676,58 @@ pub mod insert_events {
674
676
675
677
let mut events_success = vec ! [ ] ;
676
678
for event in events. into_iter ( ) {
677
- let result : Result < Option < ( ) > , Error > = {
679
+ let event_payout = {
678
680
// calculate earners payouts
679
681
let payout = get_payout ( & app. logger , campaign, & event, session) ?;
680
682
681
683
match payout {
682
- Some ( ( earner, payout) ) => spend_for_event (
683
- & app. pool ,
684
- & app. campaign_remaining ,
685
- campaign,
686
- earner,
687
- leader,
688
- follower,
689
- payout,
690
- )
691
- . await
692
- . map ( Some ) ,
693
- None => Ok ( None ) ,
684
+ Some ( ( earner, payout) ) => {
685
+ let spending_result = spend_for_event (
686
+ & app. pool ,
687
+ & app. campaign_remaining ,
688
+ campaign,
689
+ earner,
690
+ leader,
691
+ follower,
692
+ payout,
693
+ )
694
+ . await ;
695
+
696
+ // Log unsuccessfully spending
697
+ match spending_result {
698
+ Ok ( ( ) ) => Some ( ( event, earner, payout) ) ,
699
+ Err ( err) => {
700
+ error ! ( & app. logger, "Payout spending failed: {}" , err; "campaign" => ?campaign, "event" => ?event, "earner" => ?earner, "unpaid amount" => %payout, "err" => ?err) ;
701
+
702
+ None
703
+ }
704
+ }
705
+ }
706
+ // if None, then ad was never show
707
+ None => None ,
694
708
}
695
709
} ;
696
710
697
- events_success. push ( ( event, result) ) ;
711
+ if let Some ( event_payout) = event_payout {
712
+ events_success. push ( event_payout) ;
713
+ }
698
714
}
699
715
700
- // TODO AIP#61 - aggregate Events and put into analytics
716
+ // Record successfully paid out events to Analytics
717
+ if let Err ( err) = analytics:: record ( & app. pool , campaign, session, events_success) . await {
718
+ error ! ( & app. logger, "Analytics recording failed: {}" , err; "campaign" => ?campaign, "err" => ?err)
719
+ }
701
720
702
721
Ok ( true )
703
722
}
704
723
724
+ /// This function calculates the fee for each validator.
725
+ ///
726
+ /// It then spends the given amounts for:
727
+ ///
728
+ /// - `Publisher` - payout
729
+ ///
730
+ /// `Leader` and `Follower` - Validator fees
705
731
pub async fn spend_for_event (
706
732
pool : & DbPool ,
707
733
campaign_remaining : & CampaignRemaining ,
0 commit comments