refactor: using type erasure so users can define their own primary key types instead of lookupkey

This commit is contained in:
2024-05-21 22:53:44 +02:00
parent 6b207872a1
commit d1abc6b6c2
7 changed files with 323 additions and 157 deletions
+7 -6
View File
@@ -9,6 +9,7 @@ use crate::admin::domain::{AdminApp, AdminModel};
use crate::admin::state::AdminState;
use serde::{Deserialize, Serialize};
use super::domain::repository::PrimaryKeyType;
use super::domain::{LookupKey, RepositoryInfo, RepositoryItem, RepositoryList};
#[derive(Serialize, Deserialize)]
@@ -157,13 +158,13 @@ pub async fn view_item_details<S: AdminState + Clone + Send + Sync + 'static>(
let admin_model = registry
.get_model(&app_key, &model_key)
.expect("Admin Model not found?");
let key: LookupKey = id.into();
let key: Box<dyn PrimaryKeyType> = Box::new(id);
AdminContext {
base: base_template(&headers),
available_apps: registry.get_apps(),
item_info: Some(repo.info(&admin_model).await),
item_list: repo.list(&admin_model).await,
item: repo.get(&admin_model, key).await,
item: repo.get(&admin_model, key.as_ref()).await,
item_model: Some(admin_model),
..Default::default()
}
@@ -257,13 +258,13 @@ pub async fn change_item<S: AdminState + Clone + Send + Sync + 'static>(
let admin_model = registry
.get_model(&app_key, &model_key)
.expect("Admin Model not found?");
let key: LookupKey = id.into();
let key: Box<dyn PrimaryKeyType> = Box::new(id);
AdminContext {
base: base_template(&headers),
available_apps: registry.get_apps(),
item_info: Some(repo.info(&admin_model).await),
item_list: repo.list(&admin_model).await,
item: repo.get(&admin_model, key).await,
item: repo.get(&admin_model, key.as_ref()).await,
item_model: Some(admin_model),
..Default::default()
}
@@ -290,9 +291,9 @@ pub async fn update_item<S: AdminState + Clone + Send + Sync + 'static>(
let admin_model = registry
.get_model(&app_key, &model_key)
.expect("Admin Model not found?");
let key: LookupKey = id.into();
let key: Box<dyn PrimaryKeyType> = Box::new(id);
let result = repo.update(&admin_model, key, form).await;
let result = repo.update(&admin_model, key.as_ref(), form).await;
AdminContext {
base: base_template(&headers),