#[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) -> 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); } }