pub async fn update_task_status(
&self,
task_id: &str,
new_status: TaskStatus,
expected_status: TaskStatus,
) -> Result<(), AppError> {
self.db.update_item()
.table_name(&self.table)
.key("PK", av!(format!("TASK#{task_id}")))
.key("SK", av!("META"))
.update_expression("SET #s = :new, updated_at = :now")
.condition_expression("#s = :expected")
.expression_attribute_names("#s", "status")
.expression_attribute_values(":new", av!(new_status.as_str()))
.expression_attribute_values(":expected", av!(expected_status.as_str()))
.expression_attribute_values(":now", av!(Utc::now().to_rfc3339()))
.send().await
.map_err(|e| if is_condition_failed(&e) {
AppError::StatusConflict { expected: expected_status, actual: TaskStatus::Unknown }
} else {
AppError::from(e)
})
}