1
0
Fork 0
forked from 2sys/phonograph
phonograph/src/router.rs

157 lines
5.2 KiB
Rust
Raw Normal View History

2025-05-02 23:48:54 -07:00
use axum::{
http::{header::CACHE_CONTROL, HeaderValue},
2025-05-26 22:08:21 -07:00
routing::{get, post},
2025-05-02 23:48:54 -07:00
Router,
};
use tower::ServiceBuilder;
use tower_http::{
services::{ServeDir, ServeFile},
set_header::SetResponseHeaderLayer,
};
2025-05-26 22:08:21 -07:00
use crate::{app_state::AppState, auth, routes};
2025-05-13 00:02:33 -07:00
2025-05-02 23:48:54 -07:00
pub fn new_router(state: AppState) -> Router<()> {
let base_path = state.settings.base_path.clone();
let app = Router::new()
2025-05-26 22:08:21 -07:00
.route("/databases", get(routes::bases::list_bases_page))
.route("/databases/add", post(routes::bases::add_base_page))
.route(
"/d/{base_id}/config",
get(routes::bases::base_config_page_get),
)
.route(
"/d/{base_id}/config",
post(routes::bases::base_config_page_post),
)
.route(
"/d/{base_id}/relations",
get(routes::relations::list_relations_page),
)
.route(
"/d/{base_id}/r/{class_oid}/viewer",
get(routes::relations::viewer_page),
)
2025-05-02 23:48:54 -07:00
.nest("/auth", auth::new_router())
.layer(SetResponseHeaderLayer::if_not_present(
CACHE_CONTROL,
HeaderValue::from_static("no-cache"),
))
2025-05-26 22:08:21 -07:00
.nest_service(
"/js_dist",
ServiceBuilder::new()
.layer(SetResponseHeaderLayer::if_not_present(
CACHE_CONTROL,
HeaderValue::from_static("max-age=21600, stale-while-revalidate=86400"),
))
.service(
ServeDir::new("js_dist").not_found_service(
ServiceBuilder::new()
.layer(SetResponseHeaderLayer::if_not_present(
CACHE_CONTROL,
HeaderValue::from_static("no-cache"),
))
.service(ServeFile::new("static/_404.html")),
),
),
)
2025-05-02 23:48:54 -07:00
.fallback_service(
ServiceBuilder::new()
.layer(SetResponseHeaderLayer::if_not_present(
CACHE_CONTROL,
HeaderValue::from_static("max-age=21600, stale-while-revalidate=86400"),
))
.service(
ServeDir::new("static").not_found_service(
ServiceBuilder::new()
.layer(SetResponseHeaderLayer::if_not_present(
CACHE_CONTROL,
HeaderValue::from_static("no-cache"),
))
.service(ServeFile::new("static/_404.html")),
),
),
)
.with_state(state);
if base_path.is_empty() {
app
} else {
Router::new().nest(&base_path, app).fallback_service(
ServeDir::new("static").not_found_service(ServeFile::new("static/_404.html")),
)
}
}
2025-05-26 22:08:21 -07:00
// #[derive(Deserialize)]
// struct RbacIndexPath {
// oid: u32,
// }
//
// async fn rbac_index(
// State(Settings {
// base_path,
// pg_user_role_prefix: role_prefix,
// ..
// }): State<Settings>,
// DieselConn(diesel_conn): DieselConn,
// PgConn(pg_client): PgConn,
// CurrentUser(current_user): CurrentUser,
// Path(params): Path<RbacIndexPath>,
// ) -> Result<Response, AppError> {
// pg_set_role(&role_prefix, &current_user.id, &pg_client, &diesel_conn)
// .await
// .context("failed to set tokio_postgres role")?;
//
// struct UserDetails {
// user: User,
// roles: Vec<String>,
// }
// let all_users = {
// let role_prefix = role_prefix.clone();
// diesel_conn
// .interact(move |conn| -> Result<_> {
// let pg_users: Vec<PgRole> =
// .get_results(conn)
// .context("failed to query pg users with database access")?;
// let user_ids: Vec<Uuid> = pg_users
// .iter()
// .filter_map(|role| {
// let mut rolname = role.rolname.clone();
// rolname.replace_range(0..role_prefix.len(), "");
// Uuid::parse_str(&rolname).ok()
// })
// .collect();
// let all_users: Vec<User> = users::table
// .filter(users::dsl::id.eq_any(user_ids))
// .get_results(conn)
// .context("failed to query users with database access")?;
// Ok(all_users)
// })
// .await
// .unwrap()?
// };
// #[derive(Template)]
// #[template(path = "rbac.html")]
// struct ResponseTemplate {
// base_path: String,
// role_prefix: String,
// users: Vec<UserDetails>,
// }
//
// Ok(Html(
// ResponseTemplate {
// base_path,
// role_prefix,
// users: all_users
// .into_iter()
// .map(|user| UserDetails {
// user,
// roles: vec![],
// })
// .collect(),
// }
// .render()?,
// )
// .into_response())
// }