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
mod semesters;
use crate::api::rcos::users::role_lookup::RoleLookup;
use crate::api::rcos::users::UserRole;
use crate::error::TelescopeError;
use crate::templates::page::Page;
use crate::templates::Template;
use crate::web::middlewares::authorization::{Authorization, AuthorizationResult};
use actix_web::guard;
use actix_web::web as aweb;
use actix_web::web::ServiceConfig;
use actix_web::HttpRequest;
use futures::future::LocalBoxFuture;
use uuid::Uuid;
fn admin_authorization(user_id: Uuid) -> LocalBoxFuture<'static, AuthorizationResult> {
Box::pin(async move {
let role: UserRole = RoleLookup::get(user_id)
.await?
.expect("Viewer's account does not exist.");
if !role.is_admin() {
Err(TelescopeError::Forbidden)
} else {
Ok(())
}
})
}
pub fn register(config: &mut ServiceConfig) {
let admin_authorization_middleware: Authorization = Authorization::new(admin_authorization);
config.service(
aweb::resource("/admin")
.guard(guard::Get())
.wrap(admin_authorization_middleware.clone())
.to(index),
);
config.service(
aweb::scope("/admin/")
.wrap(admin_authorization_middleware)
.configure(semesters::register),
);
}
async fn index(req: HttpRequest) -> Result<Page, TelescopeError> {
return Template::new("admin/index")
.in_page(&req, "RCOS Admin")
.await;
}