import stampit from 'stampit';
import Request from './request';
import _ from 'lodash';
/**
* Wrapper around account endpoint. Meant to be used directly form {@link Syncano} instance.
* @constructor
* @type {Account}
* @example {@lang javascript}
* const {Account} = Syncano();
* Account.login({email: '', password: ''}).then((user) => {
*
* });
*/
const Account = stampit().compose(Request)
.props({
_account: {
registerPath: '/v1.1/account/register/',
loginPath: '/v1.1/account/auth/',
socialLoginPath: '/v1.1/account/auth/{backend}/',
updatePath: '/v1.1/account/',
activatePath: '/v1.1/account/activate/',
emailPath: '/v1.1/account/resend_email/',
resetKeyPath: '/v1.1/account/reset_key/',
changePasswordPath: '/v1.1/account/password/',
setPasswordPath: '/v1.1/account/password/set/',
resetPasswordPath: '/v1.1/account/password/reset/',
resetPasswordConfimPath: '/v1.1/account/password/reset/confirm/'
}
})
.methods({
/**
* A convenience method for getting the currently logged in user details.
* @memberOf Account
* @instance
* @returns {Promise}
*/
getUserDetails() {
const path = this._account.updatePath;
return this.makeRequest('GET', path);
},
/**
* A convenience method for activating an accoung.
* @memberOf Account
* @instance
* @param {Object} payload
* @param {String} payload.uid
* @param {String} payload.token
* @returns {Promise}
*/
activate(payload = {}) {
const path = this._account.activatePath;
return this.makeRequest('POST', path, {payload});
},
/**
* A convenience method for changing an accoung.
* @memberOf Account
* @instance
* @param {Object} payload
* @param {String} payload.current_password
* @param {String} payload.new_password
* @returns {Promise}
*/
changePassword(payload = {}) {
const path = this._account.changePasswordPath;
return this.makeRequest('POST', path, {payload})
},
/**
* A convenience method for resetting the password.
* @memberOf Account
* @instance
* @param {String} email
* @returns {Promise}
*/
resetPassword(email) {
const path = this._account.resetPasswordPath;
return this.makeRequest('POST', path, { payload: {email} });
},
/**
* A convenience method for confirming password reset.
* @memberOf Account
* @instance
* @param {Object} payload
* @param {String} payload.uid
* @param {String} payload.token
* @param {String} payload.new_password
* @returns {Promise}
*/
confirmPasswordReset(payload = {}) {
const path = this._account.resetPasswordConfimPath;
return this.makeRequest('POST', path, {payload});
},
/**
* A convenience method for setting the password.
* @memberOf Account
* @param {String} password
* @instance
* @returns {Promise}
*/
setPassword(password) {
const path = this._account.setPasswordPath;
return this.makeRequest('POST', path, { payload: {password} });
},
/**
* A convenience method for resetting the account key.
* @memberOf Account
* @instance
* @returns {Promise}
*/
resetKey() {
const path = this._account.resetKeyPath;
return this.makeRequest('POST', path);
},
/**
* A convenience method for creating a new account.
* @memberOf Account
* @instance
* @param {Object} payload
* @param {String} payload.email
* @param {String} payload.password
* @returns {Promise}
*/
register(payload = {}) {
const path = this._account.registerPath;
return this.makeRequest('POST', path, {payload});
},
/**
* A convenience method for authenticating with email and password.
* @memberOf Account
* @instance
* @param {Object} payload
* @param {String} payload.email
* @param {String} payload.password
* @param {Boolean} [setAccountKey = true]
* @returns {Promise}
*/
login(payload = {}, setAccountKey = true) {
const config = this.getConfig();
const path = this._account.loginPath;
return this.makeRequest('POST', path, {payload}).then((user) => {
if (setAccountKey === true) {
config.setAccountKey(user.account_key);
}
return user;
});
},
/**
* A convenience method for authenticating with a social media token.
* @memberOf Account
* @instance
* @param {String} backend
* @param {String} access_token
* @returns {Promise}
*/
socialLogin(backend, access_token) {
const path = _.replace(this._account.socialLoginPath, '{backend}', backend);
return this.makeRequest('POST', path, { payload: {access_token} });
},
/**
* A convenience method for resending email.
* @memberOf Account
* @instance
* @param {String} email
* @returns {Promise}
*/
resendEmail(email) {
const path = this._account.emailPath;
return this.makeRequest('POST', path, { payload: {email} });
},
/**
* A convenience method for updating your account details.
* @memberOf Account
* @instance
* @param {Object} payload
* @param {String} payload.first_name
* @param {String} payload.last_name
* @returns {Promise}
*/
update(payload = {}) {
const path = this._account.updatePath;
return this.makeRequest('PUT', path, {payload});
}
});
export default Account;