use crate::adapters::{AdminSite, DashboardResponse, ModelInfo};
#[cfg(server)]
use reinhardt_di::Depends;
#[cfg(server)]
use reinhardt_pages::server_fn::ServerFnRequest;
use reinhardt_pages::server_fn::{ServerFnError, server_fn};
#[cfg(server)]
use super::admin_auth::AdminAuthenticatedUser;
#[cfg(server)]
use super::error::AdminAuth;
#[cfg(server)]
use super::security::{build_csrf_cookie, generate_csrf_token};
#[server_fn]
pub async fn get_dashboard(
#[inject] site: Depends<AdminSite>,
#[inject] http_request: ServerFnRequest,
#[inject] AdminAuthenticatedUser(_user): AdminAuthenticatedUser,
) -> Result<DashboardResponse, ServerFnError> {
let auth = AdminAuth::from_request(&http_request);
auth.require_staff()?;
let models: Vec<ModelInfo> = site
.registered_models()
.into_iter()
.map(|name| {
let list_url = format!("{}/{}/", site.url_prefix(), name.to_lowercase());
ModelInfo { name, list_url }
})
.collect();
let csrf_token = generate_csrf_token();
let is_secure = http_request.inner().is_secure;
let cookie_value = build_csrf_cookie(&csrf_token, is_secure);
http_request.add_response_cookie(cookie_value);
let admin_settings = crate::settings::get_admin_settings();
Ok(DashboardResponse {
site_name: site.name().to_string(),
site_header: admin_settings.site_header.clone(),
url_prefix: site.url_prefix().to_string(),
login_url: admin_settings.login_url.clone(),
logout_url: admin_settings.logout_url.clone(),
models,
csrf_token: Some(csrf_token),
})
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::ModelInfo;
use std::sync::Arc;
#[tokio::test]
async fn test_dashboard_response_structure() {
let site = Arc::new(AdminSite::new("Test Admin"));
let expected_site_name = site.name().to_string();
let expected_url_prefix = site.url_prefix().to_string();
assert_eq!(expected_site_name, "Test Admin");
assert_eq!(expected_url_prefix, "/admin");
}
#[test]
fn test_model_info_construction() {
let model_name = "User".to_string();
let list_url = format!("/admin/{}/", model_name.to_lowercase());
let model_info = ModelInfo {
name: model_name.clone(),
list_url: list_url.clone(),
};
assert_eq!(model_info.name, "User");
assert_eq!(model_info.list_url, "/admin/user/");
}
}