lib

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

plot_gcs_location.rs (6328B)


      1 use radroots_replica_schema::plot_gcs_location::{
      2     IPlotGcsLocationCreate, IPlotGcsLocationCreateResolve, IPlotGcsLocationDelete,
      3     IPlotGcsLocationDeleteResolve, IPlotGcsLocationFieldsFilter, IPlotGcsLocationFindMany,
      4     IPlotGcsLocationFindManyResolve, IPlotGcsLocationFindOne, IPlotGcsLocationFindOneResolve,
      5     IPlotGcsLocationUpdate, IPlotGcsLocationUpdateResolve, PlotGcsLocation,
      6     PlotGcsLocationQueryBindValues,
      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 = "plot_gcs_location";
     14 
     15 pub fn create(
     16     exec: &dyn SqlExecutor,
     17     opts: &IPlotGcsLocationCreate,
     18 ) -> Result<IPlotGcsLocationCreateResolve, 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, &params_json)?;
     30     let on = PlotGcsLocationQueryBindValues::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: &IPlotGcsLocationFindOne,
     39 ) -> Result<IPlotGcsLocationFindOneResolve, ReplicaSchemaError<SqlError>> {
     40     let result = match opts {
     41         IPlotGcsLocationFindOne::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: &IPlotGcsLocationFindMany,
     49 ) -> Result<IPlotGcsLocationFindManyResolve, 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<IPlotGcsLocationFieldsFilter>,
     57 ) -> Result<Vec<PlotGcsLocation>, 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, &params_json)?;
     61     let rows: Vec<PlotGcsLocation> = utils::parse_json(&json)?;
     62     Ok(rows)
     63 }
     64 
     65 fn find_one_by_on(
     66     exec: &dyn SqlExecutor,
     67     on: &PlotGcsLocationQueryBindValues,
     68 ) -> Result<Option<PlotGcsLocation>, 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, &params_json)?;
     73     let mut rows: Vec<PlotGcsLocation> = utils::parse_json(&json)?;
     74     Ok(rows.pop())
     75 }
     76 
     77 fn select_by_id(
     78     exec: &dyn SqlExecutor,
     79     id: &str,
     80 ) -> Result<PlotGcsLocation, 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, &params_json)?;
     85     let mut rows: Vec<PlotGcsLocation> = 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: &IPlotGcsLocationUpdate,
     93 ) -> Result<IPlotGcsLocationUpdateResolve, 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, &params_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: &IPlotGcsLocationDelete,
    135 ) -> Result<IPlotGcsLocationDeleteResolve, ReplicaSchemaError<SqlError>> {
    136     let id_for_lookup = match opts {
    137         IPlotGcsLocationDelete::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, &params_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 }