Mutations
In this section, we will break down the implementation of the /mutation
endpoint.
The mutation endpoint is handled by the post_mutation
function:
async fn post_mutation(
State(state): State<Arc<Mutex<AppState>>>,
Json(request): Json<models::MutationRequest>,
) -> Result<Json<models::MutationResponse>> {
This function receives the application state, and the MutationRequest
structure.
The function iterates over the collection of requested MutationOperation
structures, and handles each one in turn, adding each result to the operation_results
field in the response:
if request.operations.len() > 1 {
Err((
StatusCode::NOT_IMPLEMENTED,
Json(models::ErrorResponse {
message: "transactional mutations are not supported".into(),
details: serde_json::Value::Null,
}),
))
} else {
let mut state = state.lock().await;
let mut operation_results = vec![];
for operation in &request.operations {
let operation_result = execute_mutation_operation(
&mut state,
&request.collection_relationships,
operation,
)?;
operation_results.push(operation_result);
}
Ok(Json(models::MutationResponse { operation_results }))
}
}
The execute_mutation_operation
function is responsible for executing an individual operation. In the next section, we'll break that function down.