Skip to main content

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}