Add new post

This commit is contained in:
Sam Samai 2021-09-12 17:12:20 +10:00
parent 5d7a9ca782
commit f97c081c2a
3 changed files with 74 additions and 2 deletions

View File

@ -9,6 +9,7 @@ use actix_web::{
error, get, middleware, post, web, App, Error, HttpRequest, HttpResponse, HttpServer, Result, error, get, middleware, post, web, App, Error, HttpRequest, HttpResponse, HttpServer, Result,
}; };
use listenfd::ListenFd; use listenfd::ListenFd;
use sea_orm::entity::*;
use sea_orm::query::*; use sea_orm::query::*;
use sea_orm::DatabaseConnection; use sea_orm::DatabaseConnection;
use sea_orm::EntityTrait; use sea_orm::EntityTrait;
@ -20,7 +21,7 @@ mod post;
pub use post::Entity as Post; pub use post::Entity as Post;
mod setup; mod setup;
const DEFAULT_POSTS_PER_PAGE: usize = 4; const DEFAULT_POSTS_PER_PAGE: usize = 25;
struct AppState { struct AppState {
db_url: String, db_url: String,
@ -62,6 +63,37 @@ async fn list(req: HttpRequest, data: web::Data<AppState>) -> Result<HttpRespons
Ok(HttpResponse::Ok().content_type("text/html").body(body)) 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>,
) -> Result<HttpResponse, Error> {
let conn = sea_orm::Database::connect(&data.db_url).await.unwrap();
let form = post_form.into_inner();
post::ActiveModel {
title: Set(form.title.to_owned()),
text: Set(form.text.to_owned()),
..Default::default()
}
.save(&conn)
.await
.expect("could not insert post");
Ok(HttpResponse::Found().header("location", "/").finish())
}
#[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");
@ -104,4 +136,6 @@ async fn main() -> std::io::Result<()> {
pub fn init(cfg: &mut web::ServiceConfig) { pub fn init(cfg: &mut web::ServiceConfig) {
cfg.service(list); cfg.service(list);
cfg.service(new);
cfg.service(create);
} }

View File

@ -0,0 +1,38 @@
{% 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 %}

View File

@ -29,7 +29,7 @@ pub use post::Entity as Post;
const DEFAULT_POSTS_PER_PAGE: usize = 25; const DEFAULT_POSTS_PER_PAGE: usize = 25;
#[get("/new")] #[get("/new")]
fn new() -> Template { async fn new() -> Template {
Template::render("new", &Context::default()) Template::render("new", &Context::default())
} }