diff --git a/client/src/actions.jsx b/client/src/actions.jsx index 149dcb2a..1fde403a 100644 --- a/client/src/actions.jsx +++ b/client/src/actions.jsx @@ -16,6 +16,7 @@ export const setConstructs = value => ({ type: 'SET_CONSTRUCTS', value }); export const setConstructRename = value => ({ type: 'SET_CONSTRUCT_RENAME', value }); export const setGame = value => ({ type: 'SET_GAME', value }); export const setInfo = value => ({ type: 'SET_INFO', value }); +export const setEmail = value => ({ type: 'SET_EMAIL', value }); export const setInstance = value => ({ type: 'SET_INSTANCE', value }); export const setInstances = value => ({ type: 'SET_INSTANCES', value }); export const setItemEquip = value => ({ type: 'SET_ITEM_EQUIP', value }); diff --git a/client/src/components/account.management.jsx b/client/src/components/account.management.jsx index 9f5ae1ba..05a8b04b 100644 --- a/client/src/components/account.management.jsx +++ b/client/src/components/account.management.jsx @@ -12,6 +12,7 @@ const addState = connect( function receiveState(state) { const { account, + email, ping, ws, } = state; @@ -51,6 +52,7 @@ const addState = connect( return { account, ping, + email, logout, setPassword, setEmail, @@ -74,6 +76,7 @@ class AccountStatus extends Component { const { account, ping, + email, logout, setPassword, setEmail, @@ -105,9 +108,9 @@ class AccountStatus extends Component {
Recovery Email
-
{account.email ? account.email : 'No email set'}
+
{email ? email.email : 'No email set'}
Status
-
{account.email_confirmed ? 'Confirmed' : 'Unconfirmed'}
+
{email && email.confirmed ? 'Confirmed' : 'Unconfirmed'}
Result { +pub fn select(db: &Db, email: &String) -> Result { let query = " SELECT id, email, account, confirmed FROM emails @@ -127,7 +127,28 @@ pub fn select(db: &Db, email: &String) -> Result { let account: Uuid = row.get(2); let confirmed: bool = row.get(3); - return Ok(UserEmail { id, email, account, confirmed }); + return Ok(Email { id, email, account, confirmed }); +} + +pub fn select_account(db: &Db, account: Uuid) -> Result { + let query = " + SELECT id, email, account, confirmed + FROM emails + WHERE account = $1; + "; + + let result = db + .query(query, &[&account])?; + + let row = result.iter().next() + .ok_or(err_msg("email found"))?; + + let id: Uuid = row.get(0); + let email: String = row.get(1); + let account: Uuid = row.get(2); + let confirmed: bool = row.get(3); + + return Ok(Email { id, email, account, confirmed }); } pub fn set_recovery(tx: &mut Transaction, email: &String) -> Result { @@ -158,7 +179,7 @@ pub fn set_recovery(tx: &mut Transaction, email: &String) -> Result Result { +pub fn get_recovery(tx: &mut Transaction, recover_token: &String) -> Result { // set a new token when recovering to prevent multiple access let mut rng = thread_rng(); let new_token: String = iter::repeat(()) @@ -186,7 +207,7 @@ pub fn get_recovery(tx: &mut Transaction, recover_token: &String) -> Result Result<(Uuid, String), Error> { diff --git a/server/src/rpc.rs b/server/src/rpc.rs index 8320c313..7d596869 100644 --- a/server/src/rpc.rs +++ b/server/src/rpc.rs @@ -22,13 +22,15 @@ use game::{Game, game_state, game_skill, game_ready}; use instance::{Instance, instance_state, instance_practice, instance_ready}; use item::{Item, ItemInfoCtr, item_info}; use mtx; +use mail; +use mail::Email; use pg::{Db}; use pg::{PgPool}; use skill::{Skill, dev_resolve, Resolutions}; use vbox::{vbox_accept, vbox_apply, vbox_discard, vbox_combine, vbox_reclaim, vbox_unequip}; use http::{AUTH_CLEAR, TOKEN_HEADER}; -#[derive(Debug,Clone,Serialize,Deserialize)] +#[derive(Debug,Clone,Serialize)] pub enum RpcMessage { AccountState(Account), AccountConstructs(Vec), @@ -36,6 +38,7 @@ pub enum RpcMessage { AccountInstances(Vec), AccountShop(mtx::Shop), ConstructSpawn(Construct), + EmailState(Email), GameState(Game), ItemInfo(ItemInfoCtr), @@ -225,6 +228,15 @@ impl Handler for Connection { let db = self.pool.get().unwrap(); let mut tx = db.transaction().unwrap(); + // email state + match mail::select_account(&db, a.id) { + Ok(e) => { + self.ws.send(RpcMessage::EmailState(e.clone())).unwrap(); + self.events.send(Event::Subscribe(self.id, e.id)).unwrap(); + }, + Err(_) => (), + }; + // send account constructs let account_constructs = account::constructs(&mut tx, a).unwrap(); self.ws.send(RpcMessage::AccountConstructs(account_constructs)).unwrap();