UNPKG

@fabrix/spool-cart

Version:

Spool - eCommerce Spool for Fabrix

236 lines (235 loc) 7.96 kB
"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;