feat: implement edit user / username

This commit is contained in:
Paul Makles
2022-02-03 22:52:04 +00:00
parent 1d5800a3b8
commit 63064cc9bb
4 changed files with 94 additions and 164 deletions

166
Cargo.lock generated
View File

@@ -1422,22 +1422,6 @@ dependencies = [
"want",
]
[[package]]
name = "hyper-rustls"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37743cc83e8ee85eacfce90f2f4102030d9ff0a95244098d781e9bee4a90abb6"
dependencies = [
"bytes 0.5.6",
"futures-util",
"hyper 0.13.10",
"log",
"rustls 0.18.1",
"tokio 0.2.25",
"tokio-rustls 0.14.1",
"webpki",
]
[[package]]
name = "hyper-tls"
version = "0.4.3"
@@ -1748,16 +1732,6 @@ version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
[[package]]
name = "mime_guess"
version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212"
dependencies = [
"mime",
"unicase",
]
[[package]]
name = "miniz_oxide"
version = "0.4.4"
@@ -1853,6 +1827,7 @@ version = "1.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd2a1cb6fd58c27e51ee650dca3b6924c4ce533dc0384f05b3219709ea1f1eb6"
dependencies = [
"async-std",
"async-trait",
"base64 0.11.0",
"bitflags",
@@ -1869,10 +1844,8 @@ dependencies = [
"pbkdf2",
"percent-encoding",
"rand 0.7.3",
"reqwest 0.10.10",
"rustls 0.17.0",
"serde",
"serde_bytes",
"serde_with",
"sha-1 0.9.8",
"sha2",
@@ -1889,7 +1862,7 @@ dependencies = [
"uuid",
"version_check",
"webpki",
"webpki-roots 0.21.1",
"webpki-roots",
]
[[package]]
@@ -1938,7 +1911,7 @@ dependencies = [
"uuid",
"version_check",
"webpki",
"webpki-roots 0.21.1",
"webpki-roots",
]
[[package]]
@@ -2753,7 +2726,7 @@ dependencies = [
[[package]]
name = "rauth"
version = "1.0.0"
source = "git+https://github.com/insertish/rauth?rev=157263ffcbd6cb1073e288b215db227634c4c29a#157263ffcbd6cb1073e288b215db227634c4c29a"
source = "git+https://github.com/insertish/rauth?rev=501d445e7b42a1c229bfa88c01fa6415f4cb7992#501d445e7b42a1c229bfa88c01fa6415f4cb7992"
dependencies = [
"async-std",
"base32",
@@ -2767,14 +2740,14 @@ dependencies = [
"nanoid",
"rand 0.8.4",
"regex",
"reqwest 0.11.4",
"reqwest",
"rocket",
"rust-argon2",
"serde",
"serde_json",
"totp-lite",
"ulid",
"validator 0.14.0",
"validator",
"wither",
]
@@ -2884,43 +2857,6 @@ dependencies = [
"winapi 0.3.9",
]
[[package]]
name = "reqwest"
version = "0.10.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c"
dependencies = [
"base64 0.13.0",
"bytes 0.5.6",
"encoding_rs",
"futures-core",
"futures-util",
"http",
"http-body 0.3.1",
"hyper 0.13.10",
"hyper-rustls",
"ipnet",
"js-sys",
"lazy_static",
"log",
"mime",
"mime_guess",
"percent-encoding",
"pin-project-lite 0.2.7",
"rustls 0.18.1",
"serde",
"serde_json",
"serde_urlencoded",
"tokio 0.2.25",
"tokio-rustls 0.14.1",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"webpki-roots 0.20.0",
"winreg 0.7.0",
]
[[package]]
name = "reqwest"
version = "0.11.4"
@@ -2998,7 +2934,7 @@ dependencies = [
"rauth",
"redis 0.21.2",
"regex",
"reqwest 0.11.4",
"reqwest",
"revolt-quark",
"rmp-serde",
"rocket",
@@ -3007,7 +2943,7 @@ dependencies = [
"serde_json",
"ulid",
"url",
"validator 0.11.0",
"validator",
"web-push",
]
@@ -3028,7 +2964,7 @@ dependencies = [
"rauth",
"rocket",
"serde",
"validator 0.14.0",
"validator",
]
[[package]]
@@ -3203,19 +3139,6 @@ dependencies = [
"webpki",
]
[[package]]
name = "rustls"
version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d1126dcf58e93cee7d098dbda643b5f92ed724f1f6a63007c1116eed6700c81"
dependencies = [
"base64 0.12.3",
"log",
"ring",
"sct",
"webpki",
]
[[package]]
name = "rustls"
version = "0.19.1"
@@ -3804,7 +3727,6 @@ dependencies = [
"lazy_static",
"memchr",
"mio 0.6.23",
"num_cpus",
"pin-project-lite 0.1.12",
"slab",
"tokio-macros 0.2.6",
@@ -3873,18 +3795,6 @@ dependencies = [
"webpki",
]
[[package]]
name = "tokio-rustls"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e12831b255bcfa39dc0436b01e19fea231a37db570686c06ee72c423479f889a"
dependencies = [
"futures-core",
"rustls 0.18.1",
"tokio 0.2.25",
"webpki",
]
[[package]]
name = "tokio-rustls"
version = "0.22.0"
@@ -4286,23 +4196,6 @@ dependencies = [
"serde",
]
[[package]]
name = "validator"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4effc922f18d14f3daf201b1d13c61e5ef62f5975e7d18df381f67badd76cfcd"
dependencies = [
"idna",
"lazy_static",
"regex",
"serde",
"serde_derive",
"serde_json",
"url",
"validator_derive 0.11.0",
"validator_types 0.11.0",
]
[[package]]
name = "validator"
version = "0.14.0"
@@ -4316,24 +4209,8 @@ dependencies = [
"serde_derive",
"serde_json",
"url",
"validator_derive 0.14.0",
"validator_types 0.14.0",
]
[[package]]
name = "validator_derive"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15529099583e8ce2b070ab6a637454a1b42c7146e6daee4a6817a82bee33bd41"
dependencies = [
"if_chain",
"lazy_static",
"proc-macro-error",
"proc-macro2",
"quote 1.0.9",
"regex",
"syn 1.0.76",
"validator_types 0.11.0",
"validator_derive",
"validator_types",
]
[[package]]
@@ -4349,15 +4226,9 @@ dependencies = [
"quote 1.0.9",
"regex",
"syn 1.0.76",
"validator_types 0.14.0",
"validator_types",
]
[[package]]
name = "validator_types"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "add324da7950ac1f76b1c16ce8b5406147953d5d6a2ac1c5da93785f2cfc738b"
[[package]]
name = "validator_types"
version = "0.14.0"
@@ -4531,15 +4402,6 @@ dependencies = [
"untrusted 0.7.1",
]
[[package]]
name = "webpki-roots"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f20dea7535251981a9670857150d571846545088359b28e4951d350bdaf179f"
dependencies = [
"webpki",
]
[[package]]
name = "webpki-roots"
version = "0.21.1"
@@ -4628,7 +4490,7 @@ dependencies = [
[[package]]
name = "wither"
version = "0.9.0"
source = "git+https://github.com/insertish/wither?branch=master#25226946ff9a2cafac390968b317df83eaafe31f"
source = "git+https://github.com/insertish/wither?rev=25226946ff9a2cafac390968b317df83eaafe31f#25226946ff9a2cafac390968b317df83eaafe31f"
dependencies = [
"async-trait",
"chrono",
@@ -4644,7 +4506,7 @@ dependencies = [
[[package]]
name = "wither_derive"
version = "0.9.0"
source = "git+https://github.com/insertish/wither?branch=master#25226946ff9a2cafac390968b317df83eaafe31f"
source = "git+https://github.com/insertish/wither?rev=25226946ff9a2cafac390968b317df83eaafe31f#25226946ff9a2cafac390968b317df83eaafe31f"
dependencies = [
"Inflector",
"async-trait",

View File

@@ -36,7 +36,7 @@ base64 = "0.13.0"
# serde
serde_json = "1.0.57"
serde = { version = "1.0.115", features = ["derive"] }
validator = { version = "0.11", features = ["derive"] }
validator = { version = "0.14", features = ["derive"] }
rmp-serde = { git = "https://github.com/insertish/msgpack-rust", rev = "5bf2c24203ad422233cf35b7b7bfad9f7e811814" }
# async
@@ -50,7 +50,7 @@ async-std = { version = "1.8.0", features = ["tokio1", "tokio02", "attributes"]
web-push = "0.7.2"
many-to-many = "0.1.2"
lettre = "0.10.0-alpha.4"
rauth = { git = "https://github.com/insertish/rauth", rev = "157263ffcbd6cb1073e288b215db227634c4c29a" }
rauth = { git = "https://github.com/insertish/rauth", rev = "501d445e7b42a1c229bfa88c01fa6415f4cb7992" }
hive_pubsub = { git = "https://gitlab.insrt.uk/insert/hive", rev = "b0f3db9d33990530d7640d4bbb309c8d9eb5c0cf", features = ["redis-backend"] }
# redis
@@ -61,7 +61,7 @@ mobc-redis = { version = "0.7.0", default-features = false, features = ["async-s
# web
async-tungstenite = { version = "0.10.0", features = ["async-std-runtime"] }
rocket = { version = "0.5.0-rc.1", default-features = false, features = ["json"] }
mongodb = { version = "1.2.2", features = ["tokio-runtime"], default-features = false }
mongodb = { version = "1.2.2", features = ["async-std-runtime"], default-features = false }
rocket_cors = { git = "https://github.com/lawliet89/rocket_cors", rev = "5843861a88958c16bfaa0b40f0d8910772bcd2f6" }
# quark

View File

@@ -18,9 +18,10 @@ pub struct Data {
pub async fn req(
db: &State<Database>,
account: Account,
user: User,
mut user: User,
data: Json<Data>,
) -> Result<EmptyResponse> {
let data = data.into_inner();
account.verify_password(&data.password).map_err(|_| Error::InvalidCredentials)?;
user.update_username(db, &data.username).await
user.update_username(db, data.username).await.map(|_| EmptyResponse)
}

View File

@@ -1,7 +1,10 @@
use revolt_quark::{EmptyResponse, Result, models::user::FieldsUser};
use revolt_quark::models::File;
use revolt_quark::{Error, Result, Database};
use revolt_quark::models::user::{FieldsUser, User, PartialUser};
use mongodb::bson::{doc, to_document};
use mongodb::bson::doc;
use revolt_quark::models::user::UserStatus;
use rocket::State;
use rocket::serde::json::Json;
use serde::{Deserialize, Serialize};
use validator::Validate;
@@ -18,16 +21,80 @@ pub struct UserProfileData {
#[derive(Validate, Serialize, Deserialize)]
pub struct Data {
// #[validate]
#[validate]
status: Option<UserStatus>,
#[validate]
profile: Option<UserProfileData>,
#[validate(length(min = 1, max = 128))]
avatar: Option<String>,
remove: Option<FieldsUser>,
#[validate(length(min = 1))]
remove: Option<Vec<FieldsUser>>,
}
#[patch("/<_ignore_id>", data = "<data>")]
pub async fn req(/*user: UserRef,*/ data: Json<Data>, _ignore_id: String) -> Result<EmptyResponse> {
todo!()
#[patch("/@me", data = "<data>")]
pub async fn req(db: &State<Database>, mut user: User, data: Json<Data>) -> Result<Json<User>> {
let data = data.into_inner();
data.validate().map_err(|error| Error::FailedValidation { error })?;
if data.status.is_none() && data.profile.is_none() && data.avatar.is_none() && data.remove.is_none() {
return Ok(Json(user))
}
if let Some(fields) = &data.remove {
if fields.contains(&FieldsUser::Avatar) {
if let Some(_avatar) = &user.avatar {
// TODO: delete the avatar
}
}
if fields.contains(&FieldsUser::ProfileBackground) {
if let Some(profile) = &user.profile {
if let Some(_background) = &profile.background {
// TODO: delete the background
}
}
}
for field in fields {
user.remove(field);
}
}
let mut partial: PartialUser = Default::default();
if let Some(avatar) = data.avatar {
partial.avatar = Some(File::use_avatar(db, &avatar, &user.id).await?);
user.avatar = partial.avatar.clone();
}
if let Some(status) = data.status {
let mut new_status = user.status.take().unwrap_or_default();
if let Some(text) = status.text {
new_status.text = Some(text);
}
if let Some(presence) = status.presence {
new_status.presence = Some(presence);
}
partial.status = Some(new_status);
user.status = partial.status.clone();
}
if let Some(profile) = data.profile {
let mut new_profile = user.profile.take().unwrap_or_default();
if let Some(content) = profile.content {
new_profile.content = Some(content);
}
if let Some(background) = profile.background {
new_profile.background = Some(File::use_background(db, &background, &user.id).await?);
}
partial.profile = Some(new_profile);
user.profile = partial.profile.clone();
}
db.update_user(&user.id, &partial, data.remove.unwrap_or_default()).await?;
Ok(Json(user))
}