UNPKG

xuanxuan

Version:

企业即时通讯平台

224 lines (203 loc) 5.36 kB
import UUID from 'uuid'; import SafeData from './safe-data'; import Helper from '../utils/helper'; /** * Default entity values converters * @type {Object} */ const defaultValuesConveter = { int: function(val) { if(typeof(val) !== 'number') { val = Number.parseInt(val); } return val; }, timestamp: function(val) { if(typeof(val) === 'string') { val = new Date(val).getTime(); } if(val < 10000000000) { val *= 1000; } return val; }, bool: function(val) { if(typeof(val) === 'string') { return val === '1' || val === 'true'; } return !!val; }, intSet: val => { if(val instanceof Set) { return val; } if(Array.isArray(val)) { return new Set(val); } let valType = typeof val; if(valType === 'string') { let set = new Set(); let arr = val.split(',').forEach(x => { x = Number.parseInt(x); if(x !== NaN) { set.add(x); } }); return set; } else if(valType === 'number') { return new Set([Math.floor(val)]); } else { if(DEBUG) console.warn('Value can not conver to a set.', val); } return null; }, 'set': val => { if(val instanceof Set) { return val; } if(Array.isArray(val)) { return new Set(val); } let valType = typeof val; if(valType === 'string') { let set = new Set(); let arr = val.split(',').forEach(x => { if(x !== '') set.add(x); }); return set; } else { return new Set(val); } } }; /** * Entity */ class Entity extends SafeData { constructor(data, valuesConverter) { super(); this.entityType = this.constructor.name; if(this._initValuesConverter) { this.setValuesConverter(this._initValuesConverter()); } this.assign(data); this.gid = this.gid || UUID.v4(); this._generateId(); } /** * Plain a object */ plain() { return Helper.plain(this); } /** * Get storage id * @return {Number} */ get id() { return this.remoteId; } /** * Set storage id * @param {Number} id * @return {Void} */ set id(id) { this.remoteId = defaultValuesConveter.int(id); } /** * Initial function to generate id attribute * @return {string} */ _generateId() { this._id = this.typeName + '/' + this.remoteId; } /** * Assign data to entity and convert values if necessary * @param {Object} data * @return {Void} */ assign(data) { if(!data) return; if(this.$.valuesConverter) { Object.keys(data).forEach(key => { if(key === 'id') return; let val = data[key] let converter = this.$.valuesConverter[key]; if(converter !== undefined) { if(typeof(converter) === 'string') { converter = Entity.defaultValuesConveter[converter]; } if(typeof(converter) === 'function') { val = converter(val); } else if(Array.isArray(converter)) { if(val === undefined || converter.indexOf(val) === -1) { val = converter[0]; } } } this[key] = val; }); if(this.$.valuesConverter.$global) { this.$.valuesConverter.$global(this); } } else { Object.assign(this, data); } if(data.id !== undefined) this.id = data.id; } /** * Get entity type name * @return {String} */ get typeName() { return this.entityType; } /** * Check the object is entity * @return {Boolean} */ get isEntity() { return true; } /** * Set values converter * @param {object} converter */ setValuesConverter(converter) { if(!this.$.valuesConverter) this.$.valuesConverter = {}; Object.assign(this.$.valuesConverter, converter); } /** * Get default values converters * @return {[type]} [description] */ static get defaultValuesConveter() { return defaultValuesConveter; } /** * Get the factory creator * @return {[type]} [description] */ static get as() { return this.creator; } /** * Create entity with the factory addCreator * @param {string} entityType * @param {object} * @return {Entity} */ static create(entityType, data) { return new this.creator[entityType](data); } /** * Add factor creator to Entity class * @param {object} creator */ static addCreator(creator) { if(!this.creator) this.creator = {}; Object.assign(this.creator, creator); } } export default Entity;