use axum::Router; use axum::routing::{delete, get, patch, post, put}; use crate::handlers::accept_invite::accept_invite; use crate::handlers::add_member::add_member; use crate::handlers::assign_group::assign_group; use crate::handlers::ban_user::ban_user; use crate::handlers::create_dir_node::create_dir_node; use crate::handlers::create_group::create_group; use crate::handlers::create_invite::create_invite; use crate::handlers::create_join_rule::create_join_rule; use crate::handlers::create_space::create_space; use crate::handlers::delete_group::delete_group; use crate::handlers::delete_join_rule::delete_join_rule; use crate::handlers::delete_space::delete_space; use crate::handlers::delete_space_image::delete_space_image; use crate::handlers::explore_spaces::explore_spaces; use crate::handlers::explore_spaces::{ approve_join_request, list_join_requests, reject_join_request, }; use crate::handlers::get_ban::get_ban; use crate::handlers::get_group::get_group; use crate::handlers::get_member::get_member; use crate::handlers::get_space::get_space; use crate::handlers::get_space_dir_tree::get_space_dir_tree; use crate::handlers::get_space_image::get_space_image; use crate::handlers::get_space_image_file::get_space_image_file; use crate::handlers::join_group_self::join_group_self; use crate::handlers::join_requests::{create_join_request, withdraw_join_request}; use crate::handlers::leave_group_self::leave_group_self; use crate::handlers::list_bans::list_bans; use crate::handlers::list_dir_group_overwrites::list_dir_group_overwrites; use crate::handlers::list_dir_user_overwrites::list_dir_user_overwrites; use crate::handlers::list_groups::list_groups; use crate::handlers::list_invites::list_invites; use crate::handlers::list_join_rules::list_join_rules; use crate::handlers::list_members::list_space_members; use crate::handlers::list_spaces::list_spaces; use crate::handlers::move_dir_node::move_dir_node; use crate::handlers::reject_invite::reject_invite; use crate::handlers::remove_dir_group_overwrite::remove_dir_group_overwrite; use crate::handlers::remove_dir_user_overwrite::remove_dir_user_overwrite; use crate::handlers::remove_member::remove_member; use crate::handlers::repair_dir_parents::repair_dir_parents; use crate::handlers::revoke_invite::revoke_invite; use crate::handlers::set_dir_group_overwrite::set_dir_group_overwrite; use crate::handlers::set_dir_user_overwrite::set_dir_user_overwrite; use crate::handlers::unassign_group::unassign_group; use crate::handlers::unban_user::unban_user; use crate::handlers::update_ban::update_ban; use crate::handlers::update_dir_node::update_dir_node; use crate::handlers::update_group::update_group; use crate::handlers::update_join_rule::update_join_rule; use crate::handlers::update_member::update_member; use crate::handlers::update_space::update_space; use crate::handlers::upload_space_image::upload_space_image; use crate::services::service::SpaceService; use crate::share::guard::space_guard; pub fn router(service: SpaceService) -> Router { let public: Router = Router::new() .route("/spaces/explore", get(explore_spaces)) .route("/spaces/{space_name}", get(get_space)) .route("/spaces/{space_name}/groups/{group_id}", get(get_group)) .route("/spaces/{space_name}/images/{kind}", get(get_space_image)) .route( "/spaces/{space_name}/images/{kind}/file", get(get_space_image_file), ); let protected = Router::new() .route("/spaces", post(create_space).get(list_spaces)) .route("/spaces/invites/accept", post(accept_invite)) .route("/spaces/invites/reject", post(reject_invite)) .route( "/spaces/{space_name}", patch(update_space).delete(delete_space), ) .route( "/spaces/{space_name}/images/{kind}", put(upload_space_image).delete(delete_space_image).layer( axum::extract::DefaultBodyLimit::max( crate::services::images::MAX_SPACE_IMAGE_BYTES + 1024 * 1024, ), ), ) .route( "/spaces/{space_name}/dir", post(create_dir_node).get(get_space_dir_tree), ) .route( "/spaces/{space_name}/dir/repair-parents", post(repair_dir_parents), ) .route("/spaces/{space_name}/dir/{dir_id}", patch(update_dir_node)) .route( "/spaces/{space_name}/dir/{dir_id}/position", patch(move_dir_node), ) .route( "/spaces/{space_name}/dir/{dir_id}/overwrites/groups", get(list_dir_group_overwrites), ) .route( "/spaces/{space_name}/dir/{dir_id}/overwrites/groups/{group_id}", put(set_dir_group_overwrite).delete(remove_dir_group_overwrite), ) .route( "/spaces/{space_name}/dir/{dir_id}/overwrites/users", get(list_dir_user_overwrites), ) .route( "/spaces/{space_name}/dir/{dir_id}/overwrites/users/{user_id}", put(set_dir_user_overwrite).delete(remove_dir_user_overwrite), ) .route( "/spaces/{space_name}/members", post(add_member).get(list_space_members), ) .route( "/spaces/{space_name}/members/{user_id}", get(get_member).patch(update_member).delete(remove_member), ) .route( "/spaces/{space_name}/members/@me", axum::routing::patch(crate::handlers::self_member::update_self_member) .delete(crate::handlers::self_member::leave_space), ) .route( "/spaces/{space_name}/groups", post(create_group).get(list_groups), ) .route( "/spaces/{space_name}/groups/{group_id}", patch(update_group).delete(delete_group), ) .route( "/spaces/{space_name}/members/{user_id}/groups", post(assign_group), ) .route( "/spaces/{space_name}/groups/{group_id}/join", post(join_group_self).delete(leave_group_self), ) .route( "/spaces/{space_name}/join-rules", post(create_join_rule).get(list_join_rules), ) .route( "/spaces/{space_name}/join-rules/{rule_id}", patch(update_join_rule).delete(delete_join_rule), ) .route( "/spaces/{space_name}/members/{user_id}/groups/{group_id}", delete(unassign_group), ) .route( "/spaces/{space_name}/join-requests", post(create_join_request).get(list_join_requests), ) .route( "/spaces/{space_name}/join-requests/{request_id}", delete(withdraw_join_request), ) .route( "/spaces/{space_name}/join-requests/{request_id}/approve", post(approve_join_request), ) .route( "/spaces/{space_name}/join-requests/{request_id}/reject", post(reject_join_request), ) .route( "/spaces/{space_name}/invites", post(create_invite).get(list_invites), ) .route( "/spaces/{space_name}/invites/{invite_id}", delete(revoke_invite), ) .route("/spaces/{space_name}/bans", post(ban_user).get(list_bans)) .route( "/spaces/{space_name}/bans/{user_id}", get(get_ban).patch(update_ban).delete(unban_user), ) .route_layer(axum::middleware::from_fn_with_state( service.clone(), space_guard, )); public.merge(protected) }