UNPKG

kue-ui

Version:
167 lines (146 loc) 4.24 kB
import Ember from 'ember'; import config from '../config/environment'; import Notify from 'ember-notify'; // '/stats' // '/job/search' // '/jobs/:from..:to/:order?' // '/jobs/:type/:state/:from..:to/:order?' // '/jobs/:state/:from..:to/:order?' // '/job/types' // '/job/:id' // '/job/:id/log' // '/job/:id/state/:state' // '/job/:id/priority/:priority' // '/job/:id' // '/job' // http://localhost:3000/kue/job/3/state/delayed /** * Job model * @class Encapsulates the JSON API for `/jobs` */ var Job = Ember.Object.extend({ // Instance methods deleted: Ember.computed.alias('isDestroyed'), updateState: function(state) { var id = this.get('id'); state = state || this.get('state'); return Job._request({ method: 'PUT', url: `${config.apiURL}/job/${id}/state/${state}` }) .then(function(job) { Notify.success('Job state updated'); return job; }) .catch(function(err) { console.log('Job state update error', err); Notify.warning('Error updating job'); }); }, remove: function() { var id = this.get('id'); return Job._request({ method: 'DELETE', url: `${config.apiURL}/job/${id}/` }) .then(function() { Notify.success('Job deleted'); }) .catch(function(err) { console.log('Job remove error', err); Notify.warning('Error removing job'); }); } }); Job.reopenClass({ // Class methods STATES: Ember.A(['active', 'complete', 'delayed', 'failed', 'inactive']), /** * Request method * @param {Object} opts Options * @return {Object} Promise */ _request: function(opts={}) { return new Ember.RSVP.Promise((resolve, reject) => { Ember.$.ajax({ url: opts.url, data: opts.data, type: opts.method }) .success(resolve) .fail(reject); }); }, /** * Find jobs * @param {Object} opts Options * @return {Object} Promise */ find: function(opts={}) { var size = Number(opts.size) || 20; var page = Number(opts.page) || 1; var from = (page - 1) * size; var to = page * size ; console.log('find', opts); var url = `${config.apiURL}/${from}..${to}`; if(opts.type && opts.state) { url = `${config.apiURL}/jobs/${opts.type}/${opts.state}/${from}..${to}`; } else if(opts.type) { url = `${config.apiURL}/jobs/${opts.type}/${from}..${to}`; } else if(opts.state) { url = `${config.apiURL}/jobs/${opts.state}/${from}..${to}`; } if (opts.order) url += `/${opts.order}?`; return this._request({ data: opts.data || {}, method: 'GET', url: url }) .then( data => { if (Ember.isArray(data)) { return data.map( obj => Job.create(obj) ); } else { return Job.create(data); } }); }, /** * FindOne Job * @param {Object} opts={} Options * @return {Object} Promise */ findOne: function(opts={}) { return this._request({ method: 'GET', url: `${config.apiURL}/job/${opts.id}` }) .then(Job.create); }, /** * Fetch stats from the Jobs * @return {Object} Promise */ stats: function(opts={}) { var type = opts.type; var state = opts.state; var url = ''; if (!Ember.isEmpty(type) && !Ember.isEmpty(state)) { url = `${config.apiURL}/jobs/${type}/${state}/stats`; } else { url = `${config.apiURL}/stats`; } return this._request({ method: 'GET', url: url }); }, /** * Return all the job types * @return {Object} Promise */ types: function() { return this._request({ method: 'GET', url: `${config.apiURL}/job/types/` }); }, }); export default Job;