mod account;
mod admin;
pub(crate) mod auth;
mod collaboration;
mod collections;
mod docs;
mod download;
mod error;
mod instance;
mod negotiate;
mod objects;
mod reviews;
mod search;
mod sequence;
mod session;
mod util;
use axum::routing::{delete, get, post, put};
use axum::{Json, Router};
use serde_json::{json, Value};
use crate::AppState;
pub fn router(state: AppState) -> Router<AppState> {
Router::new()
.route("/", get(version))
.route("/instance", get(instance::get))
.route(
"/session",
get(session::get)
.post(session::create)
.delete(session::delete),
)
.route("/account", get(account::get).patch(account::patch))
.route("/account/password", post(account::change_password))
.route("/account/shared", get(account::shared))
.nest("/admin", admin::router())
.route("/reviews", get(reviews::list))
.route("/openapi.json", get(docs::openapi_json))
.route("/docs", get(docs::docs_html))
.route("/collections", post(collections::create_collection))
.route(
"/collections/validate",
post(collections::validate_collection),
)
.route("/collections/:iri/members", post(collections::add_member))
.route("/collections/:iri", delete(collections::delete_collection))
.route(
"/collections/:iri/members/:member",
delete(collections::remove_member),
)
.route("/objects", get(objects::list_objects))
.route(
"/objects/:iri",
get(objects::get_object)
.patch(objects::patch_object)
.delete(objects::delete_object),
)
.route("/objects/:iri/details", get(objects::get_object_details))
.route("/objects/:iri/activity", get(reviews::activity))
.route(
"/objects/:iri/reviews",
get(reviews::get).post(reviews::request),
)
.route("/objects/:iri/reviews/decision", post(reviews::decide))
.route(
"/objects/:iri/shares",
get(collaboration::list).post(collaboration::grant),
)
.route("/objects/:iri/shares/:user", delete(collaboration::revoke))
.route("/objects/:iri/owner", put(collaboration::transfer))
.route("/objects/:iri/publish", post(objects::publish_object))
.route("/objects/:iri/similar", get(sequence::similar))
.route(
"/search",
get(search::search).post(search::structured_search),
)
.route("/search/facets", get(search::facets))
.route("/search/strategies", get(search::strategies))
.route("/sequences/search", get(sequence::search_sequences))
.route_layer(axum::middleware::from_fn_with_state(
state,
auth::attach_identity,
))
}
async fn version() -> Json<Value> {
Json(json!({
"name": "sbol-db",
"api": "v2",
"version": env!("CARGO_PKG_VERSION"),
}))
}