139 lines
4.3 KiB
Rust
139 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"]);
|
|
|
|
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()
|
|
}
|
|
|
|
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}");
|
|
}
|
|
}
|