|
1 |
| -use crate::{Application, ResponseError, Session}; |
| 1 | +use chrono::{serde::ts_milliseconds_option, DateTime, Utc}; |
2 | 2 | use hyper::{Body, Request, Response};
|
3 |
| -use primitives::adapter::Adapter; |
4 |
| -use primitives::Channel; |
| 3 | +use serde::Deserialize; |
| 4 | + |
| 5 | +use primitives::{adapter::Adapter, sentry::EventAggregateResponse, Channel}; |
| 6 | + |
| 7 | +use crate::{db::list_event_aggregates, success_response, Application, ResponseError, Session}; |
| 8 | + |
| 9 | +#[derive(Deserialize)] |
| 10 | +pub struct EventAggregatesQuery { |
| 11 | + #[serde(default, with = "ts_milliseconds_option")] |
| 12 | + after: Option<DateTime<Utc>>, |
| 13 | +} |
5 | 14 |
|
6 | 15 | pub async fn list_channel_event_aggregates<A: Adapter>(
|
7 | 16 | req: Request<Body>,
|
8 |
| - _app: &Application<A>, |
| 17 | + app: &Application<A>, |
9 | 18 | ) -> Result<Response<Body>, ResponseError> {
|
10 | 19 | let channel = req
|
11 | 20 | .extensions()
|
12 | 21 | .get::<Channel>()
|
13 | 22 | .expect("Request should have Channel");
|
14 | 23 |
|
15 |
| - // TODO: Auth required middleware |
16 | 24 | let session = req
|
17 | 25 | .extensions()
|
18 | 26 | .get::<Session>()
|
19 | 27 | .ok_or_else(|| ResponseError::Unauthorized)?;
|
20 | 28 |
|
21 |
| - let _is_superuser = channel.spec.validators.find(&session.uid).is_some(); |
| 29 | + let query = |
| 30 | + serde_urlencoded::from_str::<EventAggregatesQuery>(req.uri().query().unwrap_or(""))?; |
| 31 | + |
| 32 | + let from = if channel.spec.validators.find(&session.uid).is_some() { |
| 33 | + Some(session.uid.clone()) |
| 34 | + } else { |
| 35 | + None |
| 36 | + }; |
| 37 | + |
| 38 | + let event_aggregates = |
| 39 | + list_event_aggregates(&app.pool, app.config.events_find_limit, &from, &query.after).await?; |
| 40 | + |
| 41 | + let response = EventAggregateResponse { |
| 42 | + channel: channel.clone(), |
| 43 | + events: event_aggregates, |
| 44 | + }; |
22 | 45 |
|
23 |
| - unimplemented!("Still need to finish it") |
| 46 | + Ok(success_response(serde_json::to_string(&response)?)) |
24 | 47 | }
|
0 commit comments