Add flash messages
This commit is contained in:
parent
237dcaa6a9
commit
8b46a89e2c
@ -14,6 +14,7 @@ futures = { version = "^0.3" }
|
||||
futures-util = { version = "^0.3" }
|
||||
actix-http = "2"
|
||||
actix-web = "3"
|
||||
actix-flash = "0.2"
|
||||
actix-files = "0.5"
|
||||
tera = "1.8.0"
|
||||
dotenv = "0.15"
|
||||
|
@ -13,7 +13,7 @@ use listenfd::ListenFd;
|
||||
use sea_orm::entity::*;
|
||||
use sea_orm::query::*;
|
||||
use sea_orm::EntityTrait;
|
||||
use serde::Deserialize;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::env;
|
||||
use tera::Tera;
|
||||
|
||||
@ -34,8 +34,18 @@ pub struct Params {
|
||||
posts_per_page: Option<usize>,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
||||
struct FlashData {
|
||||
kind: String,
|
||||
message: String,
|
||||
}
|
||||
|
||||
#[get("/")]
|
||||
async fn list(req: HttpRequest, data: web::Data<AppState>) -> Result<HttpResponse, Error> {
|
||||
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 = sea_orm::Database::connect(&data.db_url).await.unwrap();
|
||||
|
||||
@ -47,6 +57,15 @@ async fn list(req: HttpRequest, data: web::Data<AppState>) -> Result<HttpRespons
|
||||
let paginator = Post::find().paginate(&conn, posts_per_page);
|
||||
let num_pages = paginator.num_pages().await.ok().unwrap();
|
||||
|
||||
let mut flash_message = String::new();
|
||||
let mut flash_kind = String::new();
|
||||
|
||||
if let Some(flash) = opt_flash {
|
||||
let flash_inner = flash.into_inner();
|
||||
flash_message = flash_inner.message.to_owned();
|
||||
flash_kind = flash_inner.kind.to_owned();
|
||||
}
|
||||
|
||||
let posts = paginator
|
||||
.fetch_page(page)
|
||||
.await
|
||||
@ -56,6 +75,8 @@ async fn list(req: HttpRequest, data: web::Data<AppState>) -> Result<HttpRespons
|
||||
ctx.insert("page", &page);
|
||||
ctx.insert("posts_per_page", &posts_per_page);
|
||||
ctx.insert("num_pages", &num_pages);
|
||||
ctx.insert("flash_message", &flash_message);
|
||||
ctx.insert("flash_kind", &flash_kind);
|
||||
|
||||
let body = template
|
||||
.render("index.html.tera", &ctx)
|
||||
@ -77,7 +98,7 @@ async fn new(data: web::Data<AppState>) -> Result<HttpResponse, Error> {
|
||||
async fn create(
|
||||
data: web::Data<AppState>,
|
||||
post_form: web::Form<post::Model>,
|
||||
) -> Result<HttpResponse, Error> {
|
||||
) -> actix_flash::Response<HttpResponse, FlashData> {
|
||||
let conn = sea_orm::Database::connect(&data.db_url).await.unwrap();
|
||||
|
||||
let form = post_form.into_inner();
|
||||
@ -91,7 +112,12 @@ async fn create(
|
||||
.await
|
||||
.expect("could not insert post");
|
||||
|
||||
Ok(HttpResponse::Found().header("location", "/").finish())
|
||||
let flash = FlashData {
|
||||
kind: "success".to_owned(),
|
||||
message: "Post successfully added.".to_owned(),
|
||||
};
|
||||
|
||||
actix_flash::Response::with_redirect(flash.clone(), "/")
|
||||
}
|
||||
|
||||
#[get("/{id}")]
|
||||
@ -119,7 +145,7 @@ async fn update(
|
||||
data: web::Data<AppState>,
|
||||
id: web::Path<i32>,
|
||||
post_form: web::Form<post::Model>,
|
||||
) -> Result<HttpResponse, Error> {
|
||||
) -> actix_flash::Response<HttpResponse, FlashData> {
|
||||
let conn = sea_orm::Database::connect(&data.db_url).await.unwrap();
|
||||
let form = post_form.into_inner();
|
||||
|
||||
@ -132,11 +158,19 @@ async fn update(
|
||||
.await
|
||||
.expect("could not edit post");
|
||||
|
||||
Ok(HttpResponse::Found().header("location", "/").finish())
|
||||
let flash = FlashData {
|
||||
kind: "success".to_owned(),
|
||||
message: "Post successfully updated.".to_owned(),
|
||||
};
|
||||
|
||||
actix_flash::Response::with_redirect(flash.clone(), "/")
|
||||
}
|
||||
|
||||
#[post("/delete/{id}")]
|
||||
async fn delete(data: web::Data<AppState>, id: web::Path<i32>) -> Result<HttpResponse, Error> {
|
||||
async fn delete(
|
||||
data: web::Data<AppState>,
|
||||
id: web::Path<i32>,
|
||||
) -> actix_flash::Response<HttpResponse, FlashData> {
|
||||
let conn = sea_orm::Database::connect(&data.db_url).await.unwrap();
|
||||
|
||||
let post: post::ActiveModel = Post::find_by_id(id.into_inner())
|
||||
@ -148,8 +182,12 @@ async fn delete(data: web::Data<AppState>, id: web::Path<i32>) -> Result<HttpRes
|
||||
|
||||
post.delete(&conn).await.unwrap();
|
||||
|
||||
// Flash::success(Redirect::to("/"), "Post successfully deleted.")
|
||||
Ok(HttpResponse::Found().header("location", "/").finish())
|
||||
let flash = FlashData {
|
||||
kind: "success".to_owned(),
|
||||
message: "Post successfully deleted.".to_owned(),
|
||||
};
|
||||
|
||||
actix_flash::Response::with_redirect(flash.clone(), "/")
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
@ -177,6 +215,7 @@ async fn main() -> std::io::Result<()> {
|
||||
templates: templates,
|
||||
})
|
||||
.wrap(middleware::Logger::default()) // enable logger
|
||||
.wrap(actix_flash::Flash::default())
|
||||
.configure(init)
|
||||
.service(fs::Files::new("/static", "./static").show_files_listing())
|
||||
});
|
||||
|
@ -2,11 +2,11 @@
|
||||
<div class="container">
|
||||
<p><!--Nothing to see here --></p>
|
||||
<h1>Posts</h1>
|
||||
{# {% if flash %}
|
||||
<small class="field-{{ flash.0 }}-flash">
|
||||
{{ flash.1 }}
|
||||
{% if flash_message %}
|
||||
<small class="field-{{ flash_kind }}-flash">
|
||||
{{ flash_message }}
|
||||
</small>
|
||||
{% endif %} #}
|
||||
{% endif %}
|
||||
<table>
|
||||
<tbody>
|
||||
<thead>
|
||||
|
Loading…
x
Reference in New Issue
Block a user