feature: extracting admin and services to
This commit is contained in:
+43
-28
@@ -9,6 +9,7 @@ use serde_json::Value;
|
||||
|
||||
use crate::admin::domain::{AdminApp, AdminModel};
|
||||
use crate::admin::state;
|
||||
use crate::admin::state::AdminState;
|
||||
use crate::service::templates;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
@@ -76,11 +77,12 @@ pub fn base_template(headers: &HeaderMap) -> Option<String> {
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn index(
|
||||
templates: State<templates::Templates>,
|
||||
registry: State<Arc<state::AdminRegistry>>,
|
||||
pub async fn index<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
headers: HeaderMap,
|
||||
) -> impl IntoResponse {
|
||||
let templates = admin.get_templates();
|
||||
let registry = admin.get_registry();
|
||||
templates.render_html(
|
||||
"admin/index.html",
|
||||
AdminContext {
|
||||
@@ -92,26 +94,29 @@ pub async fn index(
|
||||
}
|
||||
|
||||
// Index Action is POST to the index site. We can anchor some general business code here.
|
||||
pub async fn index_action() -> impl IntoResponse {
|
||||
pub async fn index_action<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
) -> impl IntoResponse {
|
||||
"There is your answer!".to_owned()
|
||||
}
|
||||
|
||||
pub async fn list_app(
|
||||
templates: State<templates::Templates>,
|
||||
pub async fn list_app<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
Path(app_key): Path<String>,
|
||||
) -> impl IntoResponse {
|
||||
let templates = admin.get_templates();
|
||||
templates.render_html("admin/app_list.jinja", ())
|
||||
}
|
||||
|
||||
// List Items renders the entire list item page.
|
||||
pub async fn list_item_collection(
|
||||
templates: State<templates::Templates>,
|
||||
registry: State<Arc<state::AdminRegistry>>,
|
||||
pub async fn list_item_collection<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
headers: HeaderMap,
|
||||
Path((app_key, model_key)): Path<(String, String)>,
|
||||
) -> impl IntoResponse {
|
||||
info!("list_item_collection {} for model {}", app_key, model_key);
|
||||
|
||||
let templates = admin.get_templates();
|
||||
let registry = admin.get_registry();
|
||||
let context = if let Ok(repo) = registry.get_repository(&app_key, &model_key) {
|
||||
let repo = repo.lock().await;
|
||||
let admin_model = registry
|
||||
@@ -136,19 +141,21 @@ pub async fn list_item_collection(
|
||||
}
|
||||
|
||||
// Items Action is a POST to an item list. By default these are actions, that work on a list of items as input.
|
||||
pub async fn item_collection_action(
|
||||
pub async fn item_collection_action<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
Path((app_key, model_key)): Path<(String, String)>,
|
||||
) -> impl IntoResponse {
|
||||
"There is your answer!".to_owned()
|
||||
}
|
||||
|
||||
// Item Details shows one single dataset.
|
||||
pub async fn view_item_details(
|
||||
templates: State<templates::Templates>,
|
||||
registry: State<Arc<state::AdminRegistry>>,
|
||||
pub async fn view_item_details<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
headers: HeaderMap,
|
||||
Path((app_key, model_key, id)): Path<(String, String, String)>,
|
||||
) -> impl IntoResponse {
|
||||
let templates = admin.get_templates();
|
||||
let registry = admin.get_registry();
|
||||
let context = if let Ok(repo) = registry.get_repository(&app_key, &model_key) {
|
||||
let repo = repo.lock().await;
|
||||
let admin_model = registry
|
||||
@@ -174,12 +181,13 @@ pub async fn view_item_details(
|
||||
templates.render_html("admin/items/item_detail.jinja", context)
|
||||
}
|
||||
|
||||
pub async fn new_item(
|
||||
templates: State<templates::Templates>,
|
||||
registry: State<Arc<state::AdminRegistry>>,
|
||||
pub async fn new_item<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
headers: HeaderMap,
|
||||
Path((app_key, model_key)): Path<(String, String)>,
|
||||
) -> impl IntoResponse {
|
||||
let templates = admin.get_templates();
|
||||
let registry = admin.get_registry();
|
||||
let context = if let Ok(repo) = registry.get_repository(&app_key, &model_key) {
|
||||
let repo = repo.lock().await;
|
||||
let admin_model = registry
|
||||
@@ -203,13 +211,14 @@ pub async fn new_item(
|
||||
templates.render_html("admin/items/item_create.jinja", context)
|
||||
}
|
||||
|
||||
pub async fn create_item(
|
||||
templates: State<templates::Templates>,
|
||||
registry: State<Arc<state::AdminRegistry>>,
|
||||
pub async fn create_item<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
headers: HeaderMap,
|
||||
Path((app_key, model_key)): Path<(String, String)>,
|
||||
Form(form): Form<Value>,
|
||||
) -> impl IntoResponse {
|
||||
let templates = admin.get_templates();
|
||||
let registry = admin.get_registry();
|
||||
let context = if let Ok(repo) = registry.get_repository(&app_key, &model_key) {
|
||||
let mut repo = repo.lock().await;
|
||||
let admin_model = registry
|
||||
@@ -240,12 +249,13 @@ pub async fn create_item(
|
||||
}
|
||||
|
||||
/// Change is the GET version.
|
||||
pub async fn change_item(
|
||||
templates: State<templates::Templates>,
|
||||
registry: State<Arc<state::AdminRegistry>>,
|
||||
pub async fn change_item<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
headers: HeaderMap,
|
||||
Path((app_key, model_key, id)): Path<(String, String, String)>,
|
||||
) -> impl IntoResponse {
|
||||
let templates = admin.get_templates();
|
||||
let registry = admin.get_registry();
|
||||
let context = if let Ok(repo) = registry.get_repository(&app_key, &model_key) {
|
||||
let repo = repo.lock().await;
|
||||
let admin_model = registry
|
||||
@@ -271,13 +281,14 @@ pub async fn change_item(
|
||||
templates.render_html("admin/items/item_change.jinja", context)
|
||||
}
|
||||
|
||||
pub async fn update_item(
|
||||
templates: State<templates::Templates>,
|
||||
registry: State<Arc<state::AdminRegistry>>,
|
||||
pub async fn update_item<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
headers: HeaderMap,
|
||||
Path((app_key, model_key, id)): Path<(String, String, String)>,
|
||||
Form(form): Form<Value>,
|
||||
) -> impl IntoResponse {
|
||||
let templates = admin.get_templates();
|
||||
let registry = admin.get_registry();
|
||||
let context = if let Ok(repo) = registry.get_repository(&app_key, &model_key) {
|
||||
let mut repo = repo.lock().await;
|
||||
let admin_model = registry
|
||||
@@ -307,13 +318,17 @@ pub async fn update_item(
|
||||
}
|
||||
|
||||
// Item Action allows running an action on one single dataset.
|
||||
pub async fn item_action(
|
||||
pub async fn item_action<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
Path((app_key, model_key, model_id)): Path<(String, String, String)>,
|
||||
) -> impl IntoResponse {
|
||||
"There is your answer!".to_owned()
|
||||
}
|
||||
|
||||
pub async fn debug_view(Path(data): Path<String>) -> impl IntoResponse {
|
||||
pub async fn debug_view<S: AdminState + Clone + Send + Sync + 'static>(
|
||||
admin: State<S>,
|
||||
Path(data): Path<String>,
|
||||
) -> impl IntoResponse {
|
||||
println!("debug: {}", data);
|
||||
"Debug!".to_owned()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user