Skip to content

Commit 4a0c8ed

Browse files
feat(axum): add forms and user routes (#191)
1 parent 53d3186 commit 4a0c8ed

17 files changed

Lines changed: 301 additions & 178 deletions

File tree

Cargo.lock

Lines changed: 34 additions & 125 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,24 @@
11
[workspace]
2-
members = ["examples/*", "packages/*/*"]
2+
members = [
3+
"examples/axum",
4+
"examples/dioxus-axum",
5+
"examples/leptos-actix",
6+
"examples/leptos-axum",
7+
"examples/sea-orm",
8+
"examples/workos",
9+
"packages/core/*",
10+
"packages/integrations/shield-actix",
11+
"packages/integrations/shield-axum",
12+
"packages/integrations/shield-dioxus",
13+
"packages/integrations/shield-dioxus-axum",
14+
"packages/integrations/shield-leptos",
15+
"packages/integrations/shield-leptos-actix",
16+
"packages/integrations/shield-leptos-axum",
17+
"packages/integrations/shield-tower",
18+
"packages/methods/*",
19+
"packages/storage/*",
20+
"packages/styles/shield-bootstrap",
21+
]
322
resolver = "2"
423

524
[workspace.package]
@@ -63,6 +82,7 @@ tower-sessions = "0.14.0"
6382
tracing = "0.1.41"
6483
tracing-subscriber = "0.3.19"
6584
utoipa = { version = "5.3.1", features = ["chrono", "uuid"] }
85+
utoipa-axum = "0.2.0"
6686
uuid = "1.11.0"
6787
wasm-bindgen = "0.2.100"
6888
wasm-tracing = "2.0.0"

examples/axum/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
2020
tower-sessions.workspace = true
2121
tracing.workspace = true
2222
tracing-subscriber.workspace = true
23-
utoipa.workspace = true
24-
utoipa-swagger-ui = { version = "9.0.0", features = ["axum", "vendored"] }
23+
utoipa-axum.workspace = true
24+
utoipa-scalar = { version = "0.3.0", features = ["axum"] }

examples/axum/src/main.rs

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
2+
use std::sync::Arc;
3+
4+
use axum::{Json, middleware::from_fn, routing::get};
5+
use shield::{Shield, ShieldOptions};
6+
use shield_axum::{AuthRoutes, ShieldLayer, auth_required};
7+
use shield_memory::{MemoryStorage, User};
8+
use shield_oidc::{Keycloak, OidcMethod};
9+
use time::Duration;
10+
use tokio::net::TcpListener;
11+
use tower_sessions::{Expiry, MemoryStore, SessionManagerLayer};
12+
use tracing::{info, level_filters::LevelFilter};
13+
use utoipa_axum::router::OpenApiRouter;
14+
use utoipa_scalar::{Scalar, Servable};
215

316
#[tokio::main]
417
async fn main() {
5-
use std::sync::Arc;
6-
7-
use axum::{Router, middleware::from_fn, routing::get};
8-
9-
use shield::{Shield, ShieldOptions};
10-
use shield_axum::{AuthRoutes, ShieldLayer, auth_required};
11-
use shield_memory::{MemoryStorage, User};
12-
use shield_oidc::{Keycloak, OidcMethod};
13-
use time::Duration;
14-
use tokio::net::TcpListener;
15-
use tower_sessions::{Expiry, MemoryStore, SessionManagerLayer};
16-
use tracing::{info, level_filters::LevelFilter};
17-
use utoipa::OpenApi;
18-
use utoipa_swagger_ui::SwaggerUi;
19-
2018
// Initialize tracing
2119
tracing_subscriber::fmt()
2220
.with_max_level(LevelFilter::DEBUG)
@@ -52,21 +50,23 @@ async fn main() {
5250
);
5351
let shield_layer = ShieldLayer::new(shield.clone());
5452

55-
// Initialize OpenAPI specification (optional)
56-
#[derive(OpenApi)]
57-
#[openapi(nest(
58-
(path = "/api/auth", api = AuthRoutes, tags = ["auth"]),
59-
))]
60-
struct Docs;
53+
// Initialize API router
54+
let api_router = OpenApiRouter::new()
55+
.route("/protected", get(async || "Protected"))
56+
.route_layer(from_fn(auth_required::<User>))
57+
.nest("/auth", AuthRoutes::openapi_router::<User, ()>());
6158

6259
// Initialize router
63-
let router = Router::new()
64-
.route("/api/protected", get(async || "Protected"))
65-
.route_layer(from_fn(auth_required::<User>))
66-
.nest("/api/auth", AuthRoutes::router::<User, ()>())
67-
.merge(SwaggerUi::new("/api-docs").url("/api/openapi.json", Docs::openapi()))
60+
let (router, openapi) = OpenApiRouter::new()
61+
.nest("/api", api_router)
6862
.layer(shield_layer)
69-
.layer(session_layer);
63+
.layer(session_layer)
64+
.split_for_parts();
65+
66+
// Add Scalar and OpenAPI specification
67+
let router = router
68+
.merge(Scalar::with_url("/api/reference", openapi.clone()))
69+
.route("/api/openapi.json", get(|| async { Json(openapi) }));
7070

7171
// Start app
7272
info!("listening on http://{}", &addr);

0 commit comments

Comments
 (0)