use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::core::writer::operation::{BulkRawSpec, Operation};
use crate::core::writer::outcome::WriteOutcome;
use crate::state::AppState;
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, Default)]
pub struct BulkJsonArgs {
pub operations: Vec<serde_json::Value>,
}
pub async fn things_bulk_json(
state: AppState,
args: BulkJsonArgs,
) -> anyhow::Result<WriteOutcome> {
if args.operations.is_empty() {
return Err(crate::core::error::ThingsError::InvalidInput {
field: "operations".into(),
reason: "operations must be non-empty".into(),
}
.into());
}
if args.operations.len() > 250 {
return Err(crate::core::error::ThingsError::InvalidInput {
field: "operations".into(),
reason: format!(
"operations exceeds Things rate limit (max 250, got {})",
args.operations.len()
),
}
.into());
}
for (i, op) in args.operations.iter().enumerate() {
if !op.is_object() {
return Err(crate::core::error::ThingsError::InvalidInput {
field: format!("operations[{i}]"),
reason: "each element must be a JSON object".into(),
}
.into());
}
}
let op = Operation::BulkRaw(BulkRawSpec {
operations: args.operations,
});
let outcome = state.writer.fire(op, None).await?;
Ok(outcome)
}