* Add DeriveRelatedEntity macro * Add generation for related enum and seaography * Add seaography cli param * update codegen tests * Fix DeriveRelatedEntity macro doc and includes * Fix all RelatedEntity variants for RelationBuilder * Add tests for code * Cargo format * Fix clippy code * Fix format * Fix unit tests * Fix unit tests * Provide default for seaography::RelationBuilder * Update changelog * Update tests * Modify code to match feedback * Bring old Related Impl trait generation * Modify DeriveRelatedEntity to gen impl seaography::RelationBuilder * Generate RelatedEntity enum when seaography flag is enabled * Update documentation * Update Changelog * Fix format errors * Fix code generation * relations with suffix are definition based * Rev => Reverse easier to read * snake_case to cameCase for name generation * Fix unit tests * Update lib.rs * derive `seaography::RelationBuilder` only when `seaography` feature is enabled * Try constructing async-graphql root for "related entity" and "entity" without relation * Update demo * CHANGELOG * Update Cargo.toml Co-authored-by: Chris Tsang <chris.2y3@outlook.com> * Revert "Update Cargo.toml" This reverts commit 6b1669836a4fb5040bfb08999f0cf640c74dc64d. --------- Co-authored-by: Billy Chan <ccw.billy.123@gmail.com> Co-authored-by: Chris Tsang <chris.2y3@outlook.com>
65 lines
2.0 KiB
Rust
65 lines
2.0 KiB
Rust
use async_graphql::{
|
|
dataloader::DataLoader,
|
|
http::{playground_source, GraphQLPlaygroundConfig},
|
|
};
|
|
use async_graphql_poem::GraphQL;
|
|
use dotenv::dotenv;
|
|
use lazy_static::lazy_static;
|
|
use poem::{get, handler, listener::TcpListener, web::Html, IntoResponse, Route, Server};
|
|
use sea_orm::{prelude::*, Database};
|
|
use std::env;
|
|
|
|
pub mod query_root;
|
|
|
|
pub struct OrmDataloader {
|
|
pub db: DatabaseConnection,
|
|
}
|
|
|
|
lazy_static! {
|
|
static ref URL: String = env::var("URL").unwrap_or("0.0.0.0:8000".into());
|
|
static ref ENDPOINT: String = env::var("ENDPOINT").unwrap_or("/".into());
|
|
static ref DATABASE_URL: String =
|
|
env::var("DATABASE_URL").expect("DATABASE_URL environment variable not set");
|
|
static ref DEPTH_LIMIT: Option<usize> = env::var("DEPTH_LIMIT").map_or(None, |data| Some(
|
|
data.parse().expect("DEPTH_LIMIT is not a number")
|
|
));
|
|
static ref COMPLEXITY_LIMIT: Option<usize> = env::var("COMPLEXITY_LIMIT")
|
|
.map_or(None, |data| {
|
|
Some(data.parse().expect("COMPLEXITY_LIMIT is not a number"))
|
|
});
|
|
}
|
|
|
|
#[handler]
|
|
async fn graphql_playground() -> impl IntoResponse {
|
|
Html(playground_source(GraphQLPlaygroundConfig::new(&ENDPOINT)))
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
dotenv().ok();
|
|
tracing_subscriber::fmt()
|
|
.with_max_level(tracing::Level::INFO)
|
|
.with_test_writer()
|
|
.init();
|
|
let database = Database::connect(&*DATABASE_URL)
|
|
.await
|
|
.expect("Fail to initialize database connection");
|
|
let orm_dataloader: DataLoader<OrmDataloader> = DataLoader::new(
|
|
OrmDataloader {
|
|
db: database.clone(),
|
|
},
|
|
tokio::spawn,
|
|
);
|
|
let schema =
|
|
query_root::schema(database, orm_dataloader, *DEPTH_LIMIT, *COMPLEXITY_LIMIT).unwrap();
|
|
let app = Route::new().at(
|
|
&*ENDPOINT,
|
|
get(graphql_playground).post(GraphQL::new(schema)),
|
|
);
|
|
println!("Visit GraphQL Playground at http://{}", *URL);
|
|
Server::new(TcpListener::bind(&*URL))
|
|
.run(app)
|
|
.await
|
|
.expect("Fail to start web server");
|
|
}
|