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