examples: deprecate actix3_example (#2154)
This commit is contained in:
parent
f0724c41d8
commit
b866236704
1
.github/workflows/rust.yml
vendored
1
.github/workflows/rust.yml
vendored
@ -234,7 +234,6 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
path: [
|
path: [
|
||||||
examples/actix_example,
|
examples/actix_example,
|
||||||
examples/actix3_example,
|
|
||||||
examples/axum_example,
|
examples/axum_example,
|
||||||
examples/basic,
|
examples/basic,
|
||||||
examples/graphql_example,
|
examples/graphql_example,
|
||||||
|
@ -30,7 +30,6 @@ Please help us with maintaining SeaORM by completing the [SeaQL Community Survey
|
|||||||
Integration examples:
|
Integration examples:
|
||||||
|
|
||||||
+ [Actix v4 Example](https://github.com/SeaQL/sea-orm/tree/master/examples/actix_example)
|
+ [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)
|
+ [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)
|
+ [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)
|
+ [jsonrpsee Example](https://github.com/SeaQL/sea-orm/tree/master/examples/jsonrpsee_example)
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
HOST=127.0.0.1
|
|
||||||
PORT=8000
|
|
||||||
DATABASE_URL="mysql://root:root@localhost/actix_example"
|
|
@ -1,12 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "sea-orm-actix-example"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["Sam Samai <sam@studio2pi.com.au>"]
|
|
||||||
edition = "2021"
|
|
||||||
publish = false
|
|
||||||
|
|
||||||
[workspace]
|
|
||||||
members = [".", "api", "service", "entity", "migration"]
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
actix3-example-api = { path = "api" }
|
|
@ -1,27 +0,0 @@
|
|||||||

|
|
||||||
|
|
||||||
# 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
|
|
||||||
```
|
|
Binary file not shown.
Before Width: | Height: | Size: 604 KiB |
@ -1,22 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "actix3-example-api"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["Sam Samai <sam@studio2pi.com.au>"]
|
|
||||||
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" }
|
|
@ -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<u64>,
|
|
||||||
posts_per_page: Option<u64>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
|
||||||
struct FlashData {
|
|
||||||
kind: String,
|
|
||||||
message: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[get("/")]
|
|
||||||
async fn list(
|
|
||||||
req: HttpRequest,
|
|
||||||
data: web::Data<AppState>,
|
|
||||||
opt_flash: Option<actix_flash::Message<FlashData>>,
|
|
||||||
) -> Result<HttpResponse, Error> {
|
|
||||||
let template = &data.templates;
|
|
||||||
let conn = &data.conn;
|
|
||||||
|
|
||||||
// get params
|
|
||||||
let params = web::Query::<Params>::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<AppState>) -> Result<HttpResponse, Error> {
|
|
||||||
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<AppState>,
|
|
||||||
post_form: web::Form<post::Model>,
|
|
||||||
) -> actix_flash::Response<HttpResponse, FlashData> {
|
|
||||||
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<AppState>, id: web::Path<i32>) -> Result<HttpResponse, Error> {
|
|
||||||
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<AppState>,
|
|
||||||
id: web::Path<i32>,
|
|
||||||
post_form: web::Form<post::Model>,
|
|
||||||
) -> actix_flash::Response<HttpResponse, FlashData> {
|
|
||||||
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<AppState>,
|
|
||||||
id: web::Path<i32>,
|
|
||||||
) -> actix_flash::Response<HttpResponse, FlashData> {
|
|
||||||
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}")
|
|
||||||
}
|
|
||||||
}
|
|
427
examples/actix3_example/api/static/css/normalize.css
vendored
427
examples/actix3_example/api/static/css/normalize.css
vendored
@ -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;
|
|
||||||
}
|
|
421
examples/actix3_example/api/static/css/skeleton.css
vendored
421
examples/actix3_example/api/static/css/skeleton.css
vendored
@ -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) {}
|
|
@ -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;
|
|
||||||
}
|
|
Binary file not shown.
@ -1,49 +0,0 @@
|
|||||||
{% extends "layout.html.tera" %} {% block content %}
|
|
||||||
<div class="row">
|
|
||||||
<h4>Edit Post</h4>
|
|
||||||
<div class="twelve columns">
|
|
||||||
<div class="ten columns">
|
|
||||||
<form action="/{{ post.id }}" method="post">
|
|
||||||
<div class="twelve columns">
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
placeholder="title"
|
|
||||||
name="title"
|
|
||||||
id="title"
|
|
||||||
value="{{ post.title }}"
|
|
||||||
autofocus
|
|
||||||
class="u-full-width"
|
|
||||||
/>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
placeholder="content"
|
|
||||||
name="text"
|
|
||||||
id="text"
|
|
||||||
value="{{ post.text }}"
|
|
||||||
autofocus
|
|
||||||
class="u-full-width"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="twelve columns">
|
|
||||||
<div class="two columns">
|
|
||||||
<a href="/">
|
|
||||||
<input type="button" value="cancel" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="eight columns"></div>
|
|
||||||
<div class="two columns">
|
|
||||||
<input type="submit" value="save post" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div class="two columns">
|
|
||||||
<form action="/delete/{{ post.id }}" method="post">
|
|
||||||
<div class="two columns">
|
|
||||||
<input id="delete-button" type="submit" value="delete post" />
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
@ -1,11 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<title>404 - tera</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>404: Hey! There's nothing here.</h1>
|
|
||||||
The page at {{ uri }} does not exist!
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,52 +0,0 @@
|
|||||||
{% extends "layout.html.tera" %} {% block content %}
|
|
||||||
<div class="container">
|
|
||||||
<p><!--Nothing to see here --></p>
|
|
||||||
<h1>Posts</h1>
|
|
||||||
{% if flash %}
|
|
||||||
<small class="field-{{ flash.kind }}-flash">
|
|
||||||
{{ flash.message }}
|
|
||||||
</small>
|
|
||||||
{% endif %}
|
|
||||||
<table>
|
|
||||||
<tbody>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>ID</th>
|
|
||||||
<th>Title</th>
|
|
||||||
<th>Text</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
{% for post in posts %}
|
|
||||||
<tr class="post" onclick="window.location='/{{ post.id }}';">
|
|
||||||
<td>{{ post.id }}</td>
|
|
||||||
<td>{{ post.title }}</td>
|
|
||||||
<td>{{ post.text }}</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
<tfoot>
|
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td>
|
|
||||||
{% if page == 1 %} Previous {% else %}
|
|
||||||
<a href="/?page={{ page - 1 }}&posts_per_page={{ posts_per_page }}"
|
|
||||||
>Previous</a
|
|
||||||
>
|
|
||||||
{% endif %} | {% if page == num_pages %} Next {% else %}
|
|
||||||
<a href="/?page={{ page + 1 }}&posts_per_page={{ posts_per_page }}"
|
|
||||||
>Next</a
|
|
||||||
>
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
</tfoot>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<div class="twelve columns">
|
|
||||||
<a href="/new">
|
|
||||||
<input type="button" value="add post" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<title>Actix Example</title>
|
|
||||||
<meta name="description" content="Actix - SeaOrm integration example" />
|
|
||||||
<meta name="author" content="Sam Samai" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
|
|
||||||
<link
|
|
||||||
href="//fonts.googleapis.com/css?family=Raleway:400,300,600"
|
|
||||||
rel="stylesheet"
|
|
||||||
type="text/css"
|
|
||||||
/>
|
|
||||||
<link rel="stylesheet" href="/static/css/normalize.css" />
|
|
||||||
<link rel="stylesheet" href="/static/css/skeleton.css" />
|
|
||||||
<link rel="stylesheet" href="/static/css/style.css" />
|
|
||||||
<link rel="icon" type="image/png" href="/static/images/favicon.png" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="container">
|
|
||||||
<p><!--Nothing to see here --></p>
|
|
||||||
{% block content %}{% endblock content %}
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,38 +0,0 @@
|
|||||||
{% extends "layout.html.tera" %} {% block content %}
|
|
||||||
<div class="row">
|
|
||||||
<h4>New Post</h4>
|
|
||||||
<form action="/" method="post">
|
|
||||||
<div class="twelve columns">
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
placeholder="enter title"
|
|
||||||
name="title"
|
|
||||||
id="title"
|
|
||||||
value=""
|
|
||||||
autofocus
|
|
||||||
class="u-full-width"
|
|
||||||
/>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
placeholder="enter content"
|
|
||||||
name="text"
|
|
||||||
id="text"
|
|
||||||
value=""
|
|
||||||
autofocus
|
|
||||||
class="u-full-width"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="twelve columns">
|
|
||||||
<div class="two columns">
|
|
||||||
<a href="/">
|
|
||||||
<input type="button" value="cancel" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="eight columns"></div>
|
|
||||||
<div class="two columns">
|
|
||||||
<input type="submit" value="save post" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||||||
pub mod post;
|
|
@ -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 {}
|
|
@ -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",
|
|
||||||
]
|
|
@ -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
|
|
||||||
```
|
|
@ -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<Box<dyn MigrationTrait>> {
|
|
||||||
vec![Box::new(m20220120_000001_create_post_table::Migration)]
|
|
||||||
}
|
|
||||||
}
|
|
@ -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,
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
use sea_orm_migration::prelude::*;
|
|
||||||
|
|
||||||
#[async_std::main]
|
|
||||||
async fn main() {
|
|
||||||
cli::run_cli(migration::Migrator).await;
|
|
||||||
}
|
|
@ -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"]
|
|
@ -1,7 +0,0 @@
|
|||||||
mod mutation;
|
|
||||||
mod query;
|
|
||||||
|
|
||||||
pub use mutation::*;
|
|
||||||
pub use query::*;
|
|
||||||
|
|
||||||
pub use sea_orm;
|
|
@ -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, DbErr> {
|
|
||||||
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<post::Model, DbErr> {
|
|
||||||
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<DeleteResult, DbErr> {
|
|
||||||
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<DeleteResult, DbErr> {
|
|
||||||
Post::delete_many().exec(db).await
|
|
||||||
}
|
|
||||||
}
|
|
@ -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<Option<post::Model>, 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<post::Model>, 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))
|
|
||||||
}
|
|
||||||
}
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -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()
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
fn main() {
|
|
||||||
actix3_example_api::main();
|
|
||||||
}
|
|
@ -40,7 +40,6 @@
|
|||||||
//! Integration examples:
|
//! Integration examples:
|
||||||
//!
|
//!
|
||||||
//! + [Actix v4 Example](https://github.com/SeaQL/sea-orm/tree/master/examples/actix_example)
|
//! + [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)
|
//! + [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)
|
//! + [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)
|
//! + [jsonrpsee Example](https://github.com/SeaQL/sea-orm/tree/master/examples/jsonrpsee_example)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user