added base account changes
This commit is contained in:
parent
910a3d5845
commit
0c60a0dea2
5 changed files with 135 additions and 5 deletions
2
migrations/5_user_index.sql
Normal file
2
migrations/5_user_index.sql
Normal file
|
@ -0,0 +1,2 @@
|
|||
alter table users
|
||||
add unique (username);
|
|
@ -2,7 +2,7 @@ use uuid::Uuid;
|
|||
|
||||
use crate::db::schema::User;
|
||||
|
||||
use super::schema::{DollTagsDb, TrxHook};
|
||||
use super::schema::{DbHook, DollTagsDb, TrxHook};
|
||||
|
||||
pub async fn get(mut db: DollTagsDb, username: &str) -> sqlx::Result<Option<User>> {
|
||||
sqlx::query_as!(User, "select * from users where username = $1", username)
|
||||
|
@ -32,6 +32,32 @@ pub async fn create(
|
|||
.await
|
||||
}
|
||||
|
||||
pub async fn exists(db: &mut DbHook, username: &str) -> sqlx::Result<bool> {
|
||||
Ok(
|
||||
sqlx::query_scalar!("select id from users where username = $1", username)
|
||||
.fetch_optional(&mut **db)
|
||||
.await?
|
||||
.is_some(),
|
||||
)
|
||||
}
|
||||
|
||||
pub async fn update_info(
|
||||
db: &mut DbHook,
|
||||
id: &Uuid,
|
||||
username: &str,
|
||||
email: Option<&str>,
|
||||
) -> sqlx::Result<()> {
|
||||
sqlx::query!(
|
||||
"update users set username = $1, email = $2 where id = $3",
|
||||
username,
|
||||
email,
|
||||
id
|
||||
)
|
||||
.execute(&mut **db)
|
||||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn delete(trx: &mut TrxHook<'_>, id: &Uuid) -> sqlx::Result<()> {
|
||||
sqlx::query!("delete from users where id = $1", id)
|
||||
.execute(&mut **trx)
|
||||
|
|
|
@ -32,6 +32,8 @@ fn rocket() -> _ {
|
|||
routes![
|
||||
account::index,
|
||||
account::show_settings,
|
||||
account::change_settings,
|
||||
account::change_password,
|
||||
form::register_tag::show_register,
|
||||
form::register_tag::handle_register,
|
||||
account::ask_delete,
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use rocket::{
|
||||
form::{self, Contextual, Error, Form},
|
||||
http::CookieJar,
|
||||
response::Redirect,
|
||||
serde::{json::Json, Serialize},
|
||||
|
@ -9,7 +10,7 @@ use sqlx::Acquire;
|
|||
use crate::{
|
||||
auth::session,
|
||||
db::{
|
||||
doll,
|
||||
self, doll,
|
||||
schema::{DollProfile, DollTagsDb, User},
|
||||
user,
|
||||
},
|
||||
|
@ -37,7 +38,106 @@ pub async fn index(mut db: DollTagsDb, user: User, meta: CommonTemplateState) ->
|
|||
|
||||
#[get("/settings")]
|
||||
pub fn show_settings(user: User, meta: CommonTemplateState) -> Template {
|
||||
Template::render("account/settings", context! {user,meta})
|
||||
Template::render(
|
||||
"account/settings",
|
||||
context! {
|
||||
user,
|
||||
meta,
|
||||
prev_common: form::Context::default(),
|
||||
prev_password: form::Context::default(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
#[derive(FromForm)]
|
||||
pub struct CommonSettings<'a> {
|
||||
#[field(validate=len(..=256))]
|
||||
pub username: &'a str,
|
||||
#[field(validate=len(..=254))]
|
||||
pub email: &'a str,
|
||||
}
|
||||
|
||||
#[post("/settings/common", data = "<form>")]
|
||||
pub async fn change_settings(
|
||||
mut db: DollTagsDb,
|
||||
user: User,
|
||||
meta: CommonTemplateState,
|
||||
mut form: Form<Contextual<'_, CommonSettings<'_>>>,
|
||||
) -> PageResult {
|
||||
let values = match form.value {
|
||||
Some(ref v) => v,
|
||||
None => {
|
||||
return Ok(Template::render(
|
||||
"account/settings",
|
||||
context! {
|
||||
user,
|
||||
meta,
|
||||
prev_common: &form.context,
|
||||
prev_password: form::Context::default(),
|
||||
},
|
||||
)
|
||||
.into())
|
||||
}
|
||||
};
|
||||
|
||||
if user.username != values.username && (user::exists(&mut *db, values.username).await?) {
|
||||
form.context
|
||||
.push_error(Error::validation("username already taken").with_name("username"));
|
||||
return Ok(Template::render(
|
||||
"account/settings",
|
||||
context! {
|
||||
user,
|
||||
meta,
|
||||
prev_common: &form.context,
|
||||
prev_password: form::Context::default(),
|
||||
},
|
||||
)
|
||||
.into());
|
||||
}
|
||||
|
||||
let new_username = if values.username.len() != 0 {
|
||||
values.username
|
||||
} else {
|
||||
&user.username
|
||||
};
|
||||
// TODO: this will not allow to unset the email
|
||||
let new_email = if values.email.len() != 0 {
|
||||
Some(values.email)
|
||||
} else {
|
||||
user.email.as_ref().map(|w| w.as_str())
|
||||
};
|
||||
|
||||
user::update_info(&mut *db, &user.id, new_username, new_email).await?;
|
||||
|
||||
Ok(Redirect::to(uri!("/account", show_settings)).into())
|
||||
}
|
||||
|
||||
#[derive(FromForm)]
|
||||
pub struct PasswordSettings<'a> {
|
||||
#[field(validate=len(8..))]
|
||||
pub old_password: &'a str,
|
||||
#[field(validate=len(8..))]
|
||||
#[field(validate=validate_new_passwords(self.confirm_password))]
|
||||
pub password: &'a str,
|
||||
#[field(validate=len(8..))]
|
||||
pub confirm_password: &'a str,
|
||||
}
|
||||
|
||||
pub fn validate_new_passwords<'v>(new: &str, confirm: &str) -> form::Result<'v, ()> {
|
||||
if new != confirm {
|
||||
Err(form::Error::validation("the two new passwords don't match"))?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[post("/settings/password", data = "<form>")]
|
||||
pub fn change_password(
|
||||
user: User,
|
||||
meta: CommonTemplateState,
|
||||
form: Form<Contextual<'_, PasswordSettings<'_>>>,
|
||||
) -> Template {
|
||||
todo!("meow");
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize)]
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<h2>Your settings</h2>
|
||||
|
||||
<div class="fields raised">
|
||||
<form method="post" class="">
|
||||
<form method="post" action="/account/settings/common">
|
||||
<input type="hidden" name="form" value="info">
|
||||
<div>
|
||||
<p class="heading"><label for="username">Username</label></p>
|
||||
|
@ -25,7 +25,7 @@
|
|||
</div>
|
||||
|
||||
<div class="fields raised">
|
||||
<form method="post" class="">
|
||||
<form method="post" action="/account/settings/password">
|
||||
<input type="hidden" name="form" value="password">
|
||||
<div>
|
||||
<p class="heading"><label for="old_password">Current password</label></p>
|
||||
|
|
Loading…
Add table
Reference in a new issue