Skip to content

Commit 44a820e

Browse files
authored
Merge pull request #4 from AdExNetwork/aip-6-additions
Separate Session and Auth, clean iterators for payouts
2 parents 7f6480d + 8226164 commit 44a820e

File tree

9 files changed

+65
-78
lines changed

9 files changed

+65
-78
lines changed

sentry/src/access.rs

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use chrono::Utc;
22
use futures::future::try_join_all;
33
use redis::aio::MultiplexedConnection;
44

5-
use crate::{AuthSession, Session};
5+
use crate::{Auth, Session};
66
use primitives::event_submission::{RateLimit, Rule};
77
use primitives::sentry::Event;
88
use primitives::Channel;
@@ -38,8 +38,8 @@ impl fmt::Display for Error {
3838
// @TODO: Make pub(crate)
3939
pub async fn check_access(
4040
redis: &MultiplexedConnection,
41-
auth_session: Option<&AuthSession>,
4241
session: &Session,
42+
auth: Option<&Auth>,
4343
rate_limit: &RateLimit,
4444
channel: &Channel,
4545
events: &[Event],
@@ -61,7 +61,7 @@ pub async fn check_access(
6161
return Err(Error::ChannelIsExpired);
6262
}
6363

64-
let (is_creator, auth_uid) = match auth_session.as_ref() {
64+
let (is_creator, auth_uid) = match auth {
6565
Some(auth) => (auth.uid == channel.creator, auth.uid.to_string()),
6666
None => (false, Default::default()),
6767
};
@@ -258,19 +258,18 @@ mod test {
258258
async fn session_uid_rate_limit() {
259259
let (config, redis) = setup().await;
260260

261+
let auth = Auth {
262+
era: 0,
263+
uid: IDS["follower"].clone(),
264+
};
265+
261266
let session = Session {
262267
ip: Default::default(),
263268
referrer_header: None,
264269
country: None,
265270
os: None,
266271
};
267272

268-
let auth = AuthSession {
269-
era: 0,
270-
uid: IDS["follower"].clone(),
271-
session: session.clone(),
272-
};
273-
274273
let rule = Rule {
275274
uids: None,
276275
rate_limit: Some(RateLimit {
@@ -283,8 +282,8 @@ mod test {
283282

284283
let response = check_access(
285284
&redis,
286-
Some(&auth),
287285
&session,
286+
Some(&auth),
288287
&config.ip_rate_limit,
289288
&channel,
290289
&events,
@@ -294,8 +293,8 @@ mod test {
294293

295294
let err_response = check_access(
296295
&&redis,
297-
Some(&auth),
298296
&session,
297+
Some(&auth),
299298
&config.ip_rate_limit,
300299
&channel,
301300
&events,
@@ -313,19 +312,18 @@ mod test {
313312
async fn ip_rate_limit() {
314313
let (config, redis) = setup().await;
315314

315+
let auth = Auth {
316+
era: 0,
317+
uid: IDS["follower"].clone(),
318+
};
319+
316320
let session = Session {
317321
ip: Default::default(),
318322
referrer_header: None,
319323
country: None,
320324
os: None,
321325
};
322326

323-
let auth = AuthSession {
324-
era: 0,
325-
uid: IDS["follower"].clone(),
326-
session: session.clone(),
327-
};
328-
329327
let rule = Rule {
330328
uids: None,
331329
rate_limit: Some(RateLimit {
@@ -337,8 +335,8 @@ mod test {
337335

338336
let err_response = check_access(
339337
&redis,
340-
Some(&auth),
341338
&session,
339+
Some(&auth),
342340
&config.ip_rate_limit,
343341
&channel,
344342
&get_impression_events(2),
@@ -354,8 +352,8 @@ mod test {
354352

355353
let response = check_access(
356354
&redis,
357-
Some(&auth),
358355
&session,
356+
Some(&auth),
359357
&config.ip_rate_limit,
360358
&channel,
361359
&get_impression_events(1),

sentry/src/db/analytics.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::db::DbPool;
22
use crate::epoch;
3-
use crate::AuthSession;
3+
use crate::Auth;
44
use bb8::RunError;
55
use bb8_postgres::tokio_postgres::types::ToSql;
66
use chrono::Utc;
@@ -13,9 +13,9 @@ use std::collections::HashMap;
1313
use std::error::Error;
1414

1515
pub enum AnalyticsType {
16-
Advertiser { auth: AuthSession },
16+
Advertiser { auth: Auth },
1717
Global,
18-
Publisher { auth: AuthSession },
18+
Publisher { auth: Auth },
1919
}
2020

2121
pub async fn advertiser_channel_ids(

sentry/src/event_aggregator.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use crate::access::check_access;
22
use crate::access::Error as AccessError;
3-
use crate::analytics_recorder;
43
use crate::db::event_aggregate::insert_event_aggregate;
54
use crate::db::get_channel_by_id;
65
use crate::db::DbPool;
76
use crate::event_reducer;
87
use crate::Application;
98
use crate::ResponseError;
10-
use crate::{AuthSession, Session};
9+
use crate::Session;
10+
use crate::{analytics_recorder, Auth};
1111
use async_std::sync::RwLock;
1212
use chrono::Utc;
1313
use lazy_static::lazy_static;
@@ -68,8 +68,8 @@ impl EventAggregator {
6868
&self,
6969
app: &'a Application<A>,
7070
channel_id: &ChannelId,
71-
auth_session: Option<&AuthSession>,
7271
session: &Session,
72+
auth: Option<&Auth>,
7373
events: &'a [Event],
7474
) -> Result<(), ResponseError> {
7575
let recorder = self.recorder.clone();
@@ -127,8 +127,8 @@ impl EventAggregator {
127127

128128
check_access(
129129
&app.redis,
130-
auth_session,
131130
session,
131+
auth,
132132
&app.config.ip_rate_limit,
133133
&record.channel,
134134
events,

sentry/src/lib.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -453,14 +453,7 @@ pub struct Session {
453453
}
454454

455455
#[derive(Debug, Clone)]
456-
pub struct AuthSession {
456+
pub struct Auth {
457457
pub era: i64,
458458
pub uid: ValidatorId,
459-
pub session: Session,
460-
}
461-
462-
impl AsRef<Session> for AuthSession {
463-
fn as_ref(&self) -> &Session {
464-
&self.session
465-
}
466459
}

sentry/src/middleware/auth.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use redis::aio::MultiplexedConnection;
66

77
use primitives::adapter::{Adapter, Session as AdapterSession};
88

9-
use crate::{AuthSession, Session};
9+
use crate::{Auth, Session};
1010

1111
/// Check `Authorization` header for `Bearer` scheme with `Adapter::session_from_token`.
1212
/// If the `Adapter` fails to create an `AdapterSession`, `ResponseError::BadRequest` will be returned.
@@ -27,8 +27,7 @@ pub(crate) async fn for_request(
2727
referrer_header: referrer,
2828
os: None,
2929
};
30-
31-
req.extensions_mut().insert(session.clone());
30+
req.extensions_mut().insert(session);
3231

3332
let authorization = req.headers().get(AUTHORIZATION);
3433

@@ -73,10 +72,9 @@ pub(crate) async fn for_request(
7372
}
7473
};
7574

76-
let auth = AuthSession {
75+
let auth = Auth {
7776
era: adapter_session.era,
7877
uid: adapter_session.uid,
79-
session,
8078
};
8179

8280
req.extensions_mut().insert(auth);
@@ -134,7 +132,7 @@ mod test {
134132
.expect("Handling the Request shouldn't have failed");
135133

136134
assert!(
137-
no_auth.extensions().get::<AuthSession>().is_none(),
135+
no_auth.extensions().get::<Auth>().is_none(),
138136
"There shouldn't be a Session in the extensions"
139137
);
140138

@@ -147,7 +145,7 @@ mod test {
147145
.await
148146
.expect("Handling the Request shouldn't have failed");
149147
assert!(
150-
incorrect_auth.extensions().get::<AuthSession>().is_none(),
148+
incorrect_auth.extensions().get::<Auth>().is_none(),
151149
"There shouldn't be a Session in the extensions"
152150
);
153151

@@ -178,12 +176,18 @@ mod test {
178176
let altered_request = for_request(req, &dummy_adapter, redis)
179177
.await
180178
.expect("Valid requests should succeed");
181-
let session = altered_request
179+
180+
let auth = altered_request
182181
.extensions()
183-
.get::<AuthSession>()
182+
.get::<Auth>()
184183
.expect("There should be a Session set inside the request");
185184

186-
assert_eq!(IDS["leader"], session.uid);
187-
assert!(session.session.ip.is_none());
185+
assert_eq!(IDS["leader"], auth.uid);
186+
187+
let session = altered_request
188+
.extensions()
189+
.get::<Session>()
190+
.expect("There should be a Session set inside the request");
191+
assert!(session.ip.is_none());
188192
}
189193
}

sentry/src/payout.rs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,24 +34,19 @@ fn payout(
3434
min_price: BigNum,
3535
publisher: &ValidatorId,
3636
) -> BigNum {
37-
let matching_rules: Vec<&PriceMultiplicationRules> = rules
38-
.iter()
39-
.filter(|&rule| match_rule(rule, &event, &session, &publisher))
40-
.collect();
41-
let fixed_amount_rule = matching_rules
42-
.iter()
43-
.find(|&rule| rule.amount.is_some())
44-
.map(|&rule| rule.amount.as_ref().expect("should have value"));
37+
let fixed_amount_rule = rules.iter().find_map(|rule| {
38+
match (match_rule(rule, &event, &session, &publisher), &rule.amount) {
39+
(true, Some(amount)) => Some(amount.clone()),
40+
_ => None,
41+
}
42+
});
4543

4644
let price_by_rules = match fixed_amount_rule {
47-
Some(amount) => amount.clone(),
45+
Some(amount) => amount,
4846
None => {
4947
let exponent: f64 = 10.0;
50-
let multiplier = rules
51-
.iter()
52-
.filter(|&rule| rule.multiplier.is_some())
53-
.map(|rule| rule.multiplier.expect("should have value"))
54-
.fold(1.0, |result, i| result * i);
48+
// @TODO: Know-issue - `multiplier` and `value` can overflow, should return Error instead
49+
let multiplier: f64 = rules.iter().filter_map(|rule| rule.multiplier).product();
5550
let value: u64 = (multiplier * exponent.powi(18)) as u64;
5651
let result = min_price * BigNum::from(value);
5752

@@ -170,7 +165,6 @@ mod tests {
170165
cases.iter().for_each(|case| {
171166
let (event, expected_result, message) = case;
172167
let payout = get_payout(&channel, &event, &session);
173-
// println!("payout {:?}", payout.to_f64());
174168
assert!(&payout == expected_result, message.clone());
175169
})
176170
}
@@ -224,8 +218,7 @@ mod tests {
224218
os: None,
225219
};
226220

227-
cases.iter().for_each(|case| {
228-
let (event, expected_result, message) = case;
221+
cases.iter().for_each(|(event, expected_result, message)| {
229222
let payout = get_payout(&channel, &event, &session);
230223
assert!(&payout == expected_result, message.clone());
231224
})

sentry/src/routes/analytics.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::db::analytics::{
33
};
44
use crate::success_response;
55
use crate::Application;
6-
use crate::AuthSession;
6+
use crate::Auth;
77
use crate::ResponseError;
88
use crate::RouteParams;
99
use hyper::{Body, Request, Response};
@@ -17,11 +17,13 @@ pub async fn publisher_analytics<A: Adapter>(
1717
req: Request<Body>,
1818
app: &Application<A>,
1919
) -> Result<Response<Body>, ResponseError> {
20-
let sess = req.extensions().get::<AuthSession>();
20+
let auth = req
21+
.extensions()
22+
.get::<Auth>()
23+
.ok_or(ResponseError::Unauthorized)?
24+
.clone();
2125

22-
let analytics_type = AnalyticsType::Publisher {
23-
auth: sess.cloned().ok_or(ResponseError::Unauthorized)?,
24-
};
26+
let analytics_type = AnalyticsType::Publisher { auth };
2527

2628
process_analytics(req, app, analytics_type)
2729
.await
@@ -65,7 +67,7 @@ pub async fn advertiser_analytics<A: Adapter>(
6567
req: Request<Body>,
6668
app: &Application<A>,
6769
) -> Result<Response<Body>, ResponseError> {
68-
let sess = req.extensions().get::<AuthSession>();
70+
let sess = req.extensions().get::<Auth>();
6971
let analytics_type = AnalyticsType::Advertiser {
7072
auth: sess.ok_or(ResponseError::Unauthorized)?.to_owned(),
7173
};
@@ -110,10 +112,7 @@ pub async fn advanced_analytics<A: Adapter>(
110112
req: Request<Body>,
111113
app: &Application<A>,
112114
) -> Result<Response<Body>, ResponseError> {
113-
let auth = req
114-
.extensions()
115-
.get::<AuthSession>()
116-
.expect("auth is required");
115+
let auth = req.extensions().get::<Auth>().expect("auth is required");
117116
let advertiser_channels = advertiser_channel_ids(&app.pool, &auth.uid).await?;
118117

119118
let query = serde_urlencoded::from_str::<AnalyticsQuery>(&req.uri().query().unwrap_or(""))?;

sentry/src/routes/channel.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::success_response;
55
use crate::Application;
66
use crate::ResponseError;
77
use crate::RouteParams;
8-
use crate::{AuthSession, Session};
8+
use crate::{Auth, Session};
99
use bb8::RunError;
1010
use bb8_postgres::tokio_postgres::error;
1111
use futures::future::try_join_all;
@@ -184,7 +184,7 @@ pub async fn insert_events<A: Adapter + 'static>(
184184
) -> Result<Response<Body>, ResponseError> {
185185
let (req_head, req_body) = req.into_parts();
186186

187-
let auth_session = req_head.extensions.get::<AuthSession>();
187+
let auth = req_head.extensions.get::<Auth>();
188188
let session = req_head
189189
.extensions
190190
.get::<Session>()
@@ -205,7 +205,7 @@ pub async fn insert_events<A: Adapter + 'static>(
205205
.ok_or_else(|| ResponseError::BadRequest("invalid request".to_string()))?;
206206

207207
app.event_aggregator
208-
.record(app, &channel_id, auth_session, session, &events)
208+
.record(app, &channel_id, session, auth, &events)
209209
.await?;
210210

211211
Ok(Response::builder()
@@ -220,7 +220,7 @@ pub async fn create_validator_messages<A: Adapter + 'static>(
220220
) -> Result<Response<Body>, ResponseError> {
221221
let session = req
222222
.extensions()
223-
.get::<AuthSession>()
223+
.get::<Auth>()
224224
.expect("auth request session")
225225
.to_owned();
226226

0 commit comments

Comments
 (0)