1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
use crate::api::rcos::meetings::authorization_for::{AuthorizationFor, UserMeetingAuthorization};
use crate::api::rcos::meetings::get::Meetings;
use crate::api::rcos::meetings::MeetingType;
use crate::error::TelescopeError;
use crate::templates::page::Page;
use crate::templates::Template;
use crate::web::services::auth::identity::Identity;
use actix_web::web::{Query, ServiceConfig};
use actix_web::HttpRequest;
use chrono::{Date, DateTime, Duration, Local, NaiveDate, TimeZone, Utc};
pub fn register(c: &mut ServiceConfig) -> &mut ServiceConfig {
c.service(meetings_list)
}
const TEMPLATE_PATH: &'static str = "meetings/list";
#[derive(Serialize, Deserialize, Debug, Copy, Clone)]
struct MeetingsQuery {
pub start: NaiveDate,
pub end: NaiveDate,
}
#[get("/meetings")]
async fn meetings_list(
req: HttpRequest,
params: Option<Query<MeetingsQuery>>,
identity: Identity,
) -> Result<Page, TelescopeError> {
let start: DateTime<Utc> = params
.as_ref()
.map(|p| p.start)
.map(|naive: NaiveDate| Local.from_local_date(&naive))
.and_then(|local_result| local_result.earliest())
.map(|date: Date<Local>| date.and_hms(0, 0, 0))
.unwrap_or(Local::now() - Duration::hours(2))
.with_timezone(&Utc);
let end: DateTime<Utc> = params
.as_ref()
.map(|p| p.end)
.map(|naive: NaiveDate| Local.from_local_date(&naive))
.and_then(|local_result| local_result.latest())
.map(|date: Date<Local>| date.and_hms(23, 59, 59))
.unwrap_or(Local::now() + Duration::weeks(1))
.with_timezone(&Utc);
let viewer: Option<_> = identity.get_user_id().await?;
let authorization: UserMeetingAuthorization = AuthorizationFor::get(viewer).await?;
let include_drafts: bool = authorization.can_view_drafts();
let visible_meeting_types: Vec<MeetingType> = authorization.viewable_types();
let events: Vec<_> = Meetings::get(start, end, include_drafts, visible_meeting_types).await?;
let query = params
.map(|p| p.0)
.unwrap_or(MeetingsQuery {
start: start.naive_local().date(),
end: end.naive_local().date(),
});
let mut template = Template::new(TEMPLATE_PATH);
template.fields = json!({
"meetings": events,
"query": query,
"authorization": authorization,
});
return template.in_page(&req, "RCOS Meetings").await;
}