farm.rs (5668B)
1 use radroots_replica_db_schema::farm::{ 2 Farm, FarmQueryBindValues, IFarmCreate, IFarmCreateResolve, IFarmDelete, IFarmDeleteResolve, 3 IFarmFieldsFilter, IFarmFindMany, IFarmFindManyResolve, IFarmFindOne, IFarmFindOneResolve, 4 IFarmUpdate, IFarmUpdateResolve, 5 }; 6 use radroots_sql_core::error::SqlError; 7 use radroots_sql_core::{SqlExecutor, utils}; 8 use radroots_types::types::{IError, IResult, IResultList}; 9 use serde_json::Value; 10 11 const TABLE_NAME: &str = "farm"; 12 13 pub fn create( 14 exec: &dyn SqlExecutor, 15 opts: &IFarmCreate, 16 ) -> Result<IFarmCreateResolve, IError<SqlError>> { 17 let field_map = utils::to_object_map(opts).expect("farm create fields serialize"); 18 let id = utils::uuidv4(); 19 let now = utils::time_created_on(); 20 let meta: [(&str, Value); 3] = [ 21 ("id", Value::from(id.clone())), 22 ("created_at", Value::from(now.clone())), 23 ("updated_at", Value::from(now.clone())), 24 ]; 25 let (sql, bind_values) = utils::build_insert_query_with_meta(TABLE_NAME, &meta, &field_map); 26 let params_json = 27 utils::to_params_json(bind_values).expect("farm create bind params serialize"); 28 let _ = exec.exec(&sql, ¶ms_json)?; 29 let on = FarmQueryBindValues::Id { id: id.clone() }; 30 let result = find_one_by_on(exec, &on)?.ok_or(IError::from(SqlError::NotFound(id.clone())))?; 31 Ok(IResult { result }) 32 } 33 34 pub fn find_one( 35 exec: &dyn SqlExecutor, 36 opts: &IFarmFindOne, 37 ) -> Result<IFarmFindOneResolve, IError<SqlError>> { 38 let result = match opts { 39 IFarmFindOne::On(args) => find_one_by_on(exec, &args.on)?, 40 }; 41 Ok(IResult { result }) 42 } 43 44 pub fn find_many( 45 exec: &dyn SqlExecutor, 46 opts: &IFarmFindMany, 47 ) -> Result<IFarmFindManyResolve, IError<SqlError>> { 48 let results = find_many_filter(exec, &opts.filter)?; 49 Ok(IResultList { results }) 50 } 51 52 fn find_many_filter( 53 exec: &dyn SqlExecutor, 54 filter: &Option<IFarmFieldsFilter>, 55 ) -> Result<Vec<Farm>, IError<SqlError>> { 56 let (sql, bind_values) = utils::build_select_query_with_meta(TABLE_NAME, filter.as_ref()); 57 let params_json = 58 utils::to_params_json(bind_values).expect("farm find_many bind params serialize"); 59 let json = exec.query_raw(&sql, ¶ms_json)?; 60 let rows: Vec<Farm> = utils::parse_json(&json)?; 61 Ok(rows) 62 } 63 64 fn find_one_by_on( 65 exec: &dyn SqlExecutor, 66 on: &FarmQueryBindValues, 67 ) -> Result<Option<Farm>, IError<SqlError>> { 68 let (column, value) = on.to_filter_param(); 69 let sql = format!("SELECT * FROM {TABLE_NAME} WHERE {column} = ? LIMIT 1;"); 70 let params_json = 71 utils::to_params_json(vec![value]).expect("farm find_one bind params serialize"); 72 let json = exec.query_raw(&sql, ¶ms_json)?; 73 let mut rows: Vec<Farm> = utils::parse_json(&json)?; 74 Ok(rows.pop()) 75 } 76 77 fn select_by_id(exec: &dyn SqlExecutor, id: &str) -> Result<Farm, IError<SqlError>> { 78 let params_json = utils::to_params_json(vec![Value::from(id.to_owned())]) 79 .expect("farm select_by_id bind params serialize"); 80 let sql = format!("SELECT * FROM {TABLE_NAME} WHERE id = ?;"); 81 let json = exec.query_raw(&sql, ¶ms_json)?; 82 let mut rows: Vec<Farm> = utils::parse_json(&json)?; 83 rows.pop() 84 .ok_or(IError::from(SqlError::NotFound(id.to_owned()))) 85 } 86 87 pub fn update( 88 exec: &dyn SqlExecutor, 89 opts: &IFarmUpdate, 90 ) -> Result<IFarmUpdateResolve, IError<SqlError>> { 91 let mut updates = 92 utils::to_partial_object_map(&opts.fields).expect("farm update fields serialize"); 93 if updates.is_empty() { 94 return Err(IError::from(SqlError::InvalidArgument(String::from( 95 "no fields to update", 96 )))); 97 } 98 updates.insert( 99 String::from("updated_at"), 100 Value::from(utils::time_created_on()), 101 ); 102 let mut set_parts = Vec::with_capacity(updates.len()); 103 let mut bind_values = Vec::with_capacity(updates.len() + 1); 104 for (column, value) in updates { 105 set_parts.push(format!("{column} = ?")); 106 bind_values.push(utils::to_db_bind_value(&value)); 107 } 108 let id_for_lookup = match opts.on.primary_key() { 109 Some(id) => id, 110 None => { 111 let found = find_one_by_on(exec, &opts.on)?; 112 let model = found.ok_or(IError::from(SqlError::NotFound(opts.on.lookup_key())))?; 113 model.id 114 } 115 }; 116 bind_values.push(Value::from(id_for_lookup.clone())); 117 let sql = format!( 118 "UPDATE {TABLE_NAME} SET {} WHERE id = ?;", 119 set_parts.join(", ") 120 ); 121 let params_json = 122 utils::to_params_json(bind_values).expect("farm update bind params serialize"); 123 let _ = exec.exec(&sql, ¶ms_json)?; 124 let updated = select_by_id(exec, &id_for_lookup)?; 125 Ok(IResult { result: updated }) 126 } 127 128 pub fn delete( 129 exec: &dyn SqlExecutor, 130 opts: &IFarmDelete, 131 ) -> Result<IFarmDeleteResolve, IError<SqlError>> { 132 let id_for_lookup = match opts { 133 IFarmDelete::On(args) => match args.on.primary_key() { 134 Some(id) => id, 135 None => { 136 let found = find_one_by_on(exec, &args.on)?; 137 let model = found.ok_or(IError::from(SqlError::NotFound(args.on.lookup_key())))?; 138 model.id 139 } 140 }, 141 }; 142 let params_json = utils::to_params_json(vec![Value::from(id_for_lookup.clone())]) 143 .expect("farm delete bind params serialize"); 144 let sql = format!("DELETE FROM {TABLE_NAME} WHERE id = ?;"); 145 let outcome = exec.exec(&sql, ¶ms_json)?; 146 if outcome.changes == 0 { 147 return Err(IError::from(SqlError::NotFound(id_for_lookup.clone()))); 148 } 149 Ok(IResult { 150 result: id_for_lookup, 151 }) 152 }