feat(repositories): add get_many_by_id method
This commit is contained in:
parent
e4a1006412
commit
7a6243c6e4
3 changed files with 62 additions and 5 deletions
15
TODO.md
15
TODO.md
|
|
@ -6,14 +6,25 @@
|
||||||
- add automagically generated CHECK constraints on enum type field
|
- add automagically generated CHECK constraints on enum type field
|
||||||
- support foreign key CHECK constraints
|
- support foreign key CHECK constraints
|
||||||
|
|
||||||
- Repositories generation
|
- [x] Repositories generation
|
||||||
- default CRUD boilerplate
|
- default CRUD boilerplate
|
||||||
- get_all
|
- get_all
|
||||||
- get_by_id
|
- get_by_id
|
||||||
|
- get_many_by_ids
|
||||||
- insert
|
- insert
|
||||||
- update
|
- update
|
||||||
|
- delete_by_id
|
||||||
- custom queries
|
- custom queries
|
||||||
|
|
||||||
- Config file for project
|
- [ ] Config file for project
|
||||||
- configure models path
|
- configure models path
|
||||||
- configure repositories path
|
- configure repositories path
|
||||||
|
|
||||||
|
- [ ] Better errors
|
||||||
|
- Better support for lib like `thiserror`
|
||||||
|
- Don't export anyhow errors
|
||||||
|
|
||||||
|
- [ ] Support basic one to many, many to one, belongs to relationships
|
||||||
|
- [ ] Support generating inner join SQL query
|
||||||
|
- [ ] Better, cleaner migration support
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,6 @@ enum UserStatus {
|
||||||
Archived
|
Archived
|
||||||
}
|
}
|
||||||
|
|
||||||
struct RandomStruct {
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(SqlGeneratorDerive, sqlx::FromRow, Debug, Clone)]
|
#[derive(SqlGeneratorDerive, sqlx::FromRow, Debug, Clone)]
|
||||||
#[sql_generator_model(table_name="usersss")]
|
#[sql_generator_model(table_name="usersss")]
|
||||||
#[fully_pub]
|
#[fully_pub]
|
||||||
|
|
@ -31,3 +28,18 @@ struct User {
|
||||||
avatar_bytes: Vec<u8>
|
avatar_bytes: Vec<u8>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(SqlGeneratorDerive, sqlx::FromRow, Debug, Clone)]
|
||||||
|
#[sql_generator_model(table_name="user_tokens")]
|
||||||
|
#[fully_pub]
|
||||||
|
struct UserToken {
|
||||||
|
#[sql_generator_field(is_primary=true)]
|
||||||
|
id: String,
|
||||||
|
#[sql_generator_field(foreign_key=Relation::BelongsTo(User))]
|
||||||
|
user_id: String,
|
||||||
|
secret: String,
|
||||||
|
last_use_time: Option<DateTime<Utc>>,
|
||||||
|
creation_time: DateTime<Utc>,
|
||||||
|
expiration_time: DateTime<Utc>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
fn gen_insert_method(model: &Model) -> TokenStream {
|
||||||
let resource_ident = format_ident!("{}", &model.name);
|
let resource_ident = format_ident!("{}", &model.name);
|
||||||
let error_msg = format!("Failed to insert resource {:?}", model.name.clone());
|
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_all_method_code = gen_get_all_method(&model);
|
||||||
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 get_many_by_id_method_code = gen_get_many_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);
|
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_by_id_method_code
|
||||||
|
|
||||||
|
#get_many_by_id_method_code
|
||||||
|
|
||||||
#insert_method_code
|
#insert_method_code
|
||||||
|
|
||||||
#insert_many_method_code
|
#insert_many_method_code
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue