diff --git a/app/adapters/application.coffee b/app/adapters/application.coffee index 3ec51701..dea08e11 100644 --- a/app/adapters/application.coffee +++ b/app/adapters/application.coffee @@ -2,6 +2,8 @@ `import config from 'travis/config/environment'` Adapter = DS.ActiveModelAdapter.extend + auth: Ember.inject.service() + host: config.apiEndpoint coalesceFindRequests: true @@ -12,7 +14,7 @@ Adapter = DS.ActiveModelAdapter.extend hash.headers['accept'] = 'application/json; version=2' - if token = Travis.sessionStorage.getItem('travis.token') + if token = @get('auth').token() hash.headers['Authorization'] ||= "token #{token}" hash diff --git a/app/components/caches-item.coffee b/app/components/caches-item.coffee index c6fa0dbf..00c96a9a 100644 --- a/app/components/caches-item.coffee +++ b/app/components/caches-item.coffee @@ -1,7 +1,7 @@ `import Ember from 'ember'` -`import Ajax from 'travis/utils/ajax'` CachesItemComponent = Ember.Component.extend + ajax: Ember.inject.service() tagName: 'li' classNames: ['cache-item'] @@ -20,7 +20,7 @@ CachesItemComponent = Ember.Component.extend deletingDone = => @set('isDeleting', false) repo = @get('repo') - Ajax.ajax("/repos/#{repo.get('id')}/caches", "DELETE", data: data).then(deletingDone, deletingDone).then => + @get('ajax').ajax("/repos/#{repo.get('id')}/caches", "DELETE", data: data).then(deletingDone, deletingDone).then => @get('caches').removeObject(@get('cache')) diff --git a/app/components/no-builds.coffee b/app/components/no-builds.coffee index 57050edf..66e72d8a 100644 --- a/app/components/no-builds.coffee +++ b/app/components/no-builds.coffee @@ -1,10 +1,8 @@ `import Ember from 'ember'` -`import Ajax from 'travis/utils/ajax'` `import config from 'travis/config/environment'` NoBuildsComponent = Ember.Component.extend - - actions: + actions: triggerBuild: () -> @set('isLoading', true) apiEndpoint = config.apiEndpoint diff --git a/app/components/travis-status.coffee b/app/components/travis-status.coffee index 3ae86598..29269e19 100644 --- a/app/components/travis-status.coffee +++ b/app/components/travis-status.coffee @@ -1,5 +1,4 @@ `import Ember from 'ember'` -`import Ajax from 'travis/utils/ajax'` `import config from 'travis/config/environment'` TravisStatusComponent = Ember.Component.extend diff --git a/app/controllers/caches.coffee b/app/controllers/caches.coffee index e0c82195..9827c927 100644 --- a/app/controllers/caches.coffee +++ b/app/controllers/caches.coffee @@ -1,7 +1,8 @@ `import Ember from 'ember'` -`import Ajax from 'travis/utils/ajax'` Controller = Ember.Controller.extend + ajax: Ember.inject.service() + repoController: Ember.inject.controller('repo') repo: Ember.computed.alias('repoController.repo') @@ -21,7 +22,7 @@ Controller = Ember.Controller.extend deletingDone = => @set('isDeleting', false) repo = @get('repo') - Ajax.ajax("/repos/#{@get('repo.id')}/caches", "DELETE").then(deletingDone, deletingDone).then => + @get('ajax').ajax("/repos/#{@get('repo.id')}/caches", "DELETE").then(deletingDone, deletingDone).then => @set('model', {}) `export default Controller` diff --git a/app/controllers/owner.coffee b/app/controllers/owner.coffee index ca59030c..0f3970d3 100644 --- a/app/controllers/owner.coffee +++ b/app/controllers/owner.coffee @@ -1,5 +1,4 @@ `import Ember from 'ember'` -`import Ajax from 'travis/utils/ajax'` Controller = Ember.Controller.extend isLoading: false diff --git a/app/controllers/owner/repositories.coffee b/app/controllers/owner/repositories.coffee index e771a62a..cf07a5b0 100644 --- a/app/controllers/owner/repositories.coffee +++ b/app/controllers/owner/repositories.coffee @@ -1,5 +1,4 @@ `import Ember from 'ember'` -`import Ajax from 'travis/utils/ajax'` Controller = Ember.Controller.extend isLoading: false @@ -13,14 +12,13 @@ Controller = Ember.Controller.extend item ).sortBy('default_branch.last_build.finished_at').reverse() repos - ).property('model') # running: (-> # data = @get('model') - # repos = data.repositories.filter (item, index) -> - # if item.default_branch.last_build != null + # repos = data.repositories.filter (item, index) -> + # if item.default_branch.last_build != null # if item.default_branch.last_build.state == 'started' # item # repos diff --git a/app/controllers/owner/running.coffee b/app/controllers/owner/running.coffee index 33f2ac9f..3b170877 100644 --- a/app/controllers/owner/running.coffee +++ b/app/controllers/owner/running.coffee @@ -1,5 +1,4 @@ `import Ember from 'ember'` -`import Ajax from 'travis/utils/ajax'` Controller = Ember.Controller.extend isLoading: false diff --git a/app/initializers/auth.coffee b/app/initializers/auth.coffee index 5f18a20f..50e34625 100644 --- a/app/initializers/auth.coffee +++ b/app/initializers/auth.coffee @@ -1,16 +1,11 @@ -`import Auth from 'travis/utils/auth'` `import TestAuth from 'travis/utils/test-auth'` initialize = (container, app) -> - app.register 'auth:main', if Ember.testing then TestAuth else Auth - - app.inject('route', 'auth', 'auth:main') - app.inject('controller', 'auth', 'auth:main') - app.inject('application', 'auth', 'auth:main') - app.inject('component', 'auth', 'auth:main') - app.inject('service:flashes', 'auth', 'auth:main') - - app.inject('auth', 'store', 'service:store') + app.inject('route', 'auth', 'service:auth') + app.inject('controller', 'auth', 'service:auth') + app.inject('application', 'auth', 'service:auth') + app.inject('component', 'auth', 'service:auth') + app.inject('service:flashes', 'auth', 'service:auth') AuthInitializer = name: 'auth' diff --git a/app/initializers/pusher.coffee b/app/initializers/pusher.coffee index 857d2d41..920c3e88 100644 --- a/app/initializers/pusher.coffee +++ b/app/initializers/pusher.coffee @@ -2,12 +2,7 @@ `import TravisPusher from 'travis/utils/pusher'` initialize = (registry, application) -> - if config.pusher.key - application.pusher = new TravisPusher(config.pusher) - - application.register 'pusher:main', application.pusher, { instantiate: false } - - application.inject('route', 'pusher', 'pusher:main') + null PusherInitializer = name: 'pusher' diff --git a/app/initializers/services.coffee b/app/initializers/services.coffee index cb283735..ce0f365b 100644 --- a/app/initializers/services.coffee +++ b/app/initializers/services.coffee @@ -1,16 +1,11 @@ -`import Slider from 'travis/utils/slider'` `import Tailing from 'travis/utils/tailing'` `import ToTop from 'travis/utils/to-top'` `import config from 'travis/config/environment'` initialize = (container, application) -> - application.slider = new Slider(application.storage) application.tailing = new Tailing($(window), '#tail', '#log') application.toTop = new ToTop($(window), '.to-top', '#log-container') - application.register 'slider:main', application.slider, { instantiate: false } - application.inject('controller', 'slider', 'slider:main') - Initializer = name: 'services' initialize: initialize diff --git a/app/initializers/storage.coffee b/app/initializers/storage.coffee deleted file mode 100644 index f375e1e3..00000000 --- a/app/initializers/storage.coffee +++ /dev/null @@ -1,58 +0,0 @@ -`import Ember from 'ember'` - -Storage = Em.Object.extend - init: -> - @set('storage', {}) - key: (key) -> - "__#{key.replace('.', '__')}" - getItem: (k) -> - return @get("storage.#{@key(k)}") - setItem: (k,v) -> - @set("storage.#{@key(k)}", v) - removeItem: (k) -> - @setItem(k, null) - clear: -> - @set('storage', {}) - -sessionStorage = (-> - storage = null - try - # firefox will not throw error on access for sessionStorage var, - # you need to actually get something from session - window.sessionStorage.getItem('foo') - storage = window.sessionStorage - catch err - storage = Storage.create() - - storage -)() - -storage = (-> - storage = null - try - storage = window.localStorage || throw('no storage') - catch err - storage = Storage.create() - - storage -)() - -initialize = (container, application) -> - application.register 'storage:main', storage, { instantiate: false } - application.register 'sessionStorage:main', sessionStorage, { instantiate: false } - - application.inject('auth', 'storage', 'storage:main') - application.inject('auth', 'sessionStorage', 'sessionStorage:main') - - # I still use Travis.storage in some places which are not that easy to - # refactor - application.storage = storage - application.sessionStorage = sessionStorage - -StorageInitializer = - name: 'storage' - before: 'services' - initialize: initialize - -`export {initialize}` -`export default StorageInitializer` diff --git a/app/instance-initializers/pusher.coffee b/app/instance-initializers/pusher.coffee index b3e5c38e..a07b55fa 100644 --- a/app/instance-initializers/pusher.coffee +++ b/app/instance-initializers/pusher.coffee @@ -1,5 +1,17 @@ +`import config from 'travis/config/environment'` +`import TravisPusher from 'travis/utils/pusher'` + initialize = (data) -> - data.application.pusher.store = data.container.lookup('service:store') + application = data.application + + if config.pusher.key + application.pusher = new TravisPusher(config.pusher) + + application.register 'pusher:main', application.pusher, { instantiate: false } + + application.inject('route', 'pusher', 'pusher:main') + + application.pusher.store = data.container.lookup('service:store') PusherInitializer = name: 'pusher' diff --git a/app/models/build.coffee b/app/models/build.coffee index 621305bf..10f455ab 100644 --- a/app/models/build.coffee +++ b/app/models/build.coffee @@ -1,11 +1,12 @@ `import { durationFrom, configKeys, compact } from 'travis/utils/helpers'` -`import Ajax from 'travis/utils/ajax'` `import configKeysMap from 'travis/utils/keys-map'` `import Ember from 'ember'` `import Model from 'travis/models/model'` `import DurationCalculations from 'travis/utils/duration-calculations'` Build = Model.extend DurationCalculations, + ajax: Ember.inject.service() + state: DS.attr() number: DS.attr('number') branch: DS.attr('string') @@ -90,11 +91,11 @@ Build = Model.extend DurationCalculations, canRestart: Ember.computed.alias('isFinished') cancel: (-> - Ajax.post "/builds/#{@get('id')}/cancel" + @get('ajax').post "/builds/#{@get('id')}/cancel" ) restart: -> - Ajax.post "/builds/#{@get('id')}/restart" + @get('ajax').post "/builds/#{@get('id')}/restart" formattedFinishedAt: (-> if finishedAt = @get('finishedAt') diff --git a/app/models/job.coffee b/app/models/job.coffee index e72304e8..2c465693 100644 --- a/app/models/job.coffee +++ b/app/models/job.coffee @@ -1,5 +1,4 @@ `import { durationFrom, configKeys, compact } from 'travis/utils/helpers'` -`import Ajax from 'travis/utils/ajax'` `import configKeysMap from 'travis/utils/keys-map'` `import Ember from 'ember'` `import Model from 'travis/models/model'` @@ -7,6 +6,7 @@ `import DurationCalculations from 'travis/utils/duration-calculations'` Job = Model.extend DurationCalculations, + ajax: Ember.inject.service() logId: DS.attr() queue: DS.attr() @@ -30,7 +30,7 @@ Job = Model.extend DurationCalculations, log: ( -> @set('isLogAccessed', true) - Log.create(job: this) + Log.create(job: this, ajax: @get('ajax')) ).property() startedAt: (-> @@ -94,11 +94,11 @@ Job = Model.extend DurationCalculations, canRestart: Ember.computed.alias('isFinished') cancel: (-> - Ajax.post "/jobs/#{@get('id')}/cancel" + @get('ajax').post "/jobs/#{@get('id')}/cancel" ) removeLog: -> - Ajax.patch("/jobs/#{@get('id')}/log").then => + @get('ajax').patch("/jobs/#{@get('id')}/log").then => @reloadLog() reloadLog: -> @@ -106,7 +106,7 @@ Job = Model.extend DurationCalculations, @get('log').fetch() restart: -> - Ajax.post "/jobs/#{@get('id')}/restart" + @get('ajax').post "/jobs/#{@get('id')}/restart" appendLog: (part) -> @get('log').append part diff --git a/app/models/log.coffee b/app/models/log.coffee index f3c8e28c..1e58450f 100644 --- a/app/models/log.coffee +++ b/app/models/log.coffee @@ -9,7 +9,7 @@ Request = Ember.Object.extend accept: 'application/json; chunked=true; version=2, text/plain; version=2' run: -> - Ajax.ajax "/jobs/#{@id}/log?cors_hax=true", 'GET', + @get('ajax').ajax "/jobs/#{@id}/log?cors_hax=true", 'GET', dataType: 'text' headers: @HEADERS success: (body, status, xhr) => Ember.run(this, -> @handle(body, status, xhr)) @@ -50,7 +50,7 @@ Log = Ember.Object.extend data['part_numbers'] = partNumbers if partNumbers data['after'] = after if after - Ajax.ajax "/jobs/#{@get('job.id')}/log", 'GET', + @get('ajax').ajax "/jobs/#{@get('job.id')}/log", 'GET', dataType: 'json' headers: accept: 'application/json; chunked=true; version=2' @@ -81,7 +81,8 @@ Log = Ember.Object.extend @set('removed', true) @loadParts(json['log']['parts']) text: (text) => @loadText(text) - Request.create(id: id, handlers: handlers, log: this).run() if id = @get('job.id') + if id = @get('job.id') + Request.create(id: id, handlers: handlers, log: this, ajax: @get('ajax')).run() clear: -> @clearParts() diff --git a/app/models/repo.coffee b/app/models/repo.coffee index f463dab9..9fc2d8cc 100644 --- a/app/models/repo.coffee +++ b/app/models/repo.coffee @@ -1,12 +1,13 @@ `import ExpandableRecordArray from 'travis/utils/expandable-record-array'` `import Model from 'travis/models/model'` -`import Ajax from 'travis/utils/ajax'` # TODO: Investigate for some weird reason if I use durationFrom here not durationFromHelper, # the function stops being visible inside computed properties. `import { durationFrom as durationFromHelper } from 'travis/utils/helpers'` `import Build from 'travis/models/build'` Repo = Model.extend + ajax: Ember.inject.service() + slug: DS.attr() description: DS.attr() private: DS.attr('boolean') @@ -135,14 +136,14 @@ Repo = Model.extend @notifyPropertyChange 'lastBuildDuration' regenerateKey: (options) -> - Ajax.ajax '/repos/' + @get('id') + '/key', 'post', options + @get('ajax').ajax '/repos/' + @get('id') + '/key', 'post', options fetchSettings: -> - Ajax.ajax('/repos/' + @get('id') + '/settings', 'get', forceAuth: true).then (data) -> + @get('ajax').ajax('/repos/' + @get('id') + '/settings', 'get', forceAuth: true).then (data) -> data['settings'] saveSettings: (settings) -> - Ajax.ajax('/repos/' + @get('id') + '/settings', 'patch', data: { settings: settings }) + @get('ajax').ajax('/repos/' + @get('id') + '/settings', 'patch', data: { settings: settings }) Repo.reopenClass recent: -> diff --git a/app/models/user.coffee b/app/models/user.coffee index 10f11bde..910a6663 100644 --- a/app/models/user.coffee +++ b/app/models/user.coffee @@ -1,9 +1,13 @@ `import Ember from 'ember'` `import Model from 'travis/models/model'` -`import Ajax from 'travis/utils/ajax'` `import config from 'travis/config/environment'` User = Model.extend + ajax: Ember.inject.service() + + # TODO: this totally not should be needed here + sessionStorage: Ember.inject.service() + name: DS.attr() email: DS.attr() login: DS.attr() @@ -27,7 +31,7 @@ User = Model.extend ).property() _rawPermissions: (-> - Ajax.get('/users/permissions') + @get('ajax').get('/users/permissions') ).property() permissions: (-> @@ -72,12 +76,12 @@ User = Model.extend sync: -> self = this - Ajax.post('/users/sync', {}, -> + @get('ajax').post('/users/sync', {}, -> self.setWithSession('isSyncing', true) ) poll: -> - Ajax.get '/users', (data) => + @get('ajax').get '/users', (data) => if data.user.is_syncing self = this setTimeout -> @@ -92,8 +96,8 @@ User = Model.extend setWithSession: (name, value) -> @set(name, value) - user = JSON.parse(Travis.sessionStorage.getItem('travis.user')) + user = JSON.parse(@get('sessionStorage').getItem('travis.user')) user[name.underscore()] = @get(name) - Travis.sessionStorage.setItem('travis.user', JSON.stringify(user)) + @get('sessionStorage').setItem('travis.user', JSON.stringify(user)) `export default User` diff --git a/app/router.coffee b/app/router.coffee index d42fb3f1..fab55d51 100644 --- a/app/router.coffee +++ b/app/router.coffee @@ -13,7 +13,7 @@ Router = Ember.Router.extend # # we should probably think about a more general way to # do this, location should not know about auth status - Location.create(auth: @container.lookup('auth:main')) + Location.create(auth: @container.lookup('service:auth')) ).property() # TODO: this is needed, because in the original version diff --git a/app/routes/caches.coffee b/app/routes/caches.coffee index a792236f..753454f2 100644 --- a/app/routes/caches.coffee +++ b/app/routes/caches.coffee @@ -1,8 +1,9 @@ `import Ember from 'ember'` `import TravisRoute from 'travis/routes/basic'` -`import Ajax from 'travis/utils/ajax'` Route = TravisRoute.extend + ajax: Ember.inject.service() + needsAuth: true setupController: (controller) -> @_super.apply this, arguments @@ -10,7 +11,7 @@ Route = TravisRoute.extend model: -> repo = @modelFor('repo') - Ajax.get("/repos/#{repo.get('id')}/caches").then( (data) -> + @get('ajax').get("/repos/#{repo.get('id')}/caches").then( (data) -> caches = {} data["caches"].forEach (cacheData) -> diff --git a/app/routes/owner.coffee b/app/routes/owner.coffee index 926a6de7..98a6d17a 100644 --- a/app/routes/owner.coffee +++ b/app/routes/owner.coffee @@ -1,6 +1,5 @@ `import Ember from 'ember'` `import TravisRoute from 'travis/routes/basic'` -`import Ajax from 'travis/utils/ajax'` `import config from 'travis/config/environment'` Route = TravisRoute.extend diff --git a/app/routes/owner/repositories.coffee b/app/routes/owner/repositories.coffee index 38707fe1..8a647b9b 100644 --- a/app/routes/owner/repositories.coffee +++ b/app/routes/owner/repositories.coffee @@ -1,6 +1,5 @@ `import Ember from 'ember'` `import TravisRoute from 'travis/routes/basic'` -`import Ajax from 'travis/utils/ajax'` `import config from 'travis/config/environment'` Route = TravisRoute.extend diff --git a/app/routes/owner/running.coffee b/app/routes/owner/running.coffee index 11fca69b..47ed43a3 100644 --- a/app/routes/owner/running.coffee +++ b/app/routes/owner/running.coffee @@ -1,6 +1,5 @@ `import Ember from 'ember'` `import TravisRoute from 'travis/routes/basic'` -`import Ajax from 'travis/utils/ajax'` `import config from 'travis/config/environment'` Route = TravisRoute.extend diff --git a/app/routes/settings.coffee b/app/routes/settings.coffee index 0945c35e..628b4443 100644 --- a/app/routes/settings.coffee +++ b/app/routes/settings.coffee @@ -1,8 +1,9 @@ `import TravisRoute from 'travis/routes/basic'` -`import Ajax from 'travis/utils/ajax'` `import config from 'travis/config/environment'` Route = TravisRoute.extend + ajax: Ember.inject.service() + needsAuth: true setupController: (controller, model) -> @_super.apply(this, arguments) @@ -27,7 +28,7 @@ Route = TravisRoute.extend fetchSshKey: () -> repo = @modelFor('repo') - Ajax.get "/repos/#{repo.get('id')}/key", (data) => + @get('ajax').get "/repos/#{repo.get('id')}/key", (data) => Ember.Object.create(fingerprint: data.fingerprint) fetchRepositoryActiveFlag: -> diff --git a/app/routes/ssh-key.coffee b/app/routes/ssh-key.coffee index f97d323b..0657952d 100644 --- a/app/routes/ssh-key.coffee +++ b/app/routes/ssh-key.coffee @@ -1,8 +1,9 @@ `import Ember from 'ember'` -`import Ajax from 'travis/utils/ajax'` `import TravisRoute from 'travis/routes/basic'` Route = TravisRoute.extend + ajax: Ember.inject.service() + titleToken: 'Ssh Keys' model: (params) -> @@ -17,7 +18,7 @@ Route = TravisRoute.extend afterModel: (model, transition) -> repo = @modelFor('repo') - Ajax.get "/repos/#{repo.get('id')}/key", (data) => + @get('ajax').get "/repos/#{repo.get('id')}/key", (data) => @defaultKey = Ember.Object.create(fingerprint: data.fingerprint) setupController: (controller, model) -> diff --git a/app/utils/ajax.coffee b/app/services/ajax.coffee similarity index 96% rename from app/utils/ajax.coffee rename to app/services/ajax.coffee index dc8457d6..b52b0eb3 100644 --- a/app/utils/ajax.coffee +++ b/app/services/ajax.coffee @@ -7,7 +7,9 @@ default_options = accepts: json: 'application/json; version=2' -ajax = Em.Object.create +Ajax = Ember.Service.extend + auth: Ember.inject.service() + publicEndpoints: [/\/repos\/?.*/, /\/builds\/?.*/, /\/jobs\/?.*/] privateEndpoints: [/\/repos\/\d+\/caches/] @@ -42,8 +44,8 @@ ajax = Em.Object.create endpoint = config.apiEndpoint || '' options = options || {} - token = Travis.sessionStorage.getItem('travis.token') - if token && (ajax.needsAuth(method, url) || options.forceAuth) + token = Ember.get(this, 'auth').token() + if token && (@needsAuth(method, url) || options.forceAuth) options.headers ||= {} options.headers['Authorization'] ||= "token #{token}" @@ -66,9 +68,9 @@ ajax = Em.Object.create error = options.error || (->) options.error = (data, status, xhr) => + console.log "[ERROR] API responded with an error (#{status}): #{JSON.stringify(data)}" Travis.lookup('controller:flash').pushObject(data.flash) if data?.flash delete data.flash if data? - console.log "[ERROR] API responded with an error (#{status}): #{JSON.stringify(data)}" error.apply(this, arguments) options = $.extend(options, default_options) @@ -153,4 +155,4 @@ ajax = Em.Object.create return promise -`export default ajax` +`export default Ajax` diff --git a/app/utils/auth.coffee b/app/services/auth.coffee similarity index 82% rename from app/utils/auth.coffee rename to app/services/auth.coffee index 83f3fc41..416c30b9 100644 --- a/app/utils/auth.coffee +++ b/app/services/auth.coffee @@ -1,7 +1,11 @@ `import config from 'travis/config/environment'` -`import Ajax from 'travis/utils/ajax'` -Auth = Ember.Object.extend +Auth = Ember.Service.extend + store: Ember.inject.service(), + storage: Ember.inject.service(), + sessionStorage: Ember.inject.service(), + ajax: Ember.inject.service() + state: "signed-out" receivingEnd: "#{location.protocol}//#{location.host}" @@ -9,20 +13,20 @@ Auth = Ember.Object.extend window.addEventListener('message', (e) => @receiveMessage(e)) token: -> - Travis.sessionStorage.getItem('travis.token') + @get('sessionStorage').getItem('travis.token') endpoint: (-> config.apiEndpoint ).property(), signOut: -> - @storage.removeItem('travis.user') - @storage.removeItem('travis.token') - @sessionStorage.clear() + @get('storage').removeItem('travis.user') + @get('storage').removeItem('travis.token') + @get('sessionStorage').clear() @set('state', 'signed-out') @set('user', undefined) if user = @get('currentUser') - @store.unloadAll('user') + @get('store').unloadAll('user') @set('currentUser', null) @sendToApp('afterSignOut') Travis.trigger('user:signed_out') @@ -36,7 +40,7 @@ Auth = Ember.Object.extend $('