reinhardt_admin/server/create.rs
1//! Create operation Server Function
2//!
3//! Provides create operations for admin models.
4
5use crate::adapters::{AdminDatabase, AdminRecord, AdminSite};
6use crate::types::{MutationRequest, MutationResponse};
7use reinhardt_pages::server_fn::{ServerFnError, server_fn};
8use std::sync::Arc;
9
10#[cfg(not(target_arch = "wasm32"))]
11use super::error::MapServerFnError;
12
13/// Create a new model instance
14///
15/// Inserts a new record into the database using the provided field data.
16/// Returns the number of affected rows (typically 1) on success.
17///
18/// # Server Function
19///
20/// This function is automatically exposed as an HTTP endpoint by the `#[server_fn]` macro.
21/// AdminSite and AdminDatabase dependencies are automatically injected via the DI system.
22///
23/// # Example
24///
25/// ```ignore
26/// use reinhardt_admin::server::create_record;
27/// use reinhardt_admin::types::MutationRequest;
28/// use std::collections::HashMap;
29///
30/// // Client-side usage (automatically generates HTTP request)
31/// let mut data = HashMap::new();
32/// data.insert("username".to_string(), serde_json::json!("alice"));
33/// data.insert("email".to_string(), serde_json::json!("alice@example.com"));
34///
35/// let request = MutationRequest { data };
36/// let response = create_record("User".to_string(), request).await?;
37/// println!("Created: {}", response.message);
38/// ```
39#[server_fn(use_inject = true)]
40pub async fn create_record(
41 model_name: String,
42 request: MutationRequest,
43 #[inject] site: Arc<AdminSite>,
44 #[inject] db: Arc<AdminDatabase>,
45) -> Result<MutationResponse, ServerFnError> {
46 let model_admin = site.get_model_admin(&model_name).map_server_fn_error()?;
47 let table_name = model_admin.table_name();
48
49 let affected = db
50 .create::<AdminRecord>(table_name, request.data)
51 .await
52 .map_server_fn_error()?;
53
54 Ok(MutationResponse {
55 success: true,
56 message: format!("{} created successfully", model_name),
57 affected: Some(affected),
58 data: None,
59 })
60}