List posts from the DB

This commit is contained in:
Sam Samai 2021-09-12 11:39:53 +10:00
parent 8f3a45e6ae
commit 1ba6b0b647
2 changed files with 43 additions and 35 deletions

View File

@ -1,5 +1,5 @@
[package] [package]
name = "sea-orm-rocket-example" name = "sea-orm-actix-example"
version = "0.1.0" version = "0.1.0"
authors = ["Sam Samai <sam@studio2pi.com.au>"] authors = ["Sam Samai <sam@studio2pi.com.au>"]
edition = "2018" edition = "2018"
@ -21,7 +21,7 @@ tera = "1.8.0"
sea-orm = { path = "../../", version = "^0.2", features = [ sea-orm = { path = "../../", version = "^0.2", features = [
"macros", "macros",
"sqlx-all", "sqlx-all",
"runtime-tokio-native-tls", "runtime-async-std-native-tls",
], default-features = false } ], default-features = false }
serde = "1" serde = "1"
env_logger = "0.8" env_logger = "0.8"
@ -29,9 +29,9 @@ env_logger = "0.8"
[dependencies.sqlx] [dependencies.sqlx]
version = "^0.5" version = "^0.5"
default-features = false default-features = false
features = ["macros", "offline", "migrate"] features = ["macros", "offline", "migrate", "runtime-async-std-native-tls"]
[features] [features]
default = ["sqlx-postgres"] default = ["sqlx-mysql"]
sqlx-mysql = ["sea-orm/sqlx-mysql"] sqlx-mysql = ["sea-orm/sqlx-mysql"]
sqlx-postgres = ["sea-orm/sqlx-postgres"] sqlx-postgres = ["sea-orm/sqlx-postgres"]

View File

@ -1,66 +1,74 @@
// use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder}; // use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};
use actix_files as fs;
use actix_http::{body::Body, Response}; use actix_http::{body::Body, Response};
use actix_web::dev::ServiceResponse; use actix_web::dev::ServiceResponse;
use actix_web::http::StatusCode; use actix_web::http::StatusCode;
use actix_web::middleware::errhandlers::{ErrorHandlerResponse, ErrorHandlers}; use actix_web::middleware::errhandlers::{ErrorHandlerResponse, ErrorHandlers};
use actix_web::{error, middleware, web, App, Error, HttpResponse, HttpServer, Result}; use actix_web::{error, get, middleware, post, web, App, Error, HttpResponse, HttpServer, Result};
use actix_files as fs;
use tera::Tera; use tera::Tera;
mod post; mod post;
pub use post::Entity as Post; pub use post::Entity as Post;
use sea_orm::query::*;
use sea_orm::DatabaseConnection;
use sea_orm::EntityTrait;
mod setup;
// // store tera template in application state struct AppState {
// async fn index( db_url: String,
// tmpl: web::Data<tera::Tera>, templates: tera::Tera,
// query: web::Query<HashMap<String, String>>, }
// ) -> Result<HttpResponse, Error> {
// let s = if let Some(name) = query.get("name") { #[get("/")]
// // submitted form async fn list(data: web::Data<AppState>) -> Result<HttpResponse, Error> {
// let mut ctx = tera::Context::new(); let template = &data.templates;
// ctx.insert("name", &name.to_owned()); let conn = sea_orm::Database::connect(&data.db_url).await.unwrap();
// ctx.insert("text", &"Welcome!".to_owned());
// tmpl.render("user.html", &ctx) let posts = Post::find()
// .map_err(|_| error::ErrorInternalServerError("Template error"))? .all(&conn)
// } else { .await
// tmpl.render("index.html", &tera::Context::new()) .expect("could not retrieve posts");
// .map_err(|_| error::ErrorInternalServerError("Template error"))?
// };
// Ok(HttpResponse::Ok().content_type("text/html").body(s))
// }
async fn list( tmpl: web::Data<tera::Tera>) -> Result<HttpResponse, Error> {
let posts: Vec<post::Model> = vec!();
let mut ctx = tera::Context::new(); let mut ctx = tera::Context::new();
ctx.insert("posts", &posts); ctx.insert("posts", &posts);
ctx.insert("page", &0); ctx.insert("page", &0);
ctx.insert("num_pages", &1); ctx.insert("num_pages", &1);
let s = tmpl.render("index.html.tera", &ctx) let body = template
.map_err(|_| error::ErrorInternalServerError("Template error"))?; .render("index.html.tera", &ctx)
Ok(HttpResponse::Ok().content_type("text/html").body(s)) .map_err(|_| error::ErrorInternalServerError("Template error"))?;
Ok(HttpResponse::Ok().content_type("text/html").body(body))
} }
#[actix_web::main] #[actix_web::main]
async fn main() -> std::io::Result<()> { async fn main() -> std::io::Result<()> {
std::env::set_var("RUST_LOG", "actix_web=info"); std::env::set_var("RUST_LOG", "actix_web=info");
env_logger::init(); env_logger::init();
let db_url = "mysql://root:@localhost/rocket_example";
let conn = sea_orm::Database::connect(&db_url).await.unwrap();
let _ = setup::create_post_table(&conn).await;
println!("Listening on: 127.0.0.1:8080"); println!("Listening on: 127.0.0.1:8080");
HttpServer::new(|| { HttpServer::new(move || {
let tera = let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap();
Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap();
App::new() App::new()
.data(tera) .data(AppState {
db_url: db_url.to_owned(),
templates: templates,
})
.wrap(middleware::Logger::default()) // enable logger .wrap(middleware::Logger::default()) // enable logger
.service(fs::Files::new("/static", "./static").show_files_listing()) .service(fs::Files::new("/static", "./static").show_files_listing())
.service(web::resource("/").route(web::get().to(list))) .configure(init) // init todo routes
}) })
.bind("127.0.0.1:8080")? .bind("127.0.0.1:8080")?
.run() .run()
.await .await
} }
// function that will be called on new Application to configure routes for this module
pub fn init(cfg: &mut web::ServiceConfig) {
cfg.service(list);
}