feat(repositories): add update_by_id method
This commit is contained in:
parent
8e9d2e06d4
commit
e4f6c0f12d
2 changed files with 43 additions and 0 deletions
|
|
@ -29,6 +29,8 @@ Will be used in [minauthator](https://forge.lefuturiste.fr/mbess/minauthator).
|
||||||
- [x] get_by_id
|
- [x] get_by_id
|
||||||
- [x] insert
|
- [x] insert
|
||||||
- [x] insert_many
|
- [x] insert_many
|
||||||
|
- [ ] generate custom by
|
||||||
|
- [x] co-exist with custom repository
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -130,6 +130,44 @@ fn gen_insert_many_method(model: &Model) -> TokenStream {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn gen_update_by_id_method(model: &Model) -> TokenStream {
|
||||||
|
let resource_ident = format_ident!("{}", &model.name);
|
||||||
|
let error_msg = format!("Failed to update resource {:?}", model.name.clone());
|
||||||
|
let primary_key = &model.fields.iter()
|
||||||
|
.find(|f| f.is_primary)
|
||||||
|
.expect("A model must have at least one primary key")
|
||||||
|
.name;
|
||||||
|
let set_statements = model.fields.iter().enumerate()
|
||||||
|
.map(|(i, field)| format!("{} = ${}", field.name, i+2))
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
.join(", ");
|
||||||
|
|
||||||
|
let func_name_ident = format_ident!("update_by_{}", primary_key);
|
||||||
|
let update_query = format!(
|
||||||
|
"UPDATE {} SET {} WHERE {} = $1",
|
||||||
|
model.table_name,
|
||||||
|
set_statements,
|
||||||
|
primary_key
|
||||||
|
);
|
||||||
|
let field_names: Vec<proc_macro2::Ident> = model.fields.iter()
|
||||||
|
.map(|f| format_ident!("{}", &f.name))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
quote! {
|
||||||
|
pub async fn #func_name_ident(&self, item_id: &str, entity: &#resource_ident) -> Result<()> {
|
||||||
|
sqlx::query(#update_query)
|
||||||
|
.bind(item_id)
|
||||||
|
#( .bind( &entity.#field_names ) )*
|
||||||
|
.execute(&self.db.0)
|
||||||
|
.await
|
||||||
|
.context(#error_msg)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fn generate_repository_file(model: &Model) -> Result<SourceNodeContainer> {
|
fn generate_repository_file(model: &Model) -> Result<SourceNodeContainer> {
|
||||||
let resource_name = model.name.clone();
|
let resource_name = model.name.clone();
|
||||||
|
|
||||||
|
|
@ -142,6 +180,7 @@ fn generate_repository_file(model: &Model) -> Result<SourceNodeContainer> {
|
||||||
let get_by_id_method_code = gen_get_by_id_method(&model);
|
let get_by_id_method_code = gen_get_by_id_method(&model);
|
||||||
let insert_method_code = gen_insert_method(&model);
|
let insert_method_code = gen_insert_method(&model);
|
||||||
let insert_many_method_code = gen_insert_many_method(&model);
|
let insert_many_method_code = gen_insert_many_method(&model);
|
||||||
|
let update_by_id_method_code = gen_update_by_id_method(&model);
|
||||||
|
|
||||||
// TODO: add import line
|
// TODO: add import line
|
||||||
|
|
||||||
|
|
@ -168,6 +207,8 @@ fn generate_repository_file(model: &Model) -> Result<SourceNodeContainer> {
|
||||||
#insert_method_code
|
#insert_method_code
|
||||||
|
|
||||||
#insert_many_method_code
|
#insert_many_method_code
|
||||||
|
|
||||||
|
#update_by_id_method_code
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// convert TokenStream into rust code as string
|
// convert TokenStream into rust code as string
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue