lib

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

farm_member.rs (6142B)


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