diff --git a/examples/rocket_example/src/main.rs b/examples/rocket_example/src/main.rs index 774f58a6..c688ca99 100644 --- a/examples/rocket_example/src/main.rs +++ b/examples/rocket_example/src/main.rs @@ -1,9 +1,123 @@ #[macro_use] extern crate rocket; -mod sqlx; +use rocket::fairing::{self, AdHoc}; +use rocket::form::{Context, Form}; +use rocket::fs::{relative, FileServer}; +use rocket::response::{Flash, Redirect}; +use rocket::serde::json::Json; +use rocket::{Build, Request, Rocket}; +use rocket_db_pools::{sqlx, Connection, Database}; +use rocket_dyn_templates::{context, Template}; + +use sea_orm::entity::*; +use sea_orm::RocketDbPool; + +mod setup; + +#[derive(Database, Debug)] +#[database("rocket_example")] +struct Db(RocketDbPool); + +type Result> = std::result::Result; + +mod post; +pub use post::Entity as Post; + +#[get("/new")] +fn new() -> Template { + Template::render("new", &Context::default()) +} + +#[post("/", data = "")] +async fn create(conn: Connection, post_form: Form) -> Flash { + let post = post_form.into_inner(); + + let _post = post::ActiveModel { + title: Set(post.title.to_owned()), + text: Set(post.text.to_owned()), + ..Default::default() + } + .save(&conn) + .await + .expect("could not insert post"); + + Flash::success(Redirect::to("/"), "Post successfully added.") +} + +#[get("/")] +async fn list(conn: Connection) -> Template { + let posts = Post::find() + .all(&conn) + .await + .expect("could not retrieve posts") + .into_iter() + .collect::>(); + + Template::render( + "index", + context! { + posts: posts, + }, + ) +} + +#[get("/")] +async fn read(conn: Connection, id: i64) -> Option> { + let post: Option = Post::find_by_id(id) + .one(&conn) + .await + .expect("could not find post"); + + match post { + None => None, + Some(post) => Some(Json(post)), + } +} + +#[delete("/")] +async fn delete(conn: Connection, id: i32) -> Flash { + let post: post::ActiveModel = Post::find_by_id(id) + .one(&conn) + .await + .unwrap() + .unwrap() + .into(); + let _result = post.delete(&conn).await.unwrap(); + + Flash::success(Redirect::to("/"), "Post successfully deleted.") +} + +#[delete("/")] +async fn destroy(conn: Connection) -> Result<()> { + let _result = Post::delete_many().exec(&conn).await.unwrap(); + Ok(()) +} + +#[catch(404)] +pub fn not_found(req: &Request<'_>) -> Template { + Template::render( + "error/404", + context! { + uri: req.uri() + }, + ) +} + +async fn run_migrations(rocket: Rocket) -> fairing::Result { + let db_url = Db::fetch(&rocket).unwrap().db_url.clone(); + let conn = sea_orm::Database::connect(&db_url).await.unwrap(); + let _create_post_table = setup::create_post_table(&conn).await; + Ok(rocket) +} #[launch] fn rocket() -> _ { - rocket::build().attach(sqlx::stage()) + rocket::build() + .attach(Db::init()) + .attach(AdHoc::try_on_ignite("Migrations", run_migrations)) + .mount("/", FileServer::from(relative!("/static"))) + .mount("/", routes![new, create, delete, destroy, list, read,]) + .register("/", catchers![not_found]) + .attach(Template::fairing()) } diff --git a/examples/rocket_example/src/sqlx/post.rs b/examples/rocket_example/src/post.rs similarity index 100% rename from examples/rocket_example/src/sqlx/post.rs rename to examples/rocket_example/src/post.rs diff --git a/examples/rocket_example/src/sqlx/setup.rs b/examples/rocket_example/src/setup.rs similarity index 95% rename from examples/rocket_example/src/sqlx/setup.rs rename to examples/rocket_example/src/setup.rs index 2421d84f..92c3ca8c 100644 --- a/examples/rocket_example/src/sqlx/setup.rs +++ b/examples/rocket_example/src/setup.rs @@ -1,9 +1,5 @@ -use sea_orm::{error::*, sea_query, DbConn, ExecResult}; - use sea_orm::sea_query::{ColumnDef, TableCreateStatement}; - -// mod post; -pub use super::post::*; +use sea_orm::{error::*, sea_query, DbConn, ExecResult}; async fn create_table(db: &DbConn, stmt: &TableCreateStatement) -> Result { let builder = db.get_database_backend(); diff --git a/examples/rocket_example/src/sqlx/mod.rs b/examples/rocket_example/src/sqlx/mod.rs deleted file mode 100644 index 4121aba7..00000000 --- a/examples/rocket_example/src/sqlx/mod.rs +++ /dev/null @@ -1,122 +0,0 @@ -use rocket::fairing::{self, AdHoc}; -use rocket::form::{Context, Form}; -use rocket::fs::{relative, FileServer}; -use rocket::response::{Flash, Redirect}; -use rocket::serde::json::Json; -use rocket::Config; -use rocket::{Build, Request, Rocket}; -use rocket_db_pools::{sqlx, Connection, Database}; -use rocket_dyn_templates::{context, Template}; - -use sea_orm::entity::*; -use sea_orm::RocketDbPool; - -mod setup; - -#[derive(Database, Debug)] -#[database("rocket_example")] -struct Db(RocketDbPool); - -type Result> = std::result::Result; - -mod post; -pub use post::Entity as Post; - -#[get("/new")] -fn new() -> Template { - Template::render("new", &Context::default()) -} - -#[post("/", data = "")] -async fn create(conn: Connection, post_form: Form) -> Flash { - let post = post_form.into_inner(); - - let _post = post::ActiveModel { - title: Set(post.title.to_owned()), - text: Set(post.text.to_owned()), - ..Default::default() - } - .save(&conn) - .await - .expect("could not insert post"); - - Flash::success(Redirect::to("/"), "Post successfully added.") -} - -#[get("/")] -async fn list(conn: Connection) -> Template { - let posts = Post::find() - .all(&conn) - .await - .expect("could not retrieve posts") - .into_iter() - .collect::>(); - - Template::render( - "index", - context! { - posts: posts, - }, - ) -} - -#[get("/")] -async fn read(conn: Connection, id: i64) -> Option> { - let post: Option = Post::find_by_id(id) - .one(&conn) - .await - .expect("could not find post"); - - match post { - None => None, - Some(post) => Some(Json(post)), - } -} - -#[delete("/")] -async fn delete(conn: Connection, id: i32) -> Flash { - let post: post::ActiveModel = Post::find_by_id(id) - .one(&conn) - .await - .unwrap() - .unwrap() - .into(); - let _result = post.delete(&conn).await.unwrap(); - - Flash::success(Redirect::to("/"), "Post successfully deleted.") -} - -#[delete("/")] -async fn destroy(conn: Connection) -> Result<()> { - let _result = Post::delete_many().exec(&conn).await.unwrap(); - Ok(()) -} - -#[catch(404)] -pub fn not_found(req: &Request<'_>) -> Template { - Template::render( - "error/404", - context! { - uri: req.uri() - }, - ) -} - -async fn run_migrations(rocket: Rocket) -> fairing::Result { - let db_url = Db::fetch(&rocket).unwrap().db_url.clone(); - let conn = sea_orm::Database::connect(&db_url).await.unwrap(); - let _create_post_table = setup::create_post_table(&conn).await; - Ok(rocket) -} - -pub fn stage() -> AdHoc { - AdHoc::on_ignite("SQLx Stage", |rocket| async { - rocket - .attach(Db::init()) - .attach(AdHoc::try_on_ignite("SQLx Migrations", run_migrations)) - .mount("/", FileServer::from(relative!("/static"))) - .mount("/", routes![new, create, delete, destroy, list, read,]) - .register("/", catchers![not_found]) - .attach(Template::fairing()) - }) -} diff --git a/src/driver/rocket_db.rs b/src/driver/rocket_db.rs index 9ce494da..5489e051 100644 --- a/src/driver/rocket_db.rs +++ b/src/driver/rocket_db.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use rocket_db_pools::{rocket::figment::Figment, Config, Error}; +use rocket_db_pools::{rocket::figment::Figment, Config}; #[derive(Debug)] pub struct RocketDbPool {