use crate::api::Database;
use axum::{routing::get, Router};
use std::sync::Arc;
use tower_http::cors::CorsLayer;
use tower_http::trace::TraceLayer;
pub mod handlers;
pub mod template;
#[derive(Clone)]
pub struct AppState {
pub db: Arc<Database>,
}
pub fn create_router(db: Database) -> Router {
let _ = db.execute("CREATE SCHEMA routes", ());
let _ = db.execute("CREATE SCHEMA templates", ());
let _ = db.execute(
"CREATE TABLE routes.definitions (method TEXT, path TEXT, template_name TEXT, context_query TEXT)",
()
);
let _ = db.execute(
"CREATE TABLE templates.source (name TEXT, content TEXT)",
(),
);
let state = AppState { db: Arc::new(db) };
Router::new()
.route(
"/api/rpc/:procedure_name",
axum::routing::post(handlers::invoke_procedure),
)
.route(
"/api/:table",
get(handlers::get_table)
.post(handlers::insert_row)
.patch(handlers::update_row)
.delete(handlers::delete_row),
)
.fallback(handlers::dynamic_route_handler)
.with_state(state)
.layer(TraceLayer::new_for_http())
.layer(CorsLayer::permissive())
}