85 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { isAlphanumeric, isMongoId } from 'validator';
 | 
						|
import debug from 'debug';
 | 
						|
 | 
						|
const log = debug('fcc:models:promo');
 | 
						|
 | 
						|
export default function promo(Promo) {
 | 
						|
  Promo.getButton = function getButton(id, code, type = 'isNot') {
 | 
						|
    const Job = Promo.app.models.Job;
 | 
						|
    if (!id || !isMongoId('' + id)) {
 | 
						|
      return Promise.reject(new Error(
 | 
						|
        'Must include job id'
 | 
						|
      ));
 | 
						|
    }
 | 
						|
 | 
						|
    if (
 | 
						|
      !isAlphanumeric('' + code) &&
 | 
						|
      type &&
 | 
						|
      !isAlphanumeric('' + type)
 | 
						|
    ) {
 | 
						|
      return Promise.reject(new Error(
 | 
						|
        'Code or Type should be an alphanumeric'
 | 
						|
      ));
 | 
						|
    }
 | 
						|
 | 
						|
    const query = {
 | 
						|
      where: {
 | 
						|
        and: [{
 | 
						|
          code: type === 'isNot' ? type : 'isHighlighted'
 | 
						|
        },
 | 
						|
        {
 | 
						|
          type: type.replace(/^\$/g, '')
 | 
						|
        }]
 | 
						|
      }
 | 
						|
    };
 | 
						|
 | 
						|
    return Promo.findOne(query)
 | 
						|
      .then(function(promo) {
 | 
						|
        // turn promo model to plain js object;
 | 
						|
        promo = promo.toJSON();
 | 
						|
        return Job.updateAll({ id: id }, { promoCodeUsed: code })
 | 
						|
          .then(function({ count = 0 } = {}) {
 | 
						|
            log('job', count);
 | 
						|
            if (count) {
 | 
						|
              return {
 | 
						|
                ...promo,
 | 
						|
                name: `${code} Discount`
 | 
						|
              };
 | 
						|
            }
 | 
						|
            return Promise.reject(new Error(
 | 
						|
              `Job ${id} not found`
 | 
						|
            ));
 | 
						|
          });
 | 
						|
      });
 | 
						|
  };
 | 
						|
 | 
						|
  Promo.remoteMethod(
 | 
						|
    'getButton',
 | 
						|
    {
 | 
						|
      description: 'Get button id for promocode',
 | 
						|
      accepts: [
 | 
						|
        {
 | 
						|
          arg: 'id',
 | 
						|
          type: 'string',
 | 
						|
          required: true
 | 
						|
        },
 | 
						|
        {
 | 
						|
          arg: 'code',
 | 
						|
          type: 'string',
 | 
						|
          required: true
 | 
						|
        },
 | 
						|
        {
 | 
						|
          arg: 'type',
 | 
						|
          type: 'string'
 | 
						|
        }
 | 
						|
      ],
 | 
						|
      returns: [
 | 
						|
        {
 | 
						|
          arg: 'promo',
 | 
						|
          type: 'object'
 | 
						|
        }
 | 
						|
      ]
 | 
						|
    }
 | 
						|
  );
 | 
						|
}
 |