added base account changes

This commit is contained in:
Artemis 2025-01-25 19:39:44 +01:00
parent 910a3d5845
commit 0c60a0dea2
5 changed files with 135 additions and 5 deletions

View file

@ -0,0 +1,2 @@
alter table users
add unique (username);

View file

@ -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)

View file

@ -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,

View file

@ -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)]

View file

@ -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>