lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

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, &params_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, &params_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, &params_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, &params_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, &params_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, &params_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 }