trailpack-proxy-cart
Version:
eCommerce - Trailpack for Proxy Engine
261 lines (253 loc) • 8 kB
JavaScript
/* eslint no-console: [0] */
'use strict'
const Model = require('trails/model')
const Errors = require('proxy-engine-errors')
const _ = require('lodash')
/**
* @module Vendor
* @description Vendor Model
*/
module.exports = class Vendor extends Model {
static config (app, Sequelize) {
return {
options: {
underscored: true,
// defaultScope: {
// where: {
// live_mode: app.config.proxyEngine.live_mode
// }
// },
scopes: {
live: {
where: {
live_mode: true
}
}
},
hooks: {
beforeValidate(values, options) {
if (!values.handle && values.name) {
values.handle = values.name
}
}
},
classMethods: {
/**
* Associate the Model
* @param models
*/
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',
// otherKey: 'address_id',
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'
//constraints: false
})
},
resolve: function(vendor, options){
const Vendor = this
// const Sequelize = Vendor.sequelize
if (vendor instanceof Vendor){
return Promise.resolve(vendor)
}
else if (vendor && _.isObject(vendor) && vendor.id) {
return Vendor.findById(vendor.id, options)
.then(foundVendor => {
if (!foundVendor) {
throw new Errors.FoundError(Error(`Vendor ${vendor.id} not found`))
}
return foundVendor
})
}
else if (vendor && _.isObject(vendor) && vendor.handle) {
return Vendor.findOne(_.defaultsDeep({
where: {
handle: vendor.handle
}
}, options))
.then(resVendor => {
if (resVendor) {
return resVendor
}
return Vendor.create(vendor, { transaction: options.transaction || null})
})
}
else if (vendor && _.isObject(vendor) && vendor.name) {
return Vendor.findOne(_.defaultsDeep({
where: {
name: vendor.name
}
}, options))
.then(resVendor => {
if (resVendor) {
return resVendor
}
return Vendor.create(vendor, { transaction: options.transaction || null})
})
}
else if (vendor && _.isNumber(vendor)) {
return Vendor.findById(vendor, options)
.then(resVendor => {
if (!resVendor) {
throw new Errors.FoundError(Error(`Vendor ${vendor} not found`))
}
else {
return resVendor
}
})
}
else if (vendor && _.isString(vendor)) {
return Vendor.findOne(_.defaultsDeep({
where: {
$or: {
handle: vendor,
name: vendor
}
}
}, options))
.then(resVendor => {
if (!resVendor) {
throw new Errors.FoundError(Error(`Vendor ${vendor} not found`))
}
else {
return resVendor
}
})
}
else {
// TODO make Proper Error
const err = new Error(`Not able to resolve vendor ${vendor}`)
return Promise.reject(err)
}
},
transformVendors: (vendors, options) => {
options = options || {}
vendors = vendors || []
const Vendor = app.orm['Vendor']
const Sequelize = Vendor.sequelize
vendors = vendors.map(vendor => {
if (vendor && _.isNumber(vendor)) {
vendor = {
id: vendor
}
return vendor
}
else if (vendor && _.isString(vendor)) {
vendor = {
handle: app.services.ProxyCartService.handle(vendor),
name: vendor
}
return vendor
}
else if (vendor && _.isObject(vendor)) {
vendor.handle = vendor.handle || app.services.ProxyCartService.handle(vendor.name)
return vendor
}
})
vendors = vendors.filter(vendor => vendor)
return Sequelize.Promise.mapSeries(vendors, vendor => {
return Vendor.findOne({
where: _.pick(vendor,['id','handle']),
attributes: ['id', 'handle', 'name'],
transaction: options.transaction || null
})
.then(foundVendor => {
if (foundVendor) {
return _.extend(foundVendor, vendor)
}
else {
return Vendor.create(vendor, {
transaction: options.transaction || null
})
}
})
})
},
transform: function (vendor) {
if (vendor && _.isObject(vendor)) {
vendor.handle = vendor.handle || app.services.ProxyCartService.handle(vendor.name)
return vendor
}
else if (vendor && _.isString(vendor)) {
return {
handle: app.services.ProxyCartService.handle(vendor),
name: vendor
}
}
else {
return null
}
},
reverseTransform: function (vendor) {
if (typeof vendor.name !== 'undefined') {
return vendor.name
}
return vendor
}
}
}
}
}
static schema (app, Sequelize) {
return {
// The vendor handle
handle: {
type: Sequelize.STRING,
notNull: true,
unique: true,
set: function(val) {
this.setDataValue('handle', app.services.ProxyCartService.handle(val))
}
},
// The vendor's name
name: {
type: Sequelize.STRING,
notNull: true,
set: function(val) {
this.setDataValue('name', app.services.ProxyCartService.title(val))
}
},
// The vendor's website
website: {
type: Sequelize.STRING
},
// The vendor's Phone number
phone: {
type: Sequelize.STRING
},
// The id of the vendor's shipping address
shipping_address_id: {
type: Sequelize.INTEGER
},
// The id of the vendor's billing address
billing_address_id: {
type: Sequelize.INTEGER
},
// Live Mode
live_mode: {
type: Sequelize.BOOLEAN,
defaultValue: app.config.proxyEngine.live_mode
}
}
}
}