2019-02-15 17:56:56 +03:00
|
|
|
const { aliases: aliasesDb } = require('../utils/database/index');
|
2019-03-11 18:44:00 +03:00
|
|
|
const { binaryMD5 } = require('../utils/crypto');
|
2019-01-25 02:23:00 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @typedef {Object} AliasData
|
|
|
|
* @property {string} _id - alias id
|
|
|
|
* @property {string} hash - alias binary hash
|
|
|
|
* @property {string} type - entity type
|
|
|
|
* @property {boolean} deprecated - indicate if alias deprecated
|
|
|
|
* @property {string} id - entity id
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @class Alias
|
2019-01-25 06:19:37 +03:00
|
|
|
* @classdesc Alias model
|
|
|
|
*
|
2019-01-25 02:23:00 +03:00
|
|
|
* @property {string} _id - alias id
|
|
|
|
* @property {string} hash - alias binary hash
|
|
|
|
* @property {string} type - entity type
|
|
|
|
* @property {boolean} deprecated - indicate if alias deprecated
|
|
|
|
* @property {string} id - entity title
|
|
|
|
*/
|
|
|
|
class Alias {
|
|
|
|
/**
|
|
|
|
* Return Alias types
|
|
|
|
*
|
|
|
|
* @returns {Object}
|
|
|
|
*/
|
|
|
|
static get types() {
|
|
|
|
return {
|
|
|
|
PAGE: 'page'
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find and return alias with given alias
|
|
|
|
* @param {string} aliasName - alias of entity
|
|
|
|
* @returns {Promise<Alias>}
|
|
|
|
*/
|
|
|
|
static async get(aliasName) {
|
|
|
|
const hash = binaryMD5(aliasName);
|
2019-02-15 17:56:56 +03:00
|
|
|
let data = await aliasesDb.findOne({ hash: hash, deprecated: false });
|
2019-01-25 02:23:00 +03:00
|
|
|
|
|
|
|
if (!data) {
|
2019-02-15 17:56:56 +03:00
|
|
|
data = await aliasesDb.findOne({ hash: hash });
|
2019-01-25 02:23:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return new Alias(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @constructor
|
|
|
|
*
|
|
|
|
* @param {AliasData} data
|
|
|
|
* @param {string} aliasName - alias of entity
|
|
|
|
*/
|
|
|
|
constructor(data = {}, aliasName = '') {
|
|
|
|
if (data === null) {
|
|
|
|
data = {};
|
|
|
|
}
|
|
|
|
if (data._id) {
|
|
|
|
this._id = data._id;
|
|
|
|
}
|
|
|
|
if (aliasName) {
|
|
|
|
this.hash = binaryMD5(aliasName);
|
|
|
|
}
|
|
|
|
this.data = data;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Save or update alias data in the database
|
|
|
|
*
|
|
|
|
* @returns {Promise<Alias>}
|
|
|
|
*/
|
|
|
|
async save() {
|
|
|
|
if (!this._id) {
|
|
|
|
const insertedRow = await aliasesDb.insert(this.data);
|
|
|
|
|
|
|
|
this._id = insertedRow._id;
|
|
|
|
} else {
|
2019-02-15 17:56:56 +03:00
|
|
|
await aliasesDb.update({ _id: this._id }, this.data);
|
2019-01-25 02:23:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set AliasData object fields to internal model fields
|
|
|
|
*
|
|
|
|
* @param {AliasData} aliasData
|
|
|
|
*/
|
|
|
|
set data(aliasData) {
|
2019-02-15 17:56:56 +03:00
|
|
|
const { id, type, hash, deprecated } = aliasData;
|
2019-01-25 02:23:00 +03:00
|
|
|
|
|
|
|
this.id = id || this.id;
|
|
|
|
this.type = type || this.type;
|
|
|
|
this.hash = hash || this.hash;
|
|
|
|
this.deprecated = deprecated || false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return AliasData object
|
|
|
|
*
|
|
|
|
* @returns {AliasData}
|
|
|
|
*/
|
|
|
|
get data() {
|
|
|
|
return {
|
|
|
|
_id: this._id,
|
|
|
|
id: this.id,
|
|
|
|
type: this.type,
|
|
|
|
hash: this.hash,
|
|
|
|
deprecated: this.deprecated
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Mark alias as deprecated
|
|
|
|
* @param {string} aliasName - alias of entity
|
|
|
|
* @returns {Promise<Alias>}
|
|
|
|
*/
|
|
|
|
static async markAsDeprecated(aliasName) {
|
|
|
|
const alias = await Alias.get(aliasName);
|
|
|
|
|
|
|
|
alias.deprecated = true;
|
|
|
|
|
|
|
|
return alias.save();
|
|
|
|
}
|
2019-01-25 06:19:37 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @returns {Promise<Alias>}
|
|
|
|
*/
|
|
|
|
async destroy() {
|
2019-02-15 17:56:56 +03:00
|
|
|
await aliasesDb.remove({ _id: this._id });
|
2019-01-25 06:19:37 +03:00
|
|
|
|
|
|
|
delete this._id;
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
2019-01-25 02:23:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = Alias;
|