#Issue: Integration of Routes and OpenAPI Documentation in Rocket with Rocket Okapi*

2 messages · Page 1 of 1 (latest)

dusty drift
#

routes/mod.rs

pub mod users;
pub mod posts;

use rocket::{Route};
use rocket_okapi::{openapi_get_routes};
use rocket_okapi::swagger_ui::{make_swagger_ui, SwaggerUIConfig};
use rocket_okapi::rapidoc::{make_rapidoc, RapiDocConfig, GeneralConfig, HideShowConfig};
use rocket_okapi::settings::UrlObject;

pub fn get_routes() -> Vec<rocket::Route> {
    let mut routes = Vec::new();
    routes.extend(users::user_routes());
    routes.extend(posts::post_routes());
    routes
}

pub fn openapi_routes() -> Vec<rocket::Route> {
    openapi_get_routes![
        users::user_routes(),
        posts::post_routes()
    ]
}

pub fn swagger_ui() -> Vec<rocket::Route> {
    make_swagger_ui(&SwaggerUIConfig {
        url: "../openapi.json".to_owned(),
        ..Default::default()
    }).into()
}

pub fn rapidoc() -> Vec<rocket::Route> {
    make_rapidoc(&RapiDocConfig {
        general: GeneralConfig {
            spec_urls: vec![UrlObject::new("General", "../openapi.json")],
            ..Default::default()
        },
        hide_show: HideShowConfig {
            allow_spec_url_load: false,
            allow_spec_file_load: false,
            ..Default::default()
        },
        ..Default::default()
    }).into()
}
#

routes/users.rs

use rocket::{get, post, routes, serde::json::Json};
use rocket_okapi::okapi::schemars::JsonSchema;
use rocket_okapi::openapi;
use serde::{Deserialize, Serialize};
use crate::models::user::User;
use rocket_okapi::openapi_get_routes;
#[openapi(tag = "Users")]
#[get("/user")]
pub fn get_all_users() -> Json<Vec<User>> {
    Json(vec![User {
        user_id: 42,
        username: "bob".to_owned(),
        email: None,
    }])
}

#[openapi(tag = "Users")]
#[get("/user/<id>")]
pub fn get_user(id: u64) -> Option<Json<User>> {
    Some(Json(User {
        user_id: id,
        username: "bob".to_owned(),
        email: None,
    }))
}

#[openapi(tag = "Users")]
#[get("/user_example?<user_id>&<name>&<email>")]
pub fn get_user_by_name(user_id: u64, name: String, email: Option<String>) -> Option<Json<User>> {
    Some(Json(User {
        user_id,
        username: name,
        email,
    }))
}

#[openapi(tag = "Users")]
#[post("/user", data = "<user>")]
pub fn create_user(user: Json<User>) -> Json<User> {
    user
}

#[openapi(skip)]
#[get("/hidden")]
pub fn hidden() -> Json<&'static str> {
    Json("Hidden from swagger!")
}

//function to export all routes
pub fn user_routes() -> Vec<rocket::Route> {
    routes![
        get_all_users,
        get_user,
        get_user_by_name,
        create_user,
        hidden
    ]
}

Issues Faced:

  • The macro openapi_get_routes! does not work as expected and produces compilation errors.
  • Routes are not properly combined or exposed for OpenAPI documentation.
  • The generated OpenAPI specification does not seem to include all defined routes.
    Request for Assistance:
    • How should I correctly use openapi_get_routes! or similar macros/functions to combine and document routes with Rocket Okapi?