use tower_cookies::Cookies;
use crate::{DbPool, models::project::Project};
pub const PROJECT_COOKIE: &str = "miniapm_project";
#[derive(Clone, Debug)]
pub struct WebProjectContext {
pub current_project: Option<Project>,
pub projects: Vec<Project>,
pub projects_enabled: bool,
}
impl WebProjectContext {
pub fn project_id(&self) -> Option<i64> {
self.current_project.as_ref().map(|p| p.id)
}
pub fn is_current_project(&self, id: &i64) -> bool {
self.current_project.as_ref().map(|p| p.id) == Some(*id)
}
pub fn show_selector(&self) -> bool {
self.projects_enabled && self.projects.len() > 1
}
}
pub fn get_project_context(pool: &DbPool, cookies: &Cookies) -> WebProjectContext {
let projects_enabled = std::env::var("ENABLE_PROJECTS")
.map(|v| v == "1" || v.to_lowercase() == "true")
.unwrap_or(false);
if !projects_enabled {
return WebProjectContext {
current_project: None,
projects: vec![],
projects_enabled: false,
};
}
let projects = crate::models::project::list_all(pool).unwrap_or_default();
let project_slug = cookies.get(PROJECT_COOKIE).map(|c| c.value().to_string());
let current_project = match project_slug {
Some(slug) => projects.iter().find(|p| p.slug == slug).cloned(),
None => projects.first().cloned(),
};
WebProjectContext {
current_project,
projects,
projects_enabled,
}
}