UNPKG

eris-boiler

Version:
110 lines (101 loc) 2.81 kB
class DatabaseObject { /** * Class representing a database object. * @param {DatabaseManager} databaseManager The DatabaseManager. * @param {string} type The type of this DatabaseObject. * @param {any} [data={}] The data to initialize this DataObject with. * @param {DatabaseObjectOptions} [options={}] The DatabaseObjectOptions. */ constructor (databaseManager, type, data = {}, { isNew = false } = {}) { /** * @type {DatabaseManager} * @private */ this._dbm = databaseManager /** * @type {string} */ this.type = type /** * @type {string} */ this.id = data.id /** * @type {any} * @private */ this._data = data /** * @type {boolean} * @private */ this._saveNeeded = isNew /** * @type {boolean} * @private */ this._isNew = isNew } /** * Get a value from the DatabaseObject. * @param {string} prop The name of the prop. * @returns {any} The value of the prop. */ get (prop) { return this._data[prop] } /** * Set a value of the DatabaseObject. * @param {string} prop The name of the prop. * @param {any} val The value to set. * @returns {DatabaseObject} The DatabaseObject. */ set (prop, val) { if (this._data[prop] !== val) { this._data[prop] = val this._saveNeeded = true } return this } /** * Get a simple object representation of the DatabaseObject. * @returns {any} The DatabaseObject as a normal object. */ toJSON () { return Object.assign({ objectType: this.type }, this._data) } /** * Delete this DatabaseObject record. * @returns {Promise<void>} */ delete () { return this._dbm.delete(this) } /** * Save the DatabaseObject record. * @param {any} [data={}] Any new data to write to the DatabaseObject before saving. * @returns {Promise<DatabaseObject>} The DatabaseObject. */ async save (data = {}) { for (const [ key, val ] of Object.entries(data)) { this.set(key, val) } if (this._saveNeeded) { Object.assign( this, await ( this._isNew ? this._dbm.add(this.type, this._data) : this._dbm.update(this) ).then((json) => this._dbm.newObject(this.type, json, false)) // sets this as a new DatabaseObject with the updated details ) // don't bother setting the boolean flags after as they will be at defaults. } return this } } module.exports = DatabaseObject /** * @typedef DatabaseObjectOptions * @property {boolean} [isNew=false] Whether or not to treat this as a new record. */