diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 02e4f390..1d462326 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -234,7 +234,6 @@ jobs: matrix: path: [ examples/actix_example, - examples/actix3_example, examples/axum_example, examples/basic, examples/graphql_example, diff --git a/README.md b/README.md index ac46a7ba..c3bcfbae 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,6 @@ Please help us with maintaining SeaORM by completing the [SeaQL Community Survey Integration examples: + [Actix v4 Example](https://github.com/SeaQL/sea-orm/tree/master/examples/actix_example) -+ [Actix v3 Example](https://github.com/SeaQL/sea-orm/tree/master/examples/actix3_example) + [Axum Example](https://github.com/SeaQL/sea-orm/tree/master/examples/axum_example) + [GraphQL Example](https://github.com/SeaQL/sea-orm/tree/master/examples/graphql_example) + [jsonrpsee Example](https://github.com/SeaQL/sea-orm/tree/master/examples/jsonrpsee_example) diff --git a/examples/actix3_example/.env b/examples/actix3_example/.env deleted file mode 100644 index 1a12a183..00000000 --- a/examples/actix3_example/.env +++ /dev/null @@ -1,3 +0,0 @@ -HOST=127.0.0.1 -PORT=8000 -DATABASE_URL="mysql://root:root@localhost/actix_example" \ No newline at end of file diff --git a/examples/actix3_example/Cargo.toml b/examples/actix3_example/Cargo.toml deleted file mode 100644 index c6ad416a..00000000 --- a/examples/actix3_example/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "sea-orm-actix-example" -version = "0.1.0" -authors = ["Sam Samai "] -edition = "2021" -publish = false - -[workspace] -members = [".", "api", "service", "entity", "migration"] - -[dependencies] -actix3-example-api = { path = "api" } diff --git a/examples/actix3_example/README.md b/examples/actix3_example/README.md deleted file mode 100644 index 0e65f576..00000000 --- a/examples/actix3_example/README.md +++ /dev/null @@ -1,27 +0,0 @@ -![screenshot](Screenshot.png) - -# Actix 3 with SeaORM example app - -> Actix Web 3 has been superseeded by [Actix Web 4](https://github.com/actix/actix-web). - -1. Modify the `DATABASE_URL` var in `.env` to point to your chosen database - -1. Turn on the appropriate database feature for your chosen db in `service/Cargo.toml` (the `"sqlx-mysql",` line) - -1. Execute `cargo run` to start the server - -1. Visit [localhost:8000](http://localhost:8000) in browser - -Run server with auto-reloading: - -```bash -cargo install systemfd -systemfd --no-pid -s http::8000 -- cargo watch -x run -``` - -Run mock test on the service logic crate: - -```bash -cd service -cargo test --features mock -``` diff --git a/examples/actix3_example/Screenshot.png b/examples/actix3_example/Screenshot.png deleted file mode 100644 index 8846f70f..00000000 Binary files a/examples/actix3_example/Screenshot.png and /dev/null differ diff --git a/examples/actix3_example/api/Cargo.toml b/examples/actix3_example/api/Cargo.toml deleted file mode 100644 index 7d17eab2..00000000 --- a/examples/actix3_example/api/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "actix3-example-api" -version = "0.1.0" -authors = ["Sam Samai "] -edition = "2021" -publish = false - -[dependencies] -actix3-example-service = { path = "../service" } -actix-http = "2" -actix-web = "3" -actix-flash = "0.2" -actix-files = "0.5" -futures = { version = "0.3" } -futures-util = { version = "0.3" } -tera = "1.8.0" -dotenvy = "0.15" -listenfd = "0.3.3" -serde = "1" -tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } -entity = { path = "../entity" } -migration = { path = "../migration" } diff --git a/examples/actix3_example/api/src/lib.rs b/examples/actix3_example/api/src/lib.rs deleted file mode 100644 index 8a2be800..00000000 --- a/examples/actix3_example/api/src/lib.rs +++ /dev/null @@ -1,219 +0,0 @@ -use actix3_example_service::{ - sea_orm::{Database, DatabaseConnection}, - Mutation, Query, -}; -use actix_files as fs; -use actix_web::{ - error, get, middleware, post, web, App, Error, HttpRequest, HttpResponse, HttpServer, Result, -}; - -use entity::post; -use listenfd::ListenFd; -use migration::{Migrator, MigratorTrait}; -use serde::{Deserialize, Serialize}; -use std::env; -use tera::Tera; - -const DEFAULT_POSTS_PER_PAGE: u64 = 5; - -#[derive(Debug, Clone)] -struct AppState { - templates: tera::Tera, - conn: DatabaseConnection, -} -#[derive(Debug, Deserialize)] -pub struct Params { - page: Option, - posts_per_page: Option, -} - -#[derive(Deserialize, Serialize, Debug, Clone)] -struct FlashData { - kind: String, - message: String, -} - -#[get("/")] -async fn list( - req: HttpRequest, - data: web::Data, - opt_flash: Option>, -) -> Result { - let template = &data.templates; - let conn = &data.conn; - - // get params - let params = web::Query::::from_query(req.query_string()).unwrap(); - - let page = params.page.unwrap_or(1); - let posts_per_page = params.posts_per_page.unwrap_or(DEFAULT_POSTS_PER_PAGE); - - let (posts, num_pages) = Query::find_posts_in_page(conn, page, posts_per_page) - .await - .expect("Cannot find posts in page"); - - let mut ctx = tera::Context::new(); - ctx.insert("posts", &posts); - ctx.insert("page", &page); - ctx.insert("posts_per_page", &posts_per_page); - ctx.insert("num_pages", &num_pages); - - if let Some(flash) = opt_flash { - let flash_inner = flash.into_inner(); - ctx.insert("flash", &flash_inner); - } - - let body = template - .render("index.html.tera", &ctx) - .map_err(|_| error::ErrorInternalServerError("Template error"))?; - Ok(HttpResponse::Ok().content_type("text/html").body(body)) -} - -#[get("/new")] -async fn new(data: web::Data) -> Result { - let template = &data.templates; - let ctx = tera::Context::new(); - let body = template - .render("new.html.tera", &ctx) - .map_err(|_| error::ErrorInternalServerError("Template error"))?; - Ok(HttpResponse::Ok().content_type("text/html").body(body)) -} - -#[post("/")] -async fn create( - data: web::Data, - post_form: web::Form, -) -> actix_flash::Response { - let conn = &data.conn; - - let form = post_form.into_inner(); - - Mutation::create_post(conn, form) - .await - .expect("could not insert post"); - - let flash = FlashData { - kind: "success".to_owned(), - message: "Post successfully added.".to_owned(), - }; - - actix_flash::Response::with_redirect(flash, "/") -} - -#[get("/{id}")] -async fn edit(data: web::Data, id: web::Path) -> Result { - let conn = &data.conn; - let template = &data.templates; - let id = id.into_inner(); - - let post: post::Model = Query::find_post_by_id(conn, id) - .await - .expect("could not find post") - .unwrap_or_else(|| panic!("could not find post with id {id}")); - - let mut ctx = tera::Context::new(); - ctx.insert("post", &post); - - let body = template - .render("edit.html.tera", &ctx) - .map_err(|_| error::ErrorInternalServerError("Template error"))?; - Ok(HttpResponse::Ok().content_type("text/html").body(body)) -} - -#[post("/{id}")] -async fn update( - data: web::Data, - id: web::Path, - post_form: web::Form, -) -> actix_flash::Response { - let conn = &data.conn; - let form = post_form.into_inner(); - let id = id.into_inner(); - - Mutation::update_post_by_id(conn, id, form) - .await - .expect("could not edit post"); - - let flash = FlashData { - kind: "success".to_owned(), - message: "Post successfully updated.".to_owned(), - }; - - actix_flash::Response::with_redirect(flash, "/") -} - -#[post("/delete/{id}")] -async fn delete( - data: web::Data, - id: web::Path, -) -> actix_flash::Response { - let conn = &data.conn; - let id = id.into_inner(); - - Mutation::delete_post(conn, id) - .await - .expect("could not delete post"); - - let flash = FlashData { - kind: "success".to_owned(), - message: "Post successfully deleted.".to_owned(), - }; - - actix_flash::Response::with_redirect(flash, "/") -} - -#[actix_web::main] -async fn start() -> std::io::Result<()> { - std::env::set_var("RUST_LOG", "debug"); - tracing_subscriber::fmt::init(); - - // get env vars - dotenvy::dotenv().ok(); - let db_url = env::var("DATABASE_URL").expect("DATABASE_URL is not set in .env file"); - let host = env::var("HOST").expect("HOST is not set in .env file"); - let port = env::var("PORT").expect("PORT is not set in .env file"); - let server_url = format!("{host}:{port}"); - - // create post table if not exists - let conn = Database::connect(&db_url).await.unwrap(); - Migrator::up(&conn, None).await.unwrap(); - let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap(); - let state = AppState { templates, conn }; - - let mut listenfd = ListenFd::from_env(); - let mut server = HttpServer::new(move || { - App::new() - .data(state.clone()) - .wrap(middleware::Logger::default()) // enable logger - .wrap(actix_flash::Flash::default()) - .configure(init) - .service(fs::Files::new("/static", "./api/static").show_files_listing()) - }); - - server = match listenfd.take_tcp_listener(0)? { - Some(listener) => server.listen(listener)?, - None => server.bind(&server_url)?, - }; - - println!("Starting server at {server_url}"); - server.run().await?; - - Ok(()) -} - -fn init(cfg: &mut web::ServiceConfig) { - cfg.service(list); - cfg.service(new); - cfg.service(create); - cfg.service(edit); - cfg.service(update); - cfg.service(delete); -} - -pub fn main() { - let result = start(); - - if let Some(err) = result.err() { - println!("Error: {err}") - } -} diff --git a/examples/actix3_example/api/static/css/normalize.css b/examples/actix3_example/api/static/css/normalize.css deleted file mode 100644 index 458eea1e..00000000 --- a/examples/actix3_example/api/static/css/normalize.css +++ /dev/null @@ -1,427 +0,0 @@ -/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ - -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS text size adjust after orientation change, without disabling - * user zoom. - */ - -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove default margin. - */ - -body { - margin: 0; -} - -/* HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ - -audio, -canvas, -progress, -video { - display: inline-block; /* 1 */ - vertical-align: baseline; /* 2 */ -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. - */ - -[hidden], -template { - display: none; -} - -/* Links - ========================================================================== */ - -/** - * Remove the gray background color from active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * Improve readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove border when inside `a` element in IE 8/9/10. - */ - -img { - border: 0; -} - -/** - * Correct overflow not hidden in IE 9/10/11. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* Grouping content - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari. - */ - -figure { - margin: 1em 40px; -} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} - -/** - * Contain overflow in all browsers. - */ - -pre { - overflow: auto; -} - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -/* Forms - ========================================================================== */ - -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ - -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ - -button, -input, -optgroup, -select, -textarea { - color: inherit; /* 1 */ - font: inherit; /* 2 */ - margin: 0; /* 3 */ -} - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ - -button { - overflow: visible; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -input { - line-height: normal; -} - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ - -textarea { - overflow: auto; -} - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ - -optgroup { - font-weight: bold; -} - -/* Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; -} diff --git a/examples/actix3_example/api/static/css/skeleton.css b/examples/actix3_example/api/static/css/skeleton.css deleted file mode 100644 index cdc432a4..00000000 --- a/examples/actix3_example/api/static/css/skeleton.css +++ /dev/null @@ -1,421 +0,0 @@ -/* -* Skeleton V2.0.4 -* Copyright 2014, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* https://opensource.org/licenses/mit-license.php -* 12/29/2014 -*/ - - -/* Table of contents -–––––––––––––––––––––––––––––––––––––––––––––––––– -- Grid -- Base Styles -- Typography -- Links -- Buttons -- Forms -- Lists -- Code -- Tables -- Spacing -- Utilities -- Clearing -- Media Queries -*/ - - -/* Grid -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -.container { - position: relative; - width: 100%; - max-width: 960px; - margin: 0 auto; - padding: 0 20px; - box-sizing: border-box; } -.column, -.columns { - width: 100%; - float: left; - box-sizing: border-box; } - -/* For devices larger than 400px */ -@media (min-width: 400px) { - .container { - width: 85%; - padding: 0; } -} - -/* For devices larger than 550px */ -@media (min-width: 550px) { - .container { - width: 80%; } - .column, - .columns { - margin-left: 4%; } - .column:first-child, - .columns:first-child { - margin-left: 0; } - - .one.column, - .one.columns { width: 4.66666666667%; } - .two.columns { width: 13.3333333333%; } - .three.columns { width: 22%; } - .four.columns { width: 30.6666666667%; } - .five.columns { width: 39.3333333333%; } - .six.columns { width: 48%; } - .seven.columns { width: 56.6666666667%; } - .eight.columns { width: 65.3333333333%; } - .nine.columns { width: 74.0%; } - .ten.columns { width: 82.6666666667%; } - .eleven.columns { width: 91.3333333333%; } - .twelve.columns { width: 100%; margin-left: 0; } - - .one-third.column { width: 30.6666666667%; } - .two-thirds.column { width: 65.3333333333%; } - - .one-half.column { width: 48%; } - - /* Offsets */ - .offset-by-one.column, - .offset-by-one.columns { margin-left: 8.66666666667%; } - .offset-by-two.column, - .offset-by-two.columns { margin-left: 17.3333333333%; } - .offset-by-three.column, - .offset-by-three.columns { margin-left: 26%; } - .offset-by-four.column, - .offset-by-four.columns { margin-left: 34.6666666667%; } - .offset-by-five.column, - .offset-by-five.columns { margin-left: 43.3333333333%; } - .offset-by-six.column, - .offset-by-six.columns { margin-left: 52%; } - .offset-by-seven.column, - .offset-by-seven.columns { margin-left: 60.6666666667%; } - .offset-by-eight.column, - .offset-by-eight.columns { margin-left: 69.3333333333%; } - .offset-by-nine.column, - .offset-by-nine.columns { margin-left: 78.0%; } - .offset-by-ten.column, - .offset-by-ten.columns { margin-left: 86.6666666667%; } - .offset-by-eleven.column, - .offset-by-eleven.columns { margin-left: 95.3333333333%; } - - .offset-by-one-third.column, - .offset-by-one-third.columns { margin-left: 34.6666666667%; } - .offset-by-two-thirds.column, - .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } - - .offset-by-one-half.column, - .offset-by-one-half.columns { margin-left: 52%; } - -} - - -/* Base Styles -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -/* NOTE -html is set to 62.5% so that all the REM measurements throughout Skeleton -are based on 10px sizing. So basically 1.5rem = 15px :) */ -html { - font-size: 62.5%; } -body { - font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ - line-height: 1.6; - font-weight: 400; - font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; - color: #222; } - - -/* Typography -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: 2rem; - font-weight: 300; } -h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} -h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } -h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } -h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } -h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } -h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } - -/* Larger than phablet */ -@media (min-width: 550px) { - h1 { font-size: 5.0rem; } - h2 { font-size: 4.2rem; } - h3 { font-size: 3.6rem; } - h4 { font-size: 3.0rem; } - h5 { font-size: 2.4rem; } - h6 { font-size: 1.5rem; } -} - -p { - margin-top: 0; } - - -/* Links -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -a { - color: #1EAEDB; } -a:hover { - color: #0FA0CE; } - - -/* Buttons -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -.button, -button, -input[type="submit"], -input[type="reset"], -input[type="button"] { - display: inline-block; - height: 38px; - padding: 0 30px; - color: #555; - text-align: center; - font-size: 11px; - font-weight: 600; - line-height: 38px; - letter-spacing: .1rem; - text-transform: uppercase; - text-decoration: none; - white-space: nowrap; - background-color: transparent; - border-radius: 4px; - border: 1px solid #bbb; - cursor: pointer; - box-sizing: border-box; } -.button:hover, -button:hover, -input[type="submit"]:hover, -input[type="reset"]:hover, -input[type="button"]:hover, -.button:focus, -button:focus, -input[type="submit"]:focus, -input[type="reset"]:focus, -input[type="button"]:focus { - color: #333; - border-color: #888; - outline: 0; } -.button.button-primary, -button.button-primary, -button.primary, -input[type="submit"].button-primary, -input[type="reset"].button-primary, -input[type="button"].button-primary { - color: #FFF; - background-color: #33C3F0; - border-color: #33C3F0; } -.button.button-primary:hover, -button.button-primary:hover, -button.primary:hover, -input[type="submit"].button-primary:hover, -input[type="reset"].button-primary:hover, -input[type="button"].button-primary:hover, -.button.button-primary:focus, -button.button-primary:focus, -button.primary:focus, -input[type="submit"].button-primary:focus, -input[type="reset"].button-primary:focus, -input[type="button"].button-primary:focus { - color: #FFF; - background-color: #1EAEDB; - border-color: #1EAEDB; } - - -/* Forms -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -input[type="email"], -input[type="number"], -input[type="search"], -input[type="text"], -input[type="tel"], -input[type="url"], -input[type="password"], -textarea, -select { - height: 38px; - padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ - background-color: #fff; - border: 1px solid #D1D1D1; - border-radius: 4px; - box-shadow: none; - box-sizing: border-box; } -/* Removes awkward default styles on some inputs for iOS */ -input[type="email"], -input[type="number"], -input[type="search"], -input[type="text"], -input[type="tel"], -input[type="url"], -input[type="password"], -textarea { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; } -textarea { - min-height: 65px; - padding-top: 6px; - padding-bottom: 6px; } -input[type="email"]:focus, -input[type="number"]:focus, -input[type="search"]:focus, -input[type="text"]:focus, -input[type="tel"]:focus, -input[type="url"]:focus, -input[type="password"]:focus, -textarea:focus, -select:focus { - border: 1px solid #33C3F0; - outline: 0; } -label, -legend { - display: block; - margin-bottom: .5rem; - font-weight: 600; } -fieldset { - padding: 0; - border-width: 0; } -input[type="checkbox"], -input[type="radio"] { - display: inline; } -label > .label-body { - display: inline-block; - margin-left: .5rem; - font-weight: normal; } - - -/* Lists -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -ul { - list-style: circle inside; } -ol { - list-style: decimal inside; } -ol, ul { - padding-left: 0; - margin-top: 0; } -ul ul, -ul ol, -ol ol, -ol ul { - margin: 1.5rem 0 1.5rem 3rem; - font-size: 90%; } -li { - margin-bottom: 1rem; } - - -/* Code -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -code { - padding: .2rem .5rem; - margin: 0 .2rem; - font-size: 90%; - white-space: nowrap; - background: #F1F1F1; - border: 1px solid #E1E1E1; - border-radius: 4px; } -pre > code { - display: block; - padding: 1rem 1.5rem; - white-space: pre; } - - -/* Tables -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -th, -td { - padding: 12px 15px; - text-align: left; - border-bottom: 1px solid #E1E1E1; } -th:first-child, -td:first-child { - padding-left: 0; } -th:last-child, -td:last-child { - padding-right: 0; } - - -/* Spacing -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -button, -.button { - margin-bottom: 1rem; } -input, -textarea, -select, -fieldset { - margin-bottom: 1.5rem; } -pre, -blockquote, -dl, -figure, -table, -p, -ul, -ol, -form { - margin-bottom: 2.5rem; } - - -/* Utilities -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -.u-full-width { - width: 100%; - box-sizing: border-box; } -.u-max-full-width { - max-width: 100%; - box-sizing: border-box; } -.u-pull-right { - float: right; } -.u-pull-left { - float: left; } - - -/* Misc -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -hr { - margin-top: 3rem; - margin-bottom: 3.5rem; - border-width: 0; - border-top: 1px solid #E1E1E1; } - - -/* Clearing -–––––––––––––––––––––––––––––––––––––––––––––––––– */ - -/* Self Clearing Goodness */ -.container:after, -.row:after, -.u-cf { - content: ""; - display: table; - clear: both; } - - -/* Media Queries -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -/* -Note: The best way to structure the use of media queries is to create the queries -near the relevant code. For example, if you wanted to change the styles for buttons -on small devices, paste the mobile query code up in the buttons section and style it -there. -*/ - - -/* Larger than mobile */ -@media (min-width: 400px) {} - -/* Larger than phablet (also point when grid becomes active) */ -@media (min-width: 550px) {} - -/* Larger than tablet */ -@media (min-width: 750px) {} - -/* Larger than desktop */ -@media (min-width: 1000px) {} - -/* Larger than Desktop HD */ -@media (min-width: 1200px) {} diff --git a/examples/actix3_example/api/static/css/style.css b/examples/actix3_example/api/static/css/style.css deleted file mode 100644 index ac2720d3..00000000 --- a/examples/actix3_example/api/static/css/style.css +++ /dev/null @@ -1,73 +0,0 @@ -.field-error { - border: 1px solid #ff0000 !important; -} - -.field-error-flash { - color: #ff0000; - display: block; - margin: -10px 0 10px 0; -} - -.field-success { - border: 1px solid #5ab953 !important; -} - -.field-success-flash { - color: #5ab953; - display: block; - margin: -10px 0 10px 0; -} - -span.completed { - text-decoration: line-through; -} - -form.inline { - display: inline; -} - -form.link, -button.link { - display: inline; - color: #1eaedb; - border: none; - outline: none; - background: none; - cursor: pointer; - padding: 0; - margin: 0 0 0 0; - height: inherit; - text-decoration: underline; - font-size: inherit; - text-transform: none; - font-weight: normal; - line-height: inherit; - letter-spacing: inherit; -} - -form.link:hover, -button.link:hover { - color: #0fa0ce; -} - -button.small { - height: 20px; - padding: 0 10px; - font-size: 10px; - line-height: 20px; - margin: 0 2.5px; -} - -.post:hover { - background-color: #bce2ee; -} - -.post td { - padding: 5px; - width: 150px; -} - -#delete-button { - color: red; - border-color: red; -} diff --git a/examples/actix3_example/api/static/images/favicon.png b/examples/actix3_example/api/static/images/favicon.png deleted file mode 100644 index 02b73904..00000000 Binary files a/examples/actix3_example/api/static/images/favicon.png and /dev/null differ diff --git a/examples/actix3_example/api/templates/edit.html.tera b/examples/actix3_example/api/templates/edit.html.tera deleted file mode 100644 index 5aeb22af..00000000 --- a/examples/actix3_example/api/templates/edit.html.tera +++ /dev/null @@ -1,49 +0,0 @@ -{% extends "layout.html.tera" %} {% block content %} -
-

Edit Post

-
-
-
-
- - -
-
-
- - - -
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-{% endblock content %} diff --git a/examples/actix3_example/api/templates/error/404.html.tera b/examples/actix3_example/api/templates/error/404.html.tera deleted file mode 100644 index afda653d..00000000 --- a/examples/actix3_example/api/templates/error/404.html.tera +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 404 - tera - - -

404: Hey! There's nothing here.

- The page at {{ uri }} does not exist! - - diff --git a/examples/actix3_example/api/templates/index.html.tera b/examples/actix3_example/api/templates/index.html.tera deleted file mode 100644 index 1dccdeba..00000000 --- a/examples/actix3_example/api/templates/index.html.tera +++ /dev/null @@ -1,52 +0,0 @@ -{% extends "layout.html.tera" %} {% block content %} -
-

-

Posts

- {% if flash %} - - {{ flash.message }} - - {% endif %} - - - - - - - - - - {% for post in posts %} - - - - - - {% endfor %} - - - - - - - - -
IDTitleText
{{ post.id }}{{ post.title }}{{ post.text }}
- {% if page == 1 %} Previous {% else %} - Previous - {% endif %} | {% if page == num_pages %} Next {% else %} - Next - {% endif %} -
- -
- - - -
-
-{% endblock content %} diff --git a/examples/actix3_example/api/templates/layout.html.tera b/examples/actix3_example/api/templates/layout.html.tera deleted file mode 100644 index c930afcc..00000000 --- a/examples/actix3_example/api/templates/layout.html.tera +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Actix Example - - - - - - - - - - - -
-

- {% block content %}{% endblock content %} -
- - diff --git a/examples/actix3_example/api/templates/new.html.tera b/examples/actix3_example/api/templates/new.html.tera deleted file mode 100644 index dee19565..00000000 --- a/examples/actix3_example/api/templates/new.html.tera +++ /dev/null @@ -1,38 +0,0 @@ -{% extends "layout.html.tera" %} {% block content %} -
-

New Post

-
-
- - -
-
-
- - - -
-
-
- -
-
-
-
-{% endblock content %} diff --git a/examples/actix3_example/entity/Cargo.toml b/examples/actix3_example/entity/Cargo.toml deleted file mode 100644 index 2925db0d..00000000 --- a/examples/actix3_example/entity/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "entity" -version = "0.1.0" -edition = "2021" -publish = false - -[lib] -name = "entity" -path = "src/lib.rs" - -[dependencies] -serde = { version = "1", features = ["derive"] } - -[dependencies.sea-orm] -path = "../../../" # remove this line in your own project -version = "1.0.0-rc.1" # sea-orm version diff --git a/examples/actix3_example/entity/src/lib.rs b/examples/actix3_example/entity/src/lib.rs deleted file mode 100644 index e8b6291a..00000000 --- a/examples/actix3_example/entity/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod post; diff --git a/examples/actix3_example/entity/src/post.rs b/examples/actix3_example/entity/src/post.rs deleted file mode 100644 index 62cde830..00000000 --- a/examples/actix3_example/entity/src/post.rs +++ /dev/null @@ -1,18 +0,0 @@ -use sea_orm::entity::prelude::*; -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, Deserialize, Serialize)] -#[sea_orm(table_name = "posts")] -pub struct Model { - #[sea_orm(primary_key)] - #[serde(skip_deserializing)] - pub id: i32, - pub title: String, - #[sea_orm(column_type = "Text")] - pub text: String, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/examples/actix3_example/migration/Cargo.toml b/examples/actix3_example/migration/Cargo.toml deleted file mode 100644 index cca2dd8a..00000000 --- a/examples/actix3_example/migration/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "migration" -version = "0.1.0" -edition = "2021" -publish = false - -[lib] -name = "migration" -path = "src/lib.rs" - -[dependencies] -async-std = { version = "1", features = ["attributes", "tokio1"] } - -[dependencies.sea-orm-migration] -path = "../../../sea-orm-migration" # remove this line in your own project -version = "1.0.0-rc.1" # sea-orm-migration version -features = [ - # Enable following runtime and db backend features if you want to run migration via CLI - # "runtime-async-std-native-tls", - # "sqlx-mysql", -] diff --git a/examples/actix3_example/migration/README.md b/examples/actix3_example/migration/README.md deleted file mode 100644 index 963caaeb..00000000 --- a/examples/actix3_example/migration/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Running Migrator CLI - -- Apply all pending migrations - ```sh - cargo run - ``` - ```sh - cargo run -- up - ``` -- Apply first 10 pending migrations - ```sh - cargo run -- up -n 10 - ``` -- Rollback last applied migrations - ```sh - cargo run -- down - ``` -- Rollback last 10 applied migrations - ```sh - cargo run -- down -n 10 - ``` -- Drop all tables from the database, then reapply all migrations - ```sh - cargo run -- fresh - ``` -- Rollback all applied migrations, then reapply all migrations - ```sh - cargo run -- refresh - ``` -- Rollback all applied migrations - ```sh - cargo run -- reset - ``` -- Check the status of all migrations - ```sh - cargo run -- status - ``` diff --git a/examples/actix3_example/migration/src/lib.rs b/examples/actix3_example/migration/src/lib.rs deleted file mode 100644 index af8d9b2a..00000000 --- a/examples/actix3_example/migration/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -pub use sea_orm_migration::prelude::*; - -mod m20220120_000001_create_post_table; - -pub struct Migrator; - -#[async_trait::async_trait] -impl MigratorTrait for Migrator { - fn migrations() -> Vec> { - vec![Box::new(m20220120_000001_create_post_table::Migration)] - } -} diff --git a/examples/actix3_example/migration/src/m20220120_000001_create_post_table.rs b/examples/actix3_example/migration/src/m20220120_000001_create_post_table.rs deleted file mode 100644 index c42a347b..00000000 --- a/examples/actix3_example/migration/src/m20220120_000001_create_post_table.rs +++ /dev/null @@ -1,35 +0,0 @@ -use sea_orm_migration::{prelude::*, schema::*}; - -#[derive(DeriveMigrationName)] -pub struct Migration; - -#[async_trait::async_trait] -impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - Table::create() - .table(Posts::Table) - .if_not_exists() - .col(pk_auto(Posts::Id)) - .col(string(Posts::Title)) - .col(string(Posts::Text)) - .to_owned(), - ) - .await - } - - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop().table(Posts::Table).to_owned()) - .await - } -} - -#[derive(DeriveIden)] -enum Posts { - Table, - Id, - Title, - Text, -} diff --git a/examples/actix3_example/migration/src/main.rs b/examples/actix3_example/migration/src/main.rs deleted file mode 100644 index c6b6e48d..00000000 --- a/examples/actix3_example/migration/src/main.rs +++ /dev/null @@ -1,6 +0,0 @@ -use sea_orm_migration::prelude::*; - -#[async_std::main] -async fn main() { - cli::run_cli(migration::Migrator).await; -} diff --git a/examples/actix3_example/service/Cargo.toml b/examples/actix3_example/service/Cargo.toml deleted file mode 100644 index 1f7194b4..00000000 --- a/examples/actix3_example/service/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -name = "actix3-example-service" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -entity = { path = "../entity" } - -[dependencies.sea-orm] -path = "../../../" # remove this line in your own project -version = "1.0.0-rc.1" # sea-orm version -features = [ - "debug-print", - "runtime-async-std-native-tls", - "sqlx-mysql", - # "sqlx-postgres", - # "sqlx-sqlite", -] - -[dev-dependencies] -tokio = { version = "1.20.0", features = ["macros", "rt"] } - -[features] -mock = ["sea-orm/mock"] - -[[test]] -name = "mock" -required-features = ["mock"] diff --git a/examples/actix3_example/service/src/lib.rs b/examples/actix3_example/service/src/lib.rs deleted file mode 100644 index 4a80f239..00000000 --- a/examples/actix3_example/service/src/lib.rs +++ /dev/null @@ -1,7 +0,0 @@ -mod mutation; -mod query; - -pub use mutation::*; -pub use query::*; - -pub use sea_orm; diff --git a/examples/actix3_example/service/src/mutation.rs b/examples/actix3_example/service/src/mutation.rs deleted file mode 100644 index dd6891d4..00000000 --- a/examples/actix3_example/service/src/mutation.rs +++ /dev/null @@ -1,53 +0,0 @@ -use ::entity::{post, post::Entity as Post}; -use sea_orm::*; - -pub struct Mutation; - -impl Mutation { - pub async fn create_post( - db: &DbConn, - form_data: post::Model, - ) -> Result { - post::ActiveModel { - title: Set(form_data.title.to_owned()), - text: Set(form_data.text.to_owned()), - ..Default::default() - } - .save(db) - .await - } - - pub async fn update_post_by_id( - db: &DbConn, - id: i32, - form_data: post::Model, - ) -> Result { - let post: post::ActiveModel = Post::find_by_id(id) - .one(db) - .await? - .ok_or(DbErr::Custom("Cannot find post.".to_owned())) - .map(Into::into)?; - - post::ActiveModel { - id: post.id, - title: Set(form_data.title.to_owned()), - text: Set(form_data.text.to_owned()), - } - .update(db) - .await - } - - pub async fn delete_post(db: &DbConn, id: i32) -> Result { - let post: post::ActiveModel = Post::find_by_id(id) - .one(db) - .await? - .ok_or(DbErr::Custom("Cannot find post.".to_owned())) - .map(Into::into)?; - - post.delete(db).await - } - - pub async fn delete_all_posts(db: &DbConn) -> Result { - Post::delete_many().exec(db).await - } -} diff --git a/examples/actix3_example/service/src/query.rs b/examples/actix3_example/service/src/query.rs deleted file mode 100644 index e8d2668f..00000000 --- a/examples/actix3_example/service/src/query.rs +++ /dev/null @@ -1,26 +0,0 @@ -use ::entity::{post, post::Entity as Post}; -use sea_orm::*; - -pub struct Query; - -impl Query { - pub async fn find_post_by_id(db: &DbConn, id: i32) -> Result, DbErr> { - Post::find_by_id(id).one(db).await - } - - /// If ok, returns (post models, num pages). - pub async fn find_posts_in_page( - db: &DbConn, - page: u64, - posts_per_page: u64, - ) -> Result<(Vec, u64), DbErr> { - // Setup paginator - let paginator = Post::find() - .order_by_asc(post::Column::Id) - .paginate(db, posts_per_page); - let num_pages = paginator.num_pages().await?; - - // Fetch paginated posts - paginator.fetch_page(page - 1).await.map(|p| (p, num_pages)) - } -} diff --git a/examples/actix3_example/service/tests/mock.rs b/examples/actix3_example/service/tests/mock.rs deleted file mode 100644 index bef2d1fd..00000000 --- a/examples/actix3_example/service/tests/mock.rs +++ /dev/null @@ -1,79 +0,0 @@ -mod prepare; - -use actix3_example_service::{Mutation, Query}; -use entity::post; -use prepare::prepare_mock_db; - -#[tokio::test] -async fn main() { - let db = &prepare_mock_db(); - - { - let post = Query::find_post_by_id(db, 1).await.unwrap().unwrap(); - - assert_eq!(post.id, 1); - } - - { - let post = Query::find_post_by_id(db, 5).await.unwrap().unwrap(); - - assert_eq!(post.id, 5); - } - - { - let post = Mutation::create_post( - db, - post::Model { - id: 0, - title: "Title D".to_owned(), - text: "Text D".to_owned(), - }, - ) - .await - .unwrap(); - - assert_eq!( - post, - post::ActiveModel { - id: sea_orm::ActiveValue::Unchanged(6), - title: sea_orm::ActiveValue::Unchanged("Title D".to_owned()), - text: sea_orm::ActiveValue::Unchanged("Text D".to_owned()) - } - ); - } - - { - let post = Mutation::update_post_by_id( - db, - 1, - post::Model { - id: 1, - title: "New Title A".to_owned(), - text: "New Text A".to_owned(), - }, - ) - .await - .unwrap(); - - assert_eq!( - post, - post::Model { - id: 1, - title: "New Title A".to_owned(), - text: "New Text A".to_owned(), - } - ); - } - - { - let result = Mutation::delete_post(db, 5).await.unwrap(); - - assert_eq!(result.rows_affected, 1); - } - - { - let result = Mutation::delete_all_posts(db).await.unwrap(); - - assert_eq!(result.rows_affected, 5); - } -} diff --git a/examples/actix3_example/service/tests/prepare.rs b/examples/actix3_example/service/tests/prepare.rs deleted file mode 100644 index 556c192c..00000000 --- a/examples/actix3_example/service/tests/prepare.rs +++ /dev/null @@ -1,50 +0,0 @@ -use ::entity::post; -use sea_orm::*; - -#[cfg(feature = "mock")] -pub fn prepare_mock_db() -> DatabaseConnection { - MockDatabase::new(DatabaseBackend::Postgres) - .append_query_results([ - [post::Model { - id: 1, - title: "Title A".to_owned(), - text: "Text A".to_owned(), - }], - [post::Model { - id: 5, - title: "Title C".to_owned(), - text: "Text C".to_owned(), - }], - [post::Model { - id: 6, - title: "Title D".to_owned(), - text: "Text D".to_owned(), - }], - [post::Model { - id: 1, - title: "Title A".to_owned(), - text: "Text A".to_owned(), - }], - [post::Model { - id: 1, - title: "New Title A".to_owned(), - text: "New Text A".to_owned(), - }], - [post::Model { - id: 5, - title: "Title C".to_owned(), - text: "Text C".to_owned(), - }], - ]) - .append_exec_results([ - MockExecResult { - last_insert_id: 6, - rows_affected: 1, - }, - MockExecResult { - last_insert_id: 6, - rows_affected: 5, - }, - ]) - .into_connection() -} diff --git a/examples/actix3_example/src/main.rs b/examples/actix3_example/src/main.rs deleted file mode 100644 index 5a0e63b8..00000000 --- a/examples/actix3_example/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - actix3_example_api::main(); -} diff --git a/src/lib.rs b/src/lib.rs index 80a9afce..25bb22ff 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -40,7 +40,6 @@ //! Integration examples: //! //! + [Actix v4 Example](https://github.com/SeaQL/sea-orm/tree/master/examples/actix_example) -//! + [Actix v3 Example](https://github.com/SeaQL/sea-orm/tree/master/examples/actix3_example) //! + [Axum Example](https://github.com/SeaQL/sea-orm/tree/master/examples/axum_example) //! + [GraphQL Example](https://github.com/SeaQL/sea-orm/tree/master/examples/graphql_example) //! + [jsonrpsee Example](https://github.com/SeaQL/sea-orm/tree/master/examples/jsonrpsee_example)