-
Notifications
You must be signed in to change notification settings - Fork 2
/
ui_state_get.rs
55 lines (51 loc) · 1.71 KB
/
ui_state_get.rs
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
use crate::{
error::Error as SecutilsError,
server::{AppState, SubscriptionState, UiState},
users::{ClientUserShare, PublicUserDataNamespace, User, UserShare},
};
use actix_web::{web, HttpResponse};
use anyhow::anyhow;
use std::ops::Deref;
pub async fn ui_state_get(
state: web::Data<AppState>,
user: Option<User>,
user_share: Option<UserShare>,
) -> Result<HttpResponse, SecutilsError> {
// Settings only available for authenticated users.
let settings = if let Some(ref user) = user {
state
.api
.users()
.get_data(user.id, PublicUserDataNamespace::UserSettings)
.await?
.map(|user_data| user_data.value)
} else {
None
};
// Utils are only available for authenticated users or when accessing shared resources.
let utils = if user.is_some() || user_share.is_some() {
state.api.utils().get_all().await?
} else {
vec![]
};
let status = state.status.read().map_err(|err| {
log::error!("Failed to read status: {err}");
SecutilsError::from(anyhow!("Status is not available."))
})?;
let features = user
.as_ref()
.map(|user| user.subscription.get_features(&state.config));
Ok(HttpResponse::Ok().json(UiState {
status: status.deref(),
user,
subscription: SubscriptionState {
features,
manage_url: state.config.subscriptions.manage_url.as_ref(),
feature_overview_url: state.config.subscriptions.feature_overview_url.as_ref(),
},
user_share: user_share.map(ClientUserShare::from),
settings,
utils,
webhook_url_type: state.config.webhook_url_type,
}))
}