@fabrix/spool-cart
Version:
Spool - eCommerce Spool for Fabrix
148 lines (147 loc) • 4.83 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const models_1 = require("@fabrix/spool-permissions/dist/api/models");
const models_2 = require("@fabrix/spool-notifications/dist/api/models");
const spool_sequelize_1 = require("@fabrix/spool-sequelize");
const lodash_1 = require("lodash");
class User extends models_2.User {
static config(app, Sequelize) {
return spool_sequelize_1.Utils.mergeConfig(models_2.User.config(app, Sequelize), {
options: {
underscored: true,
scopes: {
live: {
where: {
live_mode: true
}
}
},
hooks: {
afterCreate: [
(values, options) => {
return app.services.ProxyCartService.afterUserCreate(values, options)
.catch(err => {
return Promise.resolve(err);
});
}
]
},
getterMethods: {
full_name: function () {
if (this.first_name && this.last_name) {
return `${this.first_name} ${this.last_name}`;
}
else {
return null;
}
}
}
}
});
}
static schema(app, Sequelize) {
return spool_sequelize_1.Utils.mergeConfig(models_1.User.schema(app, Sequelize), {
accepts_marketing: {
type: Sequelize.BOOLEAN,
defaultValue: true
},
current_customer_id: {
type: Sequelize.INTEGER,
allowNull: true
},
current_cart_id: {
type: Sequelize.INTEGER,
allowNull: true
},
current_shop_id: {
type: Sequelize.INTEGER,
allowNull: true
},
first_name: {
type: Sequelize.STRING
},
last_name: {
type: Sequelize.STRING
},
phone: {
type: Sequelize.STRING
},
reason: {
type: Sequelize.STRING
},
live_mode: {
type: Sequelize.BOOLEAN,
defaultValue: app.config.get('cart.live_mode')
}
});
}
static associate(models) {
models_2.User.associate(models);
models.User.belongsToMany(models.Customer, {
as: 'customers',
through: {
model: models.CustomerUser,
unique: true
},
foreignKey: 'user_id'
});
models.User.hasMany(models.Order, {
as: 'orders',
foreignKey: 'user_id'
});
models.User.belongsTo(models.Customer, {
as: 'current_customer',
foreignKey: 'current_customer_id'
});
models.User.belongsTo(models.Cart, {
as: 'current_cart',
foreignKey: 'current_cart_id',
constraints: false
});
models.User.belongsTo(models.Shop, {
as: 'current_shop',
foreignKey: 'current_shop_id'
});
models.User.hasOne(models.Metadata, {
as: 'metadata',
foreignKey: 'user_id'
});
}
}
exports.User = User;
User.prototype.resolveMetadata = function (options = {}) {
if (this.metadata
&& this.metadata instanceof this.app.models['Metadata'].instance
&& options.reload !== true) {
return Promise.resolve(this);
}
else {
return this.getMetadata({ transaction: options.transaction || null })
.then(_metadata => {
_metadata = _metadata || { user_id: this.id };
this.metadata = _metadata;
this.setDataValue('metadata', _metadata);
this.set('metadata', _metadata);
return this;
});
}
};
User.prototype.toJSON = function () {
const resp = this instanceof this.app.models['User'].instance ? this.get({ plain: true }) : this;
if (resp.tags) {
resp.tags = resp.tags.map(tag => {
if (tag && lodash_1.isString(tag)) {
return tag;
}
else if (tag && tag.name) {
return tag.name;
}
});
}
if (resp.metadata) {
if (typeof resp.metadata.data !== 'undefined') {
resp.metadata = resp.metadata.data;
}
}
return resp;
};