#[cfg(server)]
use super::admin_auth::AdminAuthenticatedUser;
use crate::adapters::{AdminDatabase, AdminRecord, AdminSite, DetailResponse};
#[cfg(server)]
use crate::core::{AdminDatabaseKey, AdminSiteKey};
#[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::error::{AdminAuth, MapServerFnError, ModelPermission, require_object_filters};
#[cfg(server)]
use super::validation::retain_allowed_fields;
#[server_fn]
pub async fn get_detail(
model_name: String,
id: String,
#[inject] site: Depends<AdminSiteKey, AdminSite>,
#[inject] db: Depends<AdminDatabaseKey, AdminDatabase>,
#[inject] http_request: ServerFnRequest,
#[inject] AdminAuthenticatedUser(user): AdminAuthenticatedUser,
) -> Result<DetailResponse, ServerFnError> {
let auth = AdminAuth::from_request(&http_request);
let model_admin = site.get_model_admin(&model_name).map_server_fn_error()?;
auth.require_model_permission(model_admin.as_ref(), user.as_ref(), ModelPermission::View)
.await?;
let table_name = model_admin.table_name();
let pk_field = model_admin.pk_field();
let object_filters = require_object_filters(model_admin.as_ref(), user.as_ref())?;
let mut data = db
.get_with_filters::<AdminRecord>(table_name, pk_field, &id, object_filters)
.await
.map_server_fn_error()?
.ok_or_else(|| {
ServerFnError::server(404, format!("{} with id '{}' not found", model_name, id))
})?;
let visible_fields = model_admin
.fields()
.unwrap_or_else(|| model_admin.list_display());
retain_allowed_fields(&mut data, &visible_fields);
Ok(DetailResponse { model_name, data })
}