Wallet/js/models/Profile.js
Matias Alejo Garcia c9a4046759 refactor Profile
2014-10-24 10:51:04 -03:00

123 lines
2.8 KiB
JavaScript

'use strict';
var preconditions = require('preconditions').singleton();
var _ = require('underscore');
var log = require('../log');
var bitcore = require('bitcore');
function Profile(info, storage) {
preconditions.checkArgument(info.email);
preconditions.checkArgument(info.hash);
preconditions.checkArgument(storage);
preconditions.checkArgument(storage.getItem);
this.hash = info.hash;
this.email = info.email;
this.extra = info.extra;
this.key = Profile.key(this.hash);
this.walletInfos = {};
this.storage = storage;
};
Profile.hash = function(email, password) {
return bitcore.util.sha256ripe160(email + password).toString('hex');
};
Profile.key = function(hash) {
return 'identity::' + hash;
};
Profile.open = function(email, password, storage, cb) {
preconditions.checkArgument(cb);
var key = Profile.key(Profile.hash(email, password));
storage.getGlobal(key, function(err, val) {
if (err) return cb(err);
if (!val)
return cb(new Error('PNOTFOUND: Profile not found'));
return cb(new Profile(val, storage));
});
};
Profile.prototype.toObj = function() {
return JSON.parse(JSON.stringify(this));
};
Profile.prototype.getWallet = function(walletId, cb) {
return this.walletInfos[walletId];
};
Profile.prototype.listWallets = function(opts, cb) {
return _.sortBy(this.walletInfos, function(winfo) {
return winfo.lastOpenedTs || winfo.createdTs;
});
};
Profile.prototype.deleteWallet = function(walletId, cb) {
if (!this.walletInfos[walletId])
return cb(new Error('WNOEXIST: Wallet not on profile'));
delete this.walletInfos[walletId];
this.store({
overwrite: true
}, cb);
};
Profile.prototype.addToWallet = function(walletId, info, cb) {
if (!this.walletInfos[walletId])
return cb(new Error('WNOEXIST: Wallet not on profile'));
this.walletInfos[walletId] = _.extend(this.walletInfos[walletId], info);
this.store({
overwrite: true
}, cb);
};
Profile.prototype.addWallet = function(walletId, info, cb) {
if (this.walletInfos[walletId])
return cb(new Error('WEXIST: Wallet already on profile'));
this.walletInfos[walletId] = _.extend(info, {
createdTs: Date.now(),
id: walletId
});
this.store({
overwrite: true
}, cb);
};
Profile.prototype.setLasOpenedTs = function(walletId, cb) {
return this.addToWallet(walletId, {
lastOpenedTs: Date.now()
}, cb);
};
Profile.prototype.store = function(opts, cb) {
var self = this;
var val = self.toObj();
var key = self.key;
self.storage.get(key, function(val2) {
if (val2 && !opts.overwrite) {
if (cb)
return cb(new Error('PEXISTS: Profile already exist'))
} else {
self.storage.set(key, val, function(err) {
log.debug('Identity stored');
if (cb)
cb(err);
});
}
});
};
module.exports = Profile;