feat(repositories): add get_many_by_id method

This commit is contained in:
Matthieu Bessat 2025-07-31 17:15:00 +02:00
parent e4a1006412
commit 7a6243c6e4
3 changed files with 62 additions and 5 deletions

View file

@ -44,6 +44,37 @@ fn gen_get_by_id_method(model: &Model) -> TokenStream {
}
}
fn gen_get_many_by_id_method(model: &Model) -> TokenStream {
let resource_ident = format_ident!("{}", &model.name);
let primary_key = &model.fields.iter()
.find(|f| f.is_primary)
.expect("A model must have at least one primary key")
.name;
let select_query_tmpl = format!("SELECT * FROM {} WHERE {} IN ({{}})", model.table_name, primary_key);
let func_name_ident = format_ident!("get_many_by_{}", primary_key);
quote! {
pub async fn #func_name_ident(&self, items_ids: &[&str]) -> Result<Vec<#resource_ident>, sqlx::Error> {
if items_ids.is_empty() {
return Ok(vec![])
}
let placeholder_params: String = (1..=(items_ids.len()))
.map(|i| format!("${}", i))
.collect::<Vec<String>>()
.join(",");
let query_sql = format!(#select_query_tmpl, placeholder_params);
let mut query = sqlx::query_as::<_, #resource_ident>(&query_sql);
for id in items_ids {
query = query.bind(id)
}
query
.fetch_all(&self.db.0)
.await
}
}
}
fn gen_insert_method(model: &Model) -> TokenStream {
let resource_ident = format_ident!("{}", &model.name);
let error_msg = format!("Failed to insert resource {:?}", model.name.clone());
@ -204,6 +235,7 @@ fn generate_repository_file(model: &Model) -> Result<SourceNodeContainer> {
let get_all_method_code = gen_get_all_method(&model);
let get_by_id_method_code = gen_get_by_id_method(&model);
let get_many_by_id_method_code = gen_get_many_by_id_method(&model);
let insert_method_code = gen_insert_method(&model);
let insert_many_method_code = gen_insert_many_method(&model);
let update_by_id_method_code = gen_update_by_id_method(&model);
@ -231,6 +263,8 @@ fn generate_repository_file(model: &Model) -> Result<SourceNodeContainer> {
#get_by_id_method_code
#get_many_by_id_method_code
#insert_method_code
#insert_many_method_code