Skip to content

Commit c9434a0

Browse files
authored
Merge pull request #467 from AmbireTech/record-analytics-for-events
Record Analytics after paying out events `POST v5/channel/0xXXX.../events`
2 parents a1da9ff + ea00f5a commit c9434a0

File tree

1 file changed

+41
-15
lines changed

1 file changed

+41
-15
lines changed

sentry/src/routes/campaign.rs

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,7 @@ pub mod insert_events {
565565

566566
use crate::{
567567
access::{self, check_access},
568+
analytics,
568569
db::{accounting::spend_amount, CampaignRemaining, DbPool, PoolError, RedisError},
569570
payout::get_payout,
570571
spender::fee::calculate_fee,
@@ -577,6 +578,7 @@ pub mod insert_events {
577578
sentry::{Event, SuccessResponse},
578579
Address, Campaign, CampaignId, DomainError, UnifiedNum, ValidatorDesc,
579580
};
581+
use slog::error;
580582
use thiserror::Error;
581583

582584
#[derive(Debug, Error)]
@@ -674,34 +676,58 @@ pub mod insert_events {
674676

675677
let mut events_success = vec![];
676678
for event in events.into_iter() {
677-
let result: Result<Option<()>, Error> = {
679+
let event_payout = {
678680
// calculate earners payouts
679681
let payout = get_payout(&app.logger, campaign, &event, session)?;
680682

681683
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,
694708
}
695709
};
696710

697-
events_success.push((event, result));
711+
if let Some(event_payout) = event_payout {
712+
events_success.push(event_payout);
713+
}
698714
}
699715

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+
}
701720

702721
Ok(true)
703722
}
704723

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
705731
pub async fn spend_for_event(
706732
pool: &DbPool,
707733
campaign_remaining: &CampaignRemaining,

0 commit comments

Comments
 (0)