@fabrix/spool-cart
Version:
Spool - eCommerce Spool for Fabrix
236 lines (235 loc) • 7.96 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const common_1 = require("@fabrix/fabrix/dist/common");
const spool_sequelize_1 = require("@fabrix/spool-sequelize");
const errors_1 = require("@fabrix/spool-sequelize/dist/errors");
const lodash_1 = require("lodash");
class VendorResolver extends spool_sequelize_1.SequelizeResolver {
resolve(vendor, options = {}) {
const VendorModel = this;
if (vendor instanceof VendorModel.instance) {
return Promise.resolve(vendor);
}
else if (vendor && lodash_1.isObject(vendor) && vendor.id) {
return VendorModel.findById(vendor.id, options)
.then(foundVendor => {
if (!foundVendor) {
throw new errors_1.ModelError('E_NOT_FOUND', `VendorModel ${vendor.id} not found`);
}
return foundVendor;
});
}
else if (vendor && lodash_1.isObject(vendor) && vendor.handle) {
return VendorModel.findOne(lodash_1.defaultsDeep({
where: {
handle: vendor.handle
}
}, options))
.then(resVendor => {
if (resVendor) {
return resVendor;
}
return VendorModel.create(vendor, { transaction: options.transaction || null });
});
}
else if (vendor && lodash_1.isObject(vendor) && vendor.name) {
return VendorModel.findOne(lodash_1.defaultsDeep({
where: {
name: vendor.name
}
}, options))
.then(resVendor => {
if (resVendor) {
return resVendor;
}
return VendorModel.create(vendor, { transaction: options.transaction || null });
});
}
else if (vendor && lodash_1.isNumber(vendor)) {
return VendorModel.findById(vendor, options)
.then(resVendor => {
if (!resVendor) {
throw new errors_1.ModelError('E_NOT_FOUND', `VendorModel ${vendor} not found`);
}
else {
return resVendor;
}
});
}
else if (vendor && lodash_1.isString(vendor)) {
return VendorModel.findOne(lodash_1.defaultsDeep({
where: {
$or: {
handle: vendor,
name: vendor
}
}
}, options))
.then(resVendor => {
if (!resVendor) {
throw new errors_1.ModelError('E_NOT_FOUND', `VendorModel ${vendor} not found`);
}
else {
return resVendor;
}
});
}
else {
const err = new Error(`Not able to resolve vendor ${vendor}`);
return Promise.reject(err);
}
}
transformVendors(vendors = [], options = {}) {
const VendorModel = this;
const Sequelize = VendorModel.sequelize;
vendors = vendors.map(vendor => {
if (vendor && lodash_1.isNumber(vendor)) {
vendor = {
id: vendor
};
return vendor;
}
else if (vendor && lodash_1.isString(vendor)) {
vendor = {
handle: this.app.services.ProxyCartService.handle(vendor),
name: vendor
};
return vendor;
}
else if (vendor && lodash_1.isObject(vendor)) {
vendor.handle = vendor.handle || this.app.services.ProxyCartService.handle(vendor.name);
return vendor;
}
});
vendors = vendors.filter(vendor => vendor);
return Sequelize.Promise.mapSeries(vendors, vendor => {
return VendorModel.findOne({
where: lodash_1.pick(vendor, ['id', 'handle']),
attributes: ['id', 'handle', 'name'],
transaction: options.transaction || null
})
.then(foundVendor => {
if (foundVendor) {
return lodash_1.extend(foundVendor, vendor);
}
else {
return VendorModel.create(vendor, {
transaction: options.transaction || null
});
}
});
});
}
transform(vendor) {
if (vendor && lodash_1.isObject(vendor)) {
vendor.handle = vendor.handle || this.app.services.ProxyCartService.handle(vendor.name);
return vendor;
}
else if (vendor && lodash_1.isString(vendor)) {
return {
handle: this.app.services.ProxyCartService.handle(vendor),
name: vendor
};
}
else {
return null;
}
}
reverseTransform(vendor) {
if (typeof vendor.name !== 'undefined') {
return vendor.name;
}
return vendor;
}
}
exports.VendorResolver = VendorResolver;
class Vendor extends common_1.FabrixModel {
static get resolver() {
return VendorResolver;
}
static config(app, Sequelize) {
return {
options: {
underscored: true,
scopes: {
live: {
where: {
live_mode: true
}
}
},
hooks: {
beforeValidate: [
(values, options) => {
if (!values.handle && values.name) {
values.handle = values.name;
}
}
]
}
}
};
}
static schema(app, Sequelize) {
return {
handle: {
type: Sequelize.STRING,
notNull: true,
unique: true,
set: function (val) {
this.setDataValue('handle', app.services.ProxyCartService.handle(val));
}
},
name: {
type: Sequelize.STRING,
notNull: true,
set: function (val) {
this.setDataValue('name', app.services.ProxyCartService.title(val));
}
},
website: {
type: Sequelize.STRING
},
phone: {
type: Sequelize.STRING
},
shipping_address_id: {
type: Sequelize.INTEGER
},
billing_address_id: {
type: Sequelize.INTEGER
},
live_mode: {
type: Sequelize.BOOLEAN,
defaultValue: app.config.get('cart.live_mode')
}
};
}
static associate(models) {
models.Vendor.belongsTo(models.Address, {
as: 'billing_address'
});
models.Vendor.belongsTo(models.Address, {
as: 'shipping_address'
});
models.Vendor.belongsToMany(models.Address, {
as: 'addresses',
foreignKey: 'model_id',
through: {
model: models.ItemAddress,
scope: {
model: 'vendor'
}
},
constraints: false
});
models.Vendor.belongsToMany(models.Product, {
as: 'products',
through: {
model: models.VendorProduct
},
foreignKey: 'vendor_id'
});
}
}
exports.Vendor = Vendor;