From 1fe2cd461dba7841c8c92cd3f490e76b0f28de0e Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Thu, 15 Aug 2019 22:18:50 +0300 Subject: [PATCH] feat(settings): add /settings get and update now supports only displayName change HOW-69 --- src/main.rs | 1 - src/models/user.rs | 11 ++++++++++- src/routes/account.rs | 46 +++++++++++++++++++++++++++++++++---------- src/views.rs | 8 ++++++++ 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index ed875a8..566b8eb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -61,7 +61,6 @@ fn run() -> Result<(), failure::Error> { fn create_server(db_url: String) -> Result<(), failure::Error> { env_logger::init(); use self::app_state::DbExecutor; - use actix_base::{SyncArbiter, System}; let cpus = num_cpus::get(); let system = System::new("htc-server"); diff --git a/src/models/user.rs b/src/models/user.rs index 617021c..6e183d3 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -1,5 +1,5 @@ use crate::schema::users; -use crate::views::{EncodableUserPrivate, EncodableUserPublic}; +use crate::views::{EncodableUserPrivate, EncodableUserPublic, UserSettings}; use diesel::prelude::*; #[derive(Queryable, Associations, Identifiable, Debug)] @@ -34,6 +34,15 @@ impl User { } } + pub fn encodable_settings(self) -> UserSettings { + let User { display_name, .. } = self; + + UserSettings { + display_name, + gravatar_email: None, + } + } + pub fn find_by_id(conn: &PgConnection, user_id: i32) -> Option { use crate::schema::users::dsl::*; diff --git a/src/routes/account.rs b/src/routes/account.rs index fe562db..176b408 100644 --- a/src/routes/account.rs +++ b/src/routes/account.rs @@ -32,22 +32,35 @@ pub fn create( .responder() } -fn update(state: State, update: Json) -> FutureResponse { - #[derive(Serialize)] - #[serde(rename_all = "camelCase")] - struct R { - user: views::EncodableUserPrivate, - } +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +struct Update { + display_name: Option, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct SettingsResponse { + settings: views::UserSettings, +} +fn update( + state: State, + auth: Auth, + update: Json, +) -> FutureResponse { state .pg - .send(update.0) + .send(AccountUpdate { + requester_id: auth.user.id, + display_name: update.display_name.clone(), + }) .from_err() .and_then(|res| match res { Ok(user) => Ok(answer_success!( Ok, - R { - user: user.encodable_private() + SettingsResponse { + settings: user.encodable_settings() } )), Err(err) => Ok(err.error_response()), @@ -55,6 +68,16 @@ fn update(state: State, update: Json) -> FutureResponse .responder() } +pub fn settings(auth: Auth) -> FutureResponse { + futures::future::ok(answer_success!( + Ok, + SettingsResponse { + settings: auth.user.encodable_settings() + } + )) + .responder() +} + /// POST /account/session pub fn login( login_data: Json, @@ -105,7 +128,10 @@ pub fn scope(scope: Scope) -> Scope { scope .resource("/", |r| { r.post().with(self::create); - r.get().with(self::update); + }) + .resource("/settings/", |r| { + r.get().with(self::settings); + r.put().with(self::update); }) .resource("/session/", |r| { r.post().with(self::login); diff --git a/src/views.rs b/src/views.rs index 90980b4..7ce437d 100644 --- a/src/views.rs +++ b/src/views.rs @@ -16,3 +16,11 @@ pub struct EncodableUserPublic { pub display_name: Option, pub id: i32, } + +/// User settings to communicate with frontend +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct UserSettings { + pub display_name: Option, + pub gravatar_email: Option, +}