UNPKG

trailpack-proxy-cart

Version:

eCommerce - Trailpack for Proxy Engine

1,957 lines (1,803 loc) 53.3 kB
/* eslint no-console: [0] */ 'use strict' const Controller = require('trails/controller') const lib = require('../../lib') const Errors = require('proxy-engine-errors') const _ = require('lodash') /** * @module CustomerController * @description Customer Controller. */ // TODO lock down certain requests by Owner(s) module.exports = class CustomerController extends Controller { generalStats(req, res) { res.json({}) } /** * * @param req * @param res */ count(req, res){ const ProxyEngineService = this.app.services.ProxyEngineService ProxyEngineService.count('Customer') .then(count => { const counts = { customers: count } return res.json(counts) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ session(req, res) { if (!req.customer) { return res.sendStatus(401) } return this.app.services.ProxyPermissionsService.sanitizeResult(req, req.customer) .then(result => { return res.json(result) }) } /** * * @param req * @param res */ search(req, res) { const orm = this.app.orm const Customer = orm['Customer'] const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['last_name', 'ASC']] const term = req.query.term const where = this.app.services.ProxyEngineService.jsonCritera(req.query.where) const defaults = _.defaults(where, { $or: [ { first_name: { $iLike: `%${term}%` } }, { last_name: { $iLike: `%${term}%` } }, { email: { $iLike: `%${term}%` } }, { company: { $iLike: `%${term}%` } } ] }) Customer.findAndCount({ where: defaults, order: sort, offset: offset, req: req, limit: limit }) .then(customers => { // Paginate this.app.services.ProxyEngineService.paginate(res, customers.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, customers.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ findById(req, res){ const orm = this.app.orm const Customer = orm['Customer'] let id = req.params.id if (!id && req.customer) { id = req.customer.id } Customer.findByIdDefault(id, {}) .then(customer => { if (!customer) { throw new Errors.FoundError(Error(`Customer id ${id} not found`)) } return this.app.services.ProxyPermissionsService.sanitizeResult(req, customer) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ findByToken(req, res){ const orm = this.app.orm const Customer = orm['Customer'] let token = req.params.id if (!token && req.customer) { token = req.customer.token } Customer.findByTokenDefault(token, {}) .then(customer => { if (!customer) { throw new Errors.FoundError(Error(`Customer token ${token} not found`)) } return this.app.services.ProxyPermissionsService.sanitizeResult(req, customer) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ findAll(req, res){ const orm = this.app.orm const Customer = orm['Customer'] const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] const where = this.app.services.ProxyEngineService.jsonCritera(req.query.where) Customer.findAndCount({ order: sort, offset: offset, limit: limit, where: where }) .then(customers => { this.app.services.ProxyEngineService.paginate(res, customers.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, customers.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ findByTag(req, res) { const orm = this.app.orm const Customer = orm['Customer'] const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] Customer.findAndCountDefault({ where: { '$tags.name$': req.params.tag }, order: sort, offset: offset, req: req, include: [ { model: this.app.orm['Tag'], as: 'tags' } ] // limit: limit // TODO Sequelize breaks if a limit is here. }) .then(customers => { // Paginate this.app.services.ProxyEngineService.paginate(res, customers.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, customers.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ findByCollection(req, res) { const orm = this.app.orm const Customer = orm['Customer'] const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] Customer.findAndCountDefault({ where: { '$collections.handle$': req.params.handle }, include: [ { model: this.app.orm['Collection'], as: 'collections' } ], order: sort, offset: offset, req: req // limit: limit // TODO Sequelize breaks if a limit is here. }) .then(customers => { // Paginate this.app.services.ProxyEngineService.paginate(res, customers.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, customers.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ create(req, res) { // if (req.user && !req.body.owners) { // req.body.owners = [req.user] // } const CustomerService = this.app.services.CustomerService lib.Validator.validateCustomer.create(req.body) .then(values => { return CustomerService.create(req.body) }) .then(customer => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, customer) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } createAndLogin(req, res) { // if (req.user && !req.body.owners) { // req.body.owners = [req.user] // } const CustomerService = this.app.services.CustomerService lib.Validator.validateCustomer.create(req.body) .then(values => { return CustomerService.create(req.body) }) .then(customer => { return new Promise((resolve,reject) => { req.loginCustomer(customer, function (err) { if (err) { return reject(err) } return resolve(customer) }) }) }) .then(customer => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, customer) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ update(req, res) { const CustomerService = this.app.services.CustomerService let id = req.params.id if (!id && req.customer) { id = req.customer.id } if (!req.body) { req.body = {} } if (!req.body.id) { req.body.id = id } lib.Validator.validateCustomer.update(req.body) .then(values => { return CustomerService.update(req.body) }) .then(customer => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, customer) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } accountBalance(req, res) { const CustomerService = this.app.services.CustomerService const id = req.params.id if (!req.body) { req.body = {} } if (!req.body.id) { req.body.id = id } lib.Validator.validateCustomer.accountBalance(req.body) .then(values => { return CustomerService.accountBalance(req.body) }) .then(customer => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, customer) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * upload CSV * @param req * @param res */ uploadCSV(req, res) { const CustomerCsvService = this.app.services.CustomerCsvService const csv = req.file if (!csv) { const err = new Error('File failed to upload') return res.serverError(err) } CustomerCsvService.customerCsv(csv.path) .then(result => { return res.json({ file: req.file, result: result }) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ processUpload(req, res) { const CustomerCsvService = this.app.services.CustomerCsvService CustomerCsvService.processCustomerUpload(req.params.id) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ exportCustomers(req, res) { // } /** * * @param req * @param res */ login(req, res) { let customerId = req.params.id const Customer = this.app.orm['Customer'] if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id and a user in session are required') return res.send(401, err) } Customer.findById(customerId) .then(customer => { if (!customer) { throw new Error('Unexpected Error while authenticating customer') } return new Promise((resolve,reject) => { req.loginCustomer(customer, function (err) { if (err) { return reject(err) } return resolve(customer) }) }) }) .then(customer => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, customer) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ switchCustomer(req, res) { const customerId = req.params.id const Customer = this.app.orm['Customer'] const User = this.app.orm['User'] if (!customerId && !req.user) { const err = new Error('A customer id and a user in session are required') return res.send(401, err) } User.findById(req.user.id) .then(user => { user.current_customer_id = customerId return user.save() }) .then(user => { return Customer.findById(customerId) }) .then(customer => { return new Promise((resolve, reject) => { req.loginCustomer(customer, (err) => { if (err) { return reject(err) } return resolve(customer) }) }) }) .then(customer => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, customer) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ logout(req, res) { req.logoutCustomer() res.ok() } /** * * @param req * @param res */ account(req, res) { const Account = this.app.orm['Account'] const accountId = req.params.account let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !accountId || !req.user) { const err = new Error('A customer id and a user in session are required') res.send(401, err) } Account.findByIdDefault(accountId) .then(account => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, account) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ accounts(req, res) { const Account = this.app.orm['Account'] let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id and a user in session are required') return res.send(401, err) } const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] Account.findAndCount({ account: sort, where: { customer_id: customerId }, offset: offset, limit: limit }) .then(accounts => { // Paginate this.app.services.ProxyEngineService.paginate(res, accounts.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, accounts.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } // TODO addAccount(req, res){ } // TODO removeAccount(req, res){ } /** * * @param req * @param res */ // TODO updateAccount(req, res) { let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id and a user in session are required') return res.serverError(err) } } /** * * @param req * @param res */ accountSources(req, res) { const Source = this.app.orm['Source'] let customerId = req.params.id const accountId = req.params.account if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id and a user in session are required') return res.send(401, err) } const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] Source.findAndCount({ order: sort, where: { customer_id: customerId, account_id: accountId }, offset: offset, limit: limit }) .then(sources => { // Paginate this.app.services.ProxyEngineService.paginate(res, sources.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, sources.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ order(req, res) { const Order = this.app.orm['Order'] const orderId = req.params.order let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !orderId || !req.user) { const err = new Error('A customer id and a user in session are required') res.send(401, err) } Order.resolve(orderId) .then(order => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, order) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ orders(req, res) { const Order = this.app.orm['Order'] let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !req.user) { const err = new Error('A customer id and a user in session are required') return res.send(401, err) } const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] Order.findAndCount({ order: sort, where: { customer_id: customerId }, offset: offset, limit: limit }) .then(orders => { // Paginate this.app.services.ProxyEngineService.paginate(res, orders.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, orders.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ subscription(req, res) { const Subscription = this.app.orm['Subscription'] const subscriptionId = req.params.subscription let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !subscriptionId || !req.user) { const err = new Error('A customer id, subscription id, and a user in session are required') return res.forbidden(err) } Subscription.resolve(subscriptionId) .then(subscription => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, subscription) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res * @returns {*} */ subscriptionUpdate(req, res) { const SubscriptionService = this.app.services.SubscriptionService const subscriptionId = req.params.subscription let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !subscriptionId || !req.user) { const err = new Error('A customer id, subscription id, and a user in session are required') return res.forbidden(err) } if (!req.body) { req.body = {} } lib.Validator.validateSubscription.update(req.body) .then(values => { return SubscriptionService.update(req.body, subscriptionId) }) .then(subscription => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, subscription) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res * @returns {*} */ subscriptionActivate(req, res) { const SubscriptionService = this.app.services.SubscriptionService const subscriptionId = req.params.subscription let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !subscriptionId || !req.user) { const err = new Error('A customer id, subscription id, and a user in session are required') return res.forbidden(err) } lib.Validator.validateSubscription.activate(req.body) .then(values => { req.body.id = subscriptionId return SubscriptionService.activate(req.body, subscriptionId) }) .then(subscription => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, subscription) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res * @returns {*} */ subscriptionDeactivate(req, res) { const SubscriptionService = this.app.services.SubscriptionService const subscriptionId = req.params.subscription let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !subscriptionId || !req.user) { const err = new Error('A customer id, subscription id, and a user in session are required') return res.forbidden(err) } lib.Validator.validateSubscription.deactivate(req.body) .then(values => { req.body.id = subscriptionId return SubscriptionService.deactivate(req.body, subscriptionId) }) .then(subscription => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, subscription) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res * @returns {*} */ subscriptionRenew(req, res) { const SubscriptionService = this.app.services.SubscriptionService const subscriptionId = req.params.subscription let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !subscriptionId || !req.user) { const err = new Error('A customer id, subscription id, and a user in session are required') return res.forbidden(err) } SubscriptionService.renew(subscriptionId) .then(subscription => { if (!subscription) { throw new Error('Unexpected Error while renewing subscription') } return this.app.services.ProxyPermissionsService.sanitizeResult(req, subscription) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res * @returns {*} */ subscriptionCancel(req, res) { const SubscriptionService = this.app.services.SubscriptionService const subscriptionId = req.params.subscription let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !subscriptionId || !req.user) { const err = new Error('A customer id, subscription id, and a user in session are required') return res.forbidden(err) } lib.Validator.validateSubscription.cancel(req.body) .then(values => { return SubscriptionService.cancel(req.body, subscriptionId) }) .then(subscription => { if (!subscription) { throw new Error('Unexpected Error while Cancelling Subscription') } return this.app.services.ProxyPermissionsService.sanitizeResult(req, subscription) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ subscriptionAddItems(req, res) { const SubscriptionService = this.app.services.SubscriptionService const subscriptionId = req.params.subscription let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !subscriptionId || !req.user) { const err = new Error('A customer id, subscription id, and a user in session are required') return res.forbidden(err) } lib.Validator.validateSubscription.addItems(req.body) .then(values => { return SubscriptionService.addItems(req.body, subscriptionId) }) .then(subscription => { if (!subscription) { throw new Error('Unexpected Error while adding items') } return this.app.services.ProxyPermissionsService.sanitizeResult(req, subscription) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ subscriptionRemoveItems(req, res) { const SubscriptionService = this.app.services.SubscriptionService const subscriptionId = req.params.subscription let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !subscriptionId || !req.user) { const err = new Error('A customer id, subscription id, and a user in session are required') return res.forbidden(err) } lib.Validator.validateSubscription.removeItems(req.body) .then(values => { return SubscriptionService.removeItems(req.body, subscriptionId) }) .then(subscription => { if (!subscription) { throw new Error('Unexpected Error while removing items') } return this.app.services.ProxyPermissionsService.sanitizeResult(req, subscription) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ subscriptions(req, res) { const Subscription = this.app.orm['Subscription'] let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id and a user in session are required') return res.send(401,err) } const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] Subscription.findAndCount({ subscription: sort, where: { customer_id: customerId }, offset: offset, limit: limit }) .then(subscriptions => { this.app.services.ProxyEngineService.paginate(res, subscriptions.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, subscriptions.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ address(req, res) { const Address = this.app.orm['Address'] const addressId = req.params.address let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !addressId || !req.user) { const err = new Error('A customer id and a user in session are required') res.send(401, err) } Address.resolve(addressId) .then(address => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, address) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ addresses(req, res) { const Address = this.app.orm['Address'] let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id and a user in session are required') return res.send(401, err) } const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] Address.findAndCount({ order: sort, include: [{ model: this.app.orm['Customer'], attributes: [ 'id', 'shipping_address_id', 'billing_address_id', 'default_address_id' ], where: { id: customerId } }], offset: offset, limit: limit }) .then(addresses => { // Paginate this.app.services.ProxyEngineService.paginate(res, addresses.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, addresses.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ addAddress(req, res) { const CustomerService = this.app.services.CustomerService let customerId = req.params.id const addressId = req.params.address let type = null if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId) { const err = new Error('A customer id is required') return res.serverError(err) } if (!req.body.customer) { req.body.customer = {} } if (!req.body.address) { req.body.address = {} } if (req.body.shipping_address) { type = 'shipping' req.body.address = req.body.shipping_address delete req.body.shipping_address } else if (req.body.billing_address) { type = 'billing' req.body.address = req.body.billing_address delete req.body.billing_address } else if (req.body.default_address) { type = 'default' req.body.address = req.body.default_address delete req.body.default_address } // If an addressId param was passed, set it as the id if (addressId) { req.body.address.id = addressId } // Set body variables just in case req.body.customer.id = customerId lib.Validator.validateAddress.add(req.body.address) .then(values => { return CustomerService.addAddress(req.body.customer, req.body.address, type) }) .then(address => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, address) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ // TODO, resolve the address by id or token updateAddress(req, res) { const CustomerService = this.app.services.CustomerService const addressId = req.params.address let customerId = req.params.id let type = null if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !addressId) { const err = new Error('A customer id, and an address id are required') return res.serverError(err) } if (!req.body.customer) { req.body.customer = {} } if (!req.body.address) { req.body.address = {} } if (req.body.shipping_address) { type = 'shipping' req.body.address = req.body.shipping_address delete req.body.shipping_address } else if (req.body.billing_address) { type = 'billing' req.body.address = req.body.billing_address delete req.body.billing_address } else if (req.body.default_address) { type = 'default' req.body.address = req.body.default_address delete req.body.default_address } // Set body variables just in case req.body.customer.id = customerId if (addressId) { req.body.address.id = addressId } lib.Validator.validateAddress.update(req.body.address) .then(values => { return CustomerService.updateAddress(req.body.customer, req.body.address, type) }) .then(address => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, address) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ destroyAddress(req, res) { const CustomerService = this.app.services.CustomerService const addressId = req.params.address let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !addressId) { const err = new Error('A customer id, and address id are required') return res.serverError(err) } if (!req.body.customer) { req.body.customer = {} } if (!req.body.address) { req.body.address = {} } // Set body variables just in case req.body.customer.id = customerId if (addressId) { req.body.address.id = addressId } lib.Validator.validateAddress.remove(req.body.address) .then(values => { return CustomerService.removeAddress(req.body.customer, req.body.address) }) .then(address => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, address) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ source(req, res) { const Source = this.app.orm['Source'] const sourceId = req.params.source let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !sourceId || !req.user) { const err = new Error('A customer id and a user in session are required') res.send(401, err) } Source.resolve(sourceId) .then(source => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, source) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ sources(req, res) { const Source = this.app.orm['Source'] let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id and a user in session are required') return res.send(401, err) } const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] Source.findAndCount({ order: sort, where: { customer_id: customerId }, offset: offset, limit: limit }) .then(sources => { // Paginate this.app.services.ProxyEngineService.paginate(res, sources.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, sources.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ addSource(req, res) { const CustomerService = this.app.services.CustomerService // const source = req.params.source let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !req.user) { const err = new Error('A customer id and a user in session are required') return res.serverError(err) } if (!req.body.customer) { req.body.customer = {} } req.body.customer.id = customerId // req.body.source.id = source lib.Validator.validateSource.add(req.body.source) .then(values => { return CustomerService.createCustomerSource(req.body.customer, req.body.source) }) .then(source => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, source) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ updateSource(req, res) { const CustomerService = this.app.services.CustomerService const sourceId = req.params.source let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !req.user || !sourceId) { const err = new Error('A customer id, source id, and a user in session are required') return res.serverError(err) } if (!req.body.customer) { req.body.customer = {} } if (!req.body.source) { req.body.source = {} } // Set body variables just in case req.body.customer.id = customerId req.body.source.id = sourceId lib.Validator.validateSource.add(req.body.source) .then(values => { return CustomerService.updateCustomerSource(req.body.customer, req.body.source, req.body.source) }) .then(source => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, source) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ destroySource(req, res) { const CustomerService = this.app.services.CustomerService const sourceId = req.params.source let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !req.user || !sourceId) { const err = new Error('A customer id, source id, and a user in session are required') return res.serverError(err) } if (!req.body.customer) { req.body.customer = {} } if (!req.body.source) { req.body.source = {} } // Set body variables just in case req.body.customer.id = customerId req.body.source.id = sourceId lib.Validator.validateSource.remove(req.body.source) .then(values => { return CustomerService.removeCustomerSource(req.body.customer, req.body.source) }) .then(source => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, source) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ user(req, res) { const User = this.app.orm['User'] const userId = req.params.user let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId || !userId || !req.user) { const err = new Error('A customer id and a user in session are required') res.send(401, err) } User.findById(userId) .then(user => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, user) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ users(req, res) { const User = this.app.orm['User'] let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id or a user in session are required') return res.send(401, err) } const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] User.findAndCount({ // TODO fix for sqlite // order: sort, where: { '$customers.id$': customerId }, include: [{ model: this.app.orm['Customer'], as: 'customers', attributes: ['id'] }], offset: offset // TODO sequelize breaks if limit is set here // limit: limit }) .then(users => { // Paginate this.app.services.ProxyEngineService.paginate(res, users.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, users.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ addUser(req, res) { let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id or a user in session are required') return res.send(401, err) } const CustomerService = this.app.services.CustomerService CustomerService.addUser(customerId, req.body) .then(users => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, users) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ addUsers(req, res) { let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id or a user in session are required') return res.send(401, err) } const CustomerService = this.app.services.CustomerService CustomerService.addUsers(customerId, req.body) .then(users => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, users) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ addTag(req, res){ const CustomerService = this.app.services.CustomerService CustomerService.addTag(req.params.id, req.params.tag) .then(tag => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, tag) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } tags(req, res) { const Tag = this.app.orm['Tag'] let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id or a user in session are required') return res.send(401, err) } const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] Tag.findAndCount({ // TODO fix for sqlite include: [{ model: this.app.orm['Customer'], as: 'customers', attributes: ['id'], where: { id: customerId } }], offset: offset, // TODO sequelize breaks if limit is set here limit: limit, order: sort }) .then(tags => { // Paginate this.app.services.ProxyEngineService.paginate(res, tags.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, tags.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ removeTag(req, res){ const CustomerService = this.app.services.CustomerService CustomerService.removeTag(req.params.id, req.params.tag) .then(tag => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, tag) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * add a customer to a collection * @param req * @param res */ addCollection(req, res){ const CustomerService = this.app.services.CustomerService CustomerService.addCollection(req.params.id, req.params.collection) .then(collection => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, collection) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * add a customer to a collection * @param req * @param res */ addCollections(req, res){ const CustomerService = this.app.services.CustomerService CustomerService.addCollections(req.params.id, req.body) .then(collections => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, collections) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ collections(req, res) { const Collection = this.app.orm['Collection'] let customerId = req.params.id if (!customerId && req.user) { customerId = req.user.current_customer_id } if (!customerId && !req.user) { const err = new Error('A customer id or a collection in session are required') return res.send(401, err) } const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] Collection.findAndCount({ // TODO fix for sqlite include: [{ model: this.app.orm['Customer'], as: 'customers', attributes: ['id'], where: { id: customerId } }], offset: offset, // TODO sequelize breaks if limit is set here limit: limit, order: sort }) .then(collections => { // Paginate this.app.services.ProxyEngineService.paginate(res, collections.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, collections.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * remove a customer from a collection * @param req * @param res */ removeCollection(req, res){ const CustomerService = this.app.services.CustomerService CustomerService.removeCollection(req.params.id, req.params.collection) .then(collection => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, collection) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ discounts(req, res) { const Discount = this.app.orm['Discount'] const customerId = req.params.id const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] if (!customerId) { const err = new Error('A customer id is required') return res.send(401, err) } Discount.findAndCount({ include: [ { model: this.app.orm['Customer'], as: 'customers', where: { id: customerId } } ], order: sort, offset: offset, limit: limit }) .then(discounts => { // Paginate this.app.services.ProxyEngineService.paginate(res, discounts.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, discounts.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ event(req, res) { const Event = this.app.orm['Event'] const eventId = req.params.event const customerId = req.params.id if (!customerId || !eventId || !req.user) { const err = new Error('A customer id and a user in session are required') res.send(401, err) } Event.findById(eventId) .then(event => { return this.app.services.ProxyPermissionsService.sanitizeResult(req, event) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ events(req, res) { const Event = this.app.orm['Event'] const customerId = req.params.id if (!customerId && !req.user) { const err = new Error('A customer id and a user in session are required') return res.send(401, err) } const limit = Math.max(0,req.query.limit || 10) const offset = Math.max(0, req.query.offset || 0) const sort = req.query.sort || [['created_at', 'DESC']] Event.findAndCount({ order: sort, where: { object_id: customerId, object: 'customer' }, offset: offset, limit: limit }) .then(events => { // Paginate this.app.services.ProxyEngineService.paginate(res, events.count, limit, offset, sort) return this.app.services.ProxyPermissionsService.sanitizeResult(req, events.rows) }) .then(result => { return res.json(result) }) .catch(err => { return res.serverError(err) }) } /** * * @param req * @param res */ destroyEvent(req, res) { const Event = this.app.orm['Event'