HTML validation + Actually associate messages to errors + Fix inverted behavior on new blog and post form

This commit is contained in:
Bat
2018-07-07 22:51:48 +02:00
parent e5c1b3259d
commit 3775d3a9c9
10 changed files with 34 additions and 24 deletions
+9 -4
View File
@@ -5,6 +5,7 @@ use rocket::{
};
use rocket_contrib::Template;
use serde_json;
use std::{collections::HashMap, borrow::Cow};
use validator::{Validate, ValidationError, ValidationErrors};
use plume_common::activity_pub::ActivityStream;
@@ -54,7 +55,7 @@ fn new_auth() -> Flash<Redirect>{
#[derive(FromForm, Validate, Serialize)]
struct NewBlogForm {
#[validate(custom = "valid_slug")]
#[validate(custom(function = "valid_slug", message = "Invalid name"))]
pub title: String
}
@@ -71,14 +72,17 @@ fn valid_slug(title: &str) -> Result<(), ValidationError> {
fn create(conn: DbConn, data: LenientForm<NewBlogForm>, user: User) -> Result<Redirect, Template> {
let form = data.get();
let slug = utils::make_actor_id(form.title.to_string());
let slug_taken_err = Blog::find_local(&*conn, slug.clone()).ok_or(ValidationError::new("existing_slug"));
let mut errors = match form.validate() {
Ok(_) => ValidationErrors::new(),
Err(e) => e
};
if let Err(e) = slug_taken_err {
errors.add("title", e)
if let Some(_) = Blog::find_local(&*conn, slug.clone()) {
errors.add("title", ValidationError {
code: Cow::from("existing_slug"),
message: Some(Cow::from("A blog with the same name already exists.")),
params: HashMap::new()
});
}
if errors.is_empty() {
@@ -98,6 +102,7 @@ fn create(conn: DbConn, data: LenientForm<NewBlogForm>, user: User) -> Result<Re
Ok(Redirect::to(uri!(details: name = slug.clone())))
} else {
println!("{:?}", errors);
Err(Template::render("blogs/new", json!({
"account": user,
"errors": errors.inner(),
+1 -1
View File
@@ -20,7 +20,7 @@ use inbox::Inbox;
#[derive(FromForm, Debug, Validate)]
struct NewCommentForm {
pub responding_to: Option<i32>,
#[validate(length(min = "1"))]
#[validate(length(min = "1", message = "Your comment can't be empty"))]
pub content: String
}
+8 -4
View File
@@ -4,6 +4,7 @@ use rocket::request::LenientForm;
use rocket::response::{Redirect, Flash};
use rocket_contrib::Template;
use serde_json;
use std::{collections::HashMap, borrow::Cow};
use validator::{Validate, ValidationError, ValidationErrors};
use plume_common::activity_pub::{broadcast, ActivityStream};
@@ -86,7 +87,7 @@ fn new(blog: String, user: User, conn: DbConn) -> Template {
#[derive(FromForm, Validate, Serialize)]
struct NewPostForm {
#[validate(custom = "valid_slug")]
#[validate(custom(function = "valid_slug", message = "Invalid title"))]
pub title: String,
pub content: String,
pub license: String
@@ -108,14 +109,17 @@ fn create(blog_name: String, data: LenientForm<NewPostForm>, user: User, conn: D
let blog = Blog::find_by_fqn(&*conn, blog_name.to_string()).unwrap();
let form = data.get();
let slug = form.title.to_string().to_kebab_case();
let slug_taken_err = Blog::find_local(&*conn, slug.clone()).ok_or(ValidationError::new("existing_slug"));
let mut errors = match form.validate() {
Ok(_) => ValidationErrors::new(),
Err(e) => e
};
if let Err(e) = slug_taken_err {
errors.add("title", e);
if let Some(_) = Post::find_by_slug(&*conn, slug.clone(), blog.id) {
errors.add("title", ValidationError {
code: Cow::from("existing_slug"),
message: Some(Cow::from("A post with the same title already exists.")),
params: HashMap::new()
});
}
if errors.is_empty() {
+2 -2
View File
@@ -38,9 +38,9 @@ fn new_message(user: Option<User>, message: Message) -> Template {
#[derive(FromForm, Validate, Serialize)]
struct LoginForm {
#[validate(length(min = "1"))]
#[validate(length(min = "1", message = "We need an email or a username to identify you"))]
email_or_name: String,
#[validate(length(min = "8"))]
#[validate(length(min = "8", message = "Your password should be at least 8 characters long"))]
password: String
}
+1 -1
View File
@@ -161,7 +161,7 @@ fn update(_name: String, conn: DbConn, user: User, data: LenientForm<UpdateUserF
}
#[derive(FromForm, Serialize, Validate)]
#[validate(schema(function = "passwords_match", skip_on_field_errors = "false"))]
#[validate(schema(function = "passwords_match", skip_on_field_errors = "false", message = "Passwords are not matching"))]
struct NewUserForm {
#[validate(length(min = "1", message = "Username can't be empty"))]
username: String,