| 
									
										
										
										
											2016-03-13 18:04:24 -07:00
										 |  |  | import { isAlphanumeric, isMongoId } from 'validator'; | 
					
						
							| 
									
										
										
										
											2015-11-23 15:38:05 -08:00
										 |  |  | import debug from 'debug'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  | const log = debug('fcc:models:promo'); | 
					
						
							| 
									
										
										
										
											2015-10-25 14:26:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default function promo(Promo) { | 
					
						
							| 
									
										
										
										
											2015-11-23 15:38:05 -08:00
										 |  |  |   Promo.getButton = function getButton(id, code, type = 'isNot') { | 
					
						
							|  |  |  |     const Job = Promo.app.models.Job; | 
					
						
							| 
									
										
										
										
											2016-03-13 18:04:24 -07:00
										 |  |  |     if (!id || !isMongoId('' + id)) { | 
					
						
							| 
									
										
										
										
											2015-11-23 15:38:05 -08:00
										 |  |  |       return Promise.reject(new Error( | 
					
						
							|  |  |  |         'Must include job id' | 
					
						
							|  |  |  |       )); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-25 14:26:37 -07:00
										 |  |  |     if ( | 
					
						
							| 
									
										
										
										
											2016-03-13 18:04:24 -07:00
										 |  |  |       !isAlphanumeric('' + code) && | 
					
						
							| 
									
										
										
										
											2015-10-25 14:26:37 -07:00
										 |  |  |       type && | 
					
						
							| 
									
										
										
										
											2016-03-13 18:04:24 -07:00
										 |  |  |       !isAlphanumeric('' + type) | 
					
						
							| 
									
										
										
										
											2015-10-25 14:26:37 -07:00
										 |  |  |     ) { | 
					
						
							|  |  |  |       return Promise.reject(new Error( | 
					
						
							|  |  |  |         'Code or Type should be an alphanumeric' | 
					
						
							|  |  |  |       )); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const query = { | 
					
						
							|  |  |  |       where: { | 
					
						
							| 
									
										
										
										
											2015-11-23 15:38:05 -08:00
										 |  |  |         and: [{ | 
					
						
							|  |  |  |           code: type === 'isNot' ? type : 'isHighlighted' | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           type: type.replace(/^\$/g, '') | 
					
						
							|  |  |  |         }] | 
					
						
							| 
									
										
										
										
											2015-10-25 14:26:37 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-23 15:38:05 -08:00
										 |  |  |     return Promo.findOne(query) | 
					
						
							|  |  |  |       .then(function(promo) { | 
					
						
							| 
									
										
										
										
											2015-11-23 15:51:42 -08:00
										 |  |  |         // turn promo model to plain js object;
 | 
					
						
							|  |  |  |         promo = promo.toJSON(); | 
					
						
							| 
									
										
										
										
											2015-11-23 15:38:05 -08:00
										 |  |  |         return Job.updateAll({ id: id }, { promoCodeUsed: code }) | 
					
						
							|  |  |  |           .then(function({ count = 0 } = {}) { | 
					
						
							|  |  |  |             log('job', count); | 
					
						
							|  |  |  |             if (count) { | 
					
						
							| 
									
										
										
										
											2016-12-29 16:51:51 -08:00
										 |  |  |               return { | 
					
						
							|  |  |  |                 ...promo, | 
					
						
							|  |  |  |                 name: `${code} Discount` | 
					
						
							|  |  |  |               }; | 
					
						
							| 
									
										
										
										
											2015-11-23 15:38:05 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |             return Promise.reject(new Error( | 
					
						
							|  |  |  |               `Job ${id} not found` | 
					
						
							|  |  |  |             )); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-10-25 14:26:37 -07:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Promo.remoteMethod( | 
					
						
							|  |  |  |     'getButton', | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       description: 'Get button id for promocode', | 
					
						
							|  |  |  |       accepts: [ | 
					
						
							| 
									
										
										
										
											2015-11-23 15:38:05 -08:00
										 |  |  |         { | 
					
						
							|  |  |  |           arg: 'id', | 
					
						
							|  |  |  |           type: 'string', | 
					
						
							|  |  |  |           required: true | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-10-25 14:26:37 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |           arg: 'code', | 
					
						
							|  |  |  |           type: 'string', | 
					
						
							|  |  |  |           required: true | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           arg: 'type', | 
					
						
							|  |  |  |           type: 'string' | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       returns: [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           arg: 'promo', | 
					
						
							|  |  |  |           type: 'object' | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       ] | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | } |