Erick Pacheco Pedraza 2cdc065b21
feat: support to Rocket-Okapi (#1071)
* feat: support to okapi

* fix: fmt checks

* chore: rocket-okapi-example: add required schemas

* chore: rocket-okapi-example: add dto

* chore: rocket-okapi-example: add custom error

* chore: rocket-okapi-example: add api controllers

* chore: rocket-okapi-example: add notes in Readme

* chore: make rocket_okapi optional

* refactor: delete rocket example from rocket_example

* chore: rocket-okapi-example: add base files for okapi example

* chore: rocket-okapi-example: add controllers and dto

* chore: rocket-okapi-example: add docs
2022-10-16 17:45:56 +08:00

140 lines
4.3 KiB
Rust

#[macro_use]
extern crate rocket;
use rocket::fairing::{self, AdHoc};
use rocket::{Build, Rocket};
use migration::MigratorTrait;
use sea_orm_rocket::Database;
use rocket_okapi::mount_endpoints_and_merged_docs;
use rocket_okapi::okapi::openapi3::OpenApi;
use rocket_okapi::rapidoc::{make_rapidoc, GeneralConfig, HideShowConfig, RapiDocConfig};
use rocket_okapi::settings::UrlObject;
use rocket_okapi::swagger_ui::{make_swagger_ui, SwaggerUIConfig};
use rocket::http::Method;
use rocket_cors::{AllowedHeaders, AllowedOrigins, Cors};
mod pool;
use pool::Db;
mod error;
mod okapi_example;
pub use entity::post;
pub use entity::post::Entity as Post;
async fn run_migrations(rocket: Rocket<Build>) -> fairing::Result {
let conn = &Db::fetch(&rocket).unwrap().conn;
let _ = migration::Migrator::up(conn, None).await;
Ok(rocket)
}
#[tokio::main]
async fn start() -> Result<(), rocket::Error> {
let mut building_rocket = rocket::build()
.attach(Db::init())
.attach(AdHoc::try_on_ignite("Migrations", run_migrations))
.mount(
"/swagger-ui/",
make_swagger_ui(&SwaggerUIConfig {
url: "../v1/openapi.json".to_owned(),
..Default::default()
}),
)
.mount(
"/rapidoc/",
make_rapidoc(&RapiDocConfig {
title: Some("Rocket/SeaOrm - RapiDoc documentation | RapiDoc".to_owned()),
general: GeneralConfig {
spec_urls: vec![UrlObject::new("General", "../v1/openapi.json")],
..Default::default()
},
hide_show: HideShowConfig {
allow_spec_url_load: false,
allow_spec_file_load: false,
..Default::default()
},
..Default::default()
}),
)
.attach(cors());
let openapi_settings = rocket_okapi::settings::OpenApiSettings::default();
let custom_route_spec = (vec![], custom_openapi_spec());
mount_endpoints_and_merged_docs! {
building_rocket, "/v1".to_owned(), openapi_settings,
"/additional" => custom_route_spec,
"/okapi-example" => okapi_example::get_routes_and_docs(&openapi_settings),
};
building_rocket.launch().await.map(|_| ())
}
fn cors() -> Cors {
let allowed_origins =
AllowedOrigins::some_exact(&["http://localhost:8000", "http://127.0.0.1:8000"]);
let cors = rocket_cors::CorsOptions {
allowed_origins,
allowed_methods: vec![Method::Get, Method::Post, Method::Delete]
.into_iter()
.map(From::from)
.collect(),
allowed_headers: AllowedHeaders::all(),
allow_credentials: true,
..Default::default()
}
.to_cors()
.unwrap();
cors
}
fn custom_openapi_spec() -> OpenApi {
use rocket_okapi::okapi::openapi3::*;
OpenApi {
openapi: OpenApi::default_version(),
info: Info {
title: "SeaOrm-Rocket-Okapi Example".to_owned(),
description: Some("API Docs for Rocket/SeaOrm example".to_owned()),
terms_of_service: Some("https://github.com/SeaQL/sea-orm#license".to_owned()),
contact: Some(Contact {
name: Some("SeaOrm".to_owned()),
url: Some("https://github.com/SeaQL/sea-orm".to_owned()),
email: None,
..Default::default()
}),
license: Some(License {
name: "MIT".to_owned(),
url: Some("https://github.com/SeaQL/sea-orm/blob/master/LICENSE-MIT".to_owned()),
..Default::default()
}),
version: env!("CARGO_PKG_VERSION").to_owned(),
..Default::default()
},
servers: vec![
Server {
url: "http://127.0.0.1:8000/v1".to_owned(),
description: Some("Localhost".to_owned()),
..Default::default()
},
Server {
url: "https://production-server.com/".to_owned(),
description: Some("Remote development server".to_owned()),
..Default::default()
},
],
..Default::default()
}
}
pub fn main() {
let result = start();
println!("Rocket: deorbit.");
if let Some(err) = result.err() {
println!("Error: {}", err);
}
}