From d3e1fa227439c084f29688faa4199818ee2243b7 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Thu, 27 Sep 2012 17:13:45 +0200 Subject: [PATCH] refactor auth/user/accounts --- Gemfile.lock | 16 ++++++++-------- assets/javascripts/app/app.coffee | 1 - assets/javascripts/app/auth.coffee | 8 ++++++-- .../javascripts/app/controllers/accounts.coffee | 2 +- assets/javascripts/app/models/user.coffee | 15 +++++---------- assets/javascripts/lib/travis/ajax.coffee | 5 +++-- assets/javascripts/vendor/ember-data.js | 12 ++++++------ assets/stylesheets/left/list.sass | 2 +- public/javascripts/application.js | 2 +- public/javascripts/vendor.js | 12 ++++++------ public/stylesheets/application.css | 4 ++-- 11 files changed, 39 insertions(+), 40 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0c0a188e..d6e2b210 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -34,15 +34,15 @@ GIT GIT remote: git://github.com/roidrage/hubble - revision: 8972b940a4f927927d2a4bdb250b3c98c04692a6 + revision: f5e6301ac24eabeebaf8f4485d71cdcf93b2f3f8 specs: hubble (0.1.2) faraday - json (~> 1.6.5) + json (~> 1.6) GIT remote: git://github.com/travis-ci/travis-api.git - revision: 228f71f407787f669d6d5ee731a2d5409918dc8e + revision: f2e8ccafc1efb0da8e14c2e03021d27dd1b40431 specs: travis-api (0.0.1) backports (~> 2.5) @@ -60,7 +60,7 @@ GIT GIT remote: git://github.com/travis-ci/travis-core.git - revision: a4b1446e3746a5ff59a5438a34f7b2471e33a731 + revision: 6d8de39fa098965aad52b51f8f9a3f5490e7def5 branch: sf-more-services specs: travis-core (0.0.1) @@ -155,10 +155,10 @@ GEM multi_json (~> 1.0) faraday (0.8.4) multipart-post (~> 1.1) - foreman (0.59.0) + foreman (0.60.0) thor (>= 0.13.6) fssm (0.2.9) - guard (1.3.3) + guard (1.4.0) listen (>= 0.4.2) thor (>= 0.14.6) hashr (0.0.22) @@ -166,7 +166,7 @@ GEM hitimes (1.1.1) i18n (0.6.1) journey (1.0.4) - json (1.6.7) + json (1.7.5) kgio (2.7.4) listen (0.5.2) mail (2.4.4) @@ -202,7 +202,7 @@ GEM rack rack-ssl (1.3.2) rack - rack-test (0.6.1) + rack-test (0.6.2) rack (>= 1.0) railties (3.2.8) actionpack (= 3.2.8) diff --git a/assets/javascripts/app/app.coffee b/assets/javascripts/app/app.coffee index e9896f25..62ec9b81 100644 --- a/assets/javascripts/app/app.coffee +++ b/assets/javascripts/app/app.coffee @@ -23,7 +23,6 @@ Travis.reopen App: Em.Application.extend autoinit: false currentUserBinding: 'auth.user' - accessTokenBinding: 'auth.user.accessToken' authStateBinding: 'auth.state' init: -> diff --git a/assets/javascripts/app/auth.coffee b/assets/javascripts/app/auth.coffee index 36efbc8c..ff5cbabf 100644 --- a/assets/javascripts/app/auth.coffee +++ b/assets/javascripts/app/auth.coffee @@ -9,6 +9,10 @@ window.addEventListener('message', (e) => @receiveMessage(e)) Ember.run.next(this, @loadUser) + accessToken: (-> + sessionStorage.getItem('travis.token') + ).property() + # if the user is in the session storage, we're using it. if we have a flag # for auto signin then we're trying to sign in. loadUser: -> @@ -45,11 +49,11 @@ @set('user', if user then user else undefined) storeUser: (data) -> - data.user.access_token ||= data.token # TODO why's the access_token not set on the user? localStorage?.setItem('travis.auto_signin', 'true') sessionStorage?.setItem('travis.user', JSON.stringify(data)) + sessionStorage?.setItem('travis.token', data.token) + @notifyPropertyChange('accessToken') @store.load(Travis.User, data.user) - @store.loadMany(Travis.Account, data.accounts) Travis.User.find(data.user.id) receiveMessage: (event) -> diff --git a/assets/javascripts/app/controllers/accounts.coffee b/assets/javascripts/app/controllers/accounts.coffee index a23d4427..cfe4fdb5 100644 --- a/assets/javascripts/app/controllers/accounts.coffee +++ b/assets/javascripts/app/controllers/accounts.coffee @@ -10,7 +10,7 @@ Travis.AccountsController = Ember.ArrayController.extend this["view#{$.camelize(tab)}"](params) viewAccounts: -> - @set('content', Travis.Account.filter()) + @set('content', Travis.Account.find()) findByLogin: (login) -> @find (account) -> account.get('login') == 'login' diff --git a/assets/javascripts/app/models/user.coffee b/assets/javascripts/app/models/user.coffee index a00a8af7..a2dc02c1 100644 --- a/assets/javascripts/app/models/user.coffee +++ b/assets/javascripts/app/models/user.coffee @@ -11,7 +11,6 @@ require 'travis/model' isSyncing: DS.attr('boolean') syncedAt: DS.attr('string') repoCount: DS.attr('number') - accessToken: DS.attr('string') init: -> @poll() if @get('isSyncing') @@ -30,12 +29,12 @@ require 'travis/model' ).property() sync: -> - @post('/profile/sync') + @post('/user/sync') @set('isSyncing', true) @poll() poll: -> - @ajax '/profile', 'get', success: (data) => + @ajax '/user', 'get', success: (data) => if data.user.is_syncing Ember.run.later(this, this.poll.bind(this), 3000) else @@ -47,10 +46,6 @@ require 'travis/model' setWithSession: (name, value) -> @set(name, value) - data = JSON.parse(sessionStorage?.getItem('travis.user')) - data.user[$.underscore(name)] = @get(name) - sessionStorage?.setItem('travis.user', JSON.stringify(data)) - - -@Travis.User.reopenClass - url: 'profile' + user = JSON.parse(sessionStorage?.getItem('travis.user')) + user[$.underscore(name)] = @get(name) + sessionStorage?.setItem('travis.user', JSON.stringify(user)) diff --git a/assets/javascripts/lib/travis/ajax.coffee b/assets/javascripts/lib/travis/ajax.coffee index 1b05ce5b..a89eab4e 100644 --- a/assets/javascripts/lib/travis/ajax.coffee +++ b/assets/javascripts/lib/travis/ajax.coffee @@ -9,12 +9,13 @@ jQuery.support.cors = true @ajax(url, 'post', data: data, success: callback) ajax: (url, method, options) -> + console.log(url) endpoint = Travis.config.api_endpoint || '' options = options || {} - if access_token = Travis.app?.get('accessToken') + if accessToken = Travis.app?.get('auth.accessToken') options.headers ||= {} - options.headers['Authorization'] ||= "token #{access_token}" + options.headers['Authorization'] ||= "token #{accessToken}" options.url = "#{endpoint}#{url}" options.type = method diff --git a/assets/javascripts/vendor/ember-data.js b/assets/javascripts/vendor/ember-data.js index 1252eb43..e86afd5d 100644 --- a/assets/javascripts/vendor/ember-data.js +++ b/assets/javascripts/vendor/ember-data.js @@ -3132,8 +3132,8 @@ DS.Model = Ember.Object.extend(Ember.Evented, { if (cachedValue) { var key = association.options.key || get(this, 'namingConvention').keyToJSONKey(name), ids = data.get(key) || []; - - var clientIds; + + var clientIds; if(association.options.embedded) { clientIds = store.loadMany(association.type, ids).clientIds; } else { @@ -3141,7 +3141,7 @@ DS.Model = Ember.Object.extend(Ember.Evented, { return store.clientIdForId(association.type, id); }); } - + set(cachedValue, 'content', Ember.A(clientIds)); cachedValue.fetch(); } @@ -3766,7 +3766,7 @@ DS.FixtureAdapter = DS.Adapter.extend({ return ids.indexOf(item.id) !== -1; }); } - + if (fixtures) { this.simulateRemoteCall(function() { store.loadMany(type, fixtures); @@ -3786,7 +3786,7 @@ DS.FixtureAdapter = DS.Adapter.extend({ findQuery: function(store, type, query, array) { var fixtures = this.fixturesForType(type); - + Ember.assert("Unable to find fixtures for model type "+type.toString(), !!fixtures); fixtures = this.queryFixtures(fixtures, query); @@ -3847,7 +3847,7 @@ var get = Ember.get, set = Ember.set; DS.RESTAdapter = DS.Adapter.extend({ bulkCommit: false, - + createRecord: function(store, type, record) { var root = this.rootForType(type); diff --git a/assets/stylesheets/left/list.sass b/assets/stylesheets/left/list.sass index 8f04b2d3..f196b77d 100644 --- a/assets/stylesheets/left/list.sass +++ b/assets/stylesheets/left/list.sass @@ -90,7 +90,7 @@ &.user background-image: inline-image('ui/user.png') background-position: 29px 18px - &.org + &.organization background-image: inline-image('ui/org.png') background-position: 24px 18px .summary diff --git a/public/javascripts/application.js b/public/javascripts/application.js index 855117e6..8d6ec91e 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -1 +1 @@ -minispade.register('templates', "(function() {Ember.TEMPLATES['application']=Ember.Handlebars.compile(\"{{! TODO apparently styles assume that there is more divs here...\\n I should fix that later }}\\n
\\n {{outlet}}\\n
\\n\\n\");Ember.TEMPLATES['builds/list']=Ember.Handlebars.compile(\"{{#if builds.isLoaded}}\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n \\n {{#each build in builds}}\\n {{#view Travis.BuildsItemView contextBinding=\\\"build\\\"}}\\n \\n \\n \\n \\n \\n \\n \\n {{/view}}\\n {{/each}}\\n \\n
{{t builds.name}}{{t builds.commit}}{{t builds.message}}{{t builds.duration}}{{t builds.finished_at}}
\\n \\n {{#if id}}\\n \\n {{number}}\\n \\n {{/if}}\\n \\n \\n {{formatCommit commit}}\\n \\n \\n {{{formatMessage commit.message short=\\\"true\\\"}}}\\n \\n {{formatDuration duration}}\\n \\n {{formatTime finishedAt}}\\n
\\n

\\n \\n

\\n{{else}}\\n
Loading
\\n{{/if}}\\n\");Ember.TEMPLATES['builds/show']=Ember.Handlebars.compile(\"{{#with view}}\\n {{#if build.isLoaded}}\\n
\\n
\\n
\\n
{{t builds.name}}
\\n
\\n \\n {{#if build.id}}\\n {{build.number}}\\n {{/if}}\\n
\\n
{{t builds.finished_at}}
\\n
{{formatTime build.finishedAt}}
\\n
{{t builds.duration}}
\\n
{{formatDuration build.duration}}
\\n
\\n\\n
\\n
{{t builds.commit}}
\\n
{{formatCommit build.commit}}
\\n {{#if commit.compareUrl}}\\n
{{t builds.compare}}
\\n
{{pathFrom build.commit.compareUrl}}
\\n {{/if}}\\n {{#if commit.authorName}}\\n
{{t builds.author}}
\\n
{{build.commit.authorName}}
\\n {{/if}}\\n {{#if commit.committerName}}\\n
{{t builds.committer}}
\\n
{{build.commit.committerName}}
\\n {{/if}}\\n
\\n\\n
{{t builds.message}}
\\n
{{{formatMessage build.commit.message}}}
\\n\\n {{#unless isMatrix}}\\n
{{t builds.config}}
\\n
{{formatConfig build.config}}
\\n {{/unless}}\\n
\\n
\\n\\n {{#if build.isMatrix}}\\n {{view Travis.JobsView jobsBinding=\\\"build.requiredJobs\\\" required=\\\"true\\\"}}\\n {{view Travis.JobsView jobsBinding=\\\"build.allowedFailureJobs\\\"}}\\n {{else}}\\n {{view Travis.LogView contextBinding=\\\"build.jobs.firstObject\\\"}}\\n {{/if}}\\n {{else}}\\n
\\n Loading\\n
\\n {{/if}}\\n{{/with}}\\n\");Ember.TEMPLATES['jobs/list']=Ember.Handlebars.compile(\"{{#if view.jobs.length}}\\n {{#if view.required}}\\n \\n \\n {{else}}\\n
\\n {{t jobs.build_matrix}}\\n
\\n \\n {{/if}}\\n \\n \\n {{#each key in view.build.configKeys}}\\n \\n {{/each}}\\n \\n \\n \\n {{#each job in view.jobs}}\\n {{#view Travis.JobsItemView contextBinding=\\\"job\\\"}}\\n \\n \\n \\n {{#each value in configValues}}\\n \\n {{/each}}\\n {{/view}}\\n {{/each}}\\n \\n
\\n {{t jobs.allowed_failures}}\\n \\n
{{key}}
\\n \\n {{#if job.id}}\\n {{number}}\\n {{/if}}\\n \\n {{formatDuration duration}}\\n \\n {{formatTime finishedAt}}\\n {{value}}
\\n\\n {{#unless view.required}}\\n
\\n

{{t \\\"jobs.allowed_failures\\\"}}

\\n

\\n Allowed Failures are items in your build matrix that are allowed to\\n fail without causing the entire build to be shown as failed.\\n

\\n

\\n You can define allowed failures in the build matrix as follows:\\n

\\n
matrix:\\n  allow_failures:\\n    - rvm: ruby-head
\\n

\\n This lets you add in experimental and preparatory builds to test against versions or\\n configurations that you are not ready to officially support.\\n

\\n
\\n {{/unless}}\\n{{/if}}\\n\");Ember.TEMPLATES['jobs/log']=Ember.Handlebars.compile(\"{{view.logSubscriber}}\\n\\n{{#if log.isLoaded}}\\n
\\n    \\n    \\n  {{{formatLog log.body}}}
\\n\\n {{#if sponsor.name}}\\n

\\n {{t builds.messages.sponsored_by}}\\n {{sponsor.name}}\\n

\\n {{/if}}\\n\\n To top\\n{{else}}\\n
\\n Loading\\n
\\n{{/if}}\\n\");Ember.TEMPLATES['jobs/show']=Ember.Handlebars.compile(\"{{#with view}}\\n {{#if job.isLoaded}}\\n
\\n
\\n
\\n
Job
\\n
\\n \\n {{#if job.id}}\\n {{job.number}}\\n {{/if}}\\n
\\n
{{t jobs.finished_at}}
\\n
{{formatTime job.finishedAt}}
\\n
{{t jobs.duration}}
\\n
{{formatDuration job.duration}}
\\n
\\n\\n
\\n
{{t jobs.commit}}
\\n
{{formatCommit commit}}
\\n {{#if commit.compareUrl}}\\n
{{t jobs.compare}}
\\n
{{pathFrom commit.compareUrl}}
\\n {{/if}}\\n {{#if commit.authorName}}\\n
{{t jobs.author}}
\\n
{{commit.authorName}}
\\n {{/if}}\\n {{#if commit.committerName}}\\n
{{t jobs.committer}}
\\n
{{commit.committerName}}
\\n {{/if}}\\n
\\n\\n
{{t jobs.message}}
\\n
{{formatMessage commit.message}}
\\n
{{t jobs.config}}
\\n
{{formatConfig job.config}}
\\n
\\n\\n {{view Travis.LogView contextBinding=\\\"job\\\"}}}\\n
\\n {{else}}\\n
\\n Loading\\n
\\n {{/if}}\\n{{/with}}\\n\");Ember.TEMPLATES['layouts/home']=Ember.Handlebars.compile(\"
\\n {{outlet top}}\\n
\\n\\n
\\n
\\n {{outlet left}}\\n
\\n\\n
\\n {{outlet main}}\\n
\\n\\n
\\n {{outlet right}}\\n
\\n
\\n\");Ember.TEMPLATES['layouts/profile']=Ember.Handlebars.compile(\"
\\n {{outlet top}}\\n
\\n\\n
\\n
\\n {{outlet left}}\\n
\\n\\n
\\n {{outlet main}}\\n
\\n\\n
\\n
\\n
 \\n
\\n\\n
\\n

Getting started?

\\n

\\n Please read our guide.\\n It will only take a few minutes :)\\n

\\n

\\n You can find detailled docs on our about site.\\n

\\n

\\n If you need help please don't hesitate to join\\n #travis on irc.freenode.net\\n or our mailinglist.\\n

\\n
\\n
\\n
\\n\");Ember.TEMPLATES['layouts/sidebar']=Ember.Handlebars.compile(\"\\n {{t layouts.application.fork_me}}\\n\\n\\n
\\n
 \\n
\\n\\n{{view view.DecksView}}\\n{{view view.WorkersView}}\\n{{view view.QueuesView}}\\n{{view view.LinksView}}\\n\\n
\\n

{{t layouts.about.join}}

\\n \\n
\\n\");Ember.TEMPLATES['layouts/simple']=Ember.Handlebars.compile(\"
\\n {{outlet top}}\\n
\\n\\n
\\n
\\n {{outlet main}}\\n
\\n
\\n\\n\");Ember.TEMPLATES['layouts/top']=Ember.Handlebars.compile(\"\\n

Travis

\\n
\\n\\n\\n\");Ember.TEMPLATES['profile/accounts']=Ember.Handlebars.compile(\"
\\n
\\n\\n\\n\\n
\\n {{#collection Travis.AccountsListView contentBinding=\\\"controller\\\"}}\\n {{view.name}}\\n

\\n Repositories:\\n {{view.content.reposCount}}\\n

\\n {{/collection}}\\n
\\n\");Ember.TEMPLATES['profile/show']=Ember.Handlebars.compile(\"

{{view.name}}

\\n\\n{{view Travis.ProfileTabsView}}\\n\\n
\\n {{outlet pane}}\\n
\\n\\n\");Ember.TEMPLATES['profile/tabs']=Ember.Handlebars.compile(\"\\n\");Ember.TEMPLATES['profile/tabs/hooks']=Ember.Handlebars.compile(\"

\\n {{{t profiles.show.message.your_repos}}}\\n

\\n\\n{{#if hooks.isLoaded}}\\n {{#if user.isSyncing}}\\n

\\n Please wait while we sync from GitHub\\n

\\n {{else}}\\n

\\n Last synchronized from GitHub: {{formatTime user.syncedAt}}\\n \\n

\\n\\n \\n {{/if}}\\n{{else}}\\n

\\n Loading\\n

\\n{{/if}}\\n\\n\\n\");Ember.TEMPLATES['profile/tabs/user']=Ember.Handlebars.compile(\"\\n\\n
\\n
\\n {{t profiles.show.github}}:\\n
\\n
\\n {{user.login}}\\n
\\n
\\n {{t profiles.show.email}}:\\n
\\n
\\n {{user.email}}\\n
\\n
\\n {{t profiles.show.token}}:\\n
\\n
\\n {{user.token}}\\n
\\n
\\n\\n
\\n {{view Ember.Select id=\\\"locale\\\"\\n contentBinding=\\\"view.locales\\\"\\n valueBinding=\\\"Travis.app.currentUser.locale\\\"\\n optionLabelPath=\\\"content.name\\\"\\n optionValuePath=\\\"content.key\\\"}}\\n\\n \\n
\\n\\n\\n\");Ember.TEMPLATES['queues/list']=Ember.Handlebars.compile(\"\\n\");Ember.TEMPLATES['repos/list']=Ember.Handlebars.compile(\"
\\n {{view Ember.TextField valueBinding=\\\"controller.search\\\"}}\\n
\\n\\n{{view Travis.ReposListTabsView}}\\n\\n\\n\\n
\\n {{#collection Travis.RepositoriesListView contentBinding=\\\"controller\\\"}}\\n {{#with view.repository}}\\n
\\n \\n {{#if slug}}\\n {{slug}}\\n {{/if}}\\n
\\n {{#if lastBuild.id}}\\n {{lastBuildNumber}}\\n {{/if}}\\n\\n

\\n {{t repositories.duration}}:\\n {{formatDuration lastBuildDuration}},\\n {{t repositories.finished_at}}:\\n {{formatTime lastBuildFinishedAt}}\\n

\\n\\n
\\n\\n {{#if description}}\\n
\\n

{{description}}

\\n
\\n {{/if}}\\n {{/with}}\\n {{/collection}}\\n
\\n\");Ember.TEMPLATES['repos/list/tabs']=Ember.Handlebars.compile(\"\\n\\n\");Ember.TEMPLATES['repos/show']=Ember.Handlebars.compile(\"
\\n {{#if view.repository.isLoaded}}\\n {{#with view.repository}}\\n

\\n {{slug}}\\n

\\n\\n

{{description}}

\\n\\n \\n\\n {{view Travis.RepoShowTabsView}}\\n {{view Travis.RepoShowToolsView}}\\n {{/with}}\\n\\n {{else}}\\n Loading\\n {{/if}}\\n\\n
\\n {{outlet pane}}\\n
\\n
\\n\\n\");Ember.TEMPLATES['repos/show/tabs']=Ember.Handlebars.compile(\"\\n\");Ember.TEMPLATES['repos/show/tools']=Ember.Handlebars.compile(\"
\\n \\n
\\n

\\n \\n {{#if view.branches.isLoaded}}\\n {{view Ember.Select contentBinding=\\\"view.branches\\\" selectionBinding=\\\"view.branch\\\" optionLabelPath=\\\"content.commit.branch\\\" optionValuePath=\\\"content.commit.branch\\\"}}\\n {{else}}\\n \\n {{/if}}\\n

\\n

\\n \\n \\n

\\n

\\n \\n \\n

\\n

\\n \\n \\n

\\n

\\n \\n \\n

\\n
\\n
\\n\");Ember.TEMPLATES['sponsors/decks']=Ember.Handlebars.compile(\"

{{t layouts.application.sponsers}}

\\n\\n\\n\\n

\\n \\n {{{t layouts.application.sponsors_link}}}\\n \\n

\\n\");Ember.TEMPLATES['sponsors/links']=Ember.Handlebars.compile(\"
\\n

{{t layouts.application.sponsers}}

\\n\\n \\n\\n

\\n \\n {{{t layouts.application.sponsors_link}}}\\n \\n

\\n
\\n\\n\");Ember.TEMPLATES['stats/show']=Ember.Handlebars.compile(\"
\\n
\\n\");Ember.TEMPLATES['workers/list']=Ember.Handlebars.compile(\"{{#view Travis.WorkersView}}\\n

\\n {{t workers}}\\n \\n

\\n \\n{{/view}}\\n\");\n})();\n//@ sourceURL=templates");minispade.register('app', "(function() {(function() {\nminispade.require('travis');\nminispade.require('auth');\nminispade.require('controllers');\nminispade.require('helpers');\nminispade.require('models');\nminispade.require('pusher');\nminispade.require('routes');\nminispade.require('slider');\nminispade.require('store');\nminispade.require('tailing');\nminispade.require('templates');\nminispade.require('views');\nminispade.require('config/locales');\nminispade.require('data/sponsors');\n\n Travis.reopen({\n App: Em.Application.extend({\n autoinit: false,\n currentUserBinding: 'auth.user',\n accessTokenBinding: 'auth.user.accessToken',\n authStateBinding: 'auth.state',\n init: function() {\n this._super.apply(this, arguments);\n this.store = Travis.Store.create();\n this.store.loadMany(Travis.Sponsor, Travis.SPONSORS);\n this.set('auth', Travis.Auth.create({\n store: this.store,\n endpoint: Travis.config.api_endpoint\n }));\n this.slider = new Travis.Slider();\n this.pusher = new Travis.Pusher();\n return this.tailing = new Travis.Tailing();\n },\n signIn: function() {\n return this.get('auth').signIn();\n },\n signOut: function() {\n return this.get('auth').signOut();\n },\n receive: function() {\n return this.store.receive.apply(this.store, arguments);\n },\n toggleSidebar: function() {\n var element;\n $('body').toggleClass('maximized');\n element = $('');\n $('#top .profile').append(element);\n Em.run.later((function() {\n return element.remove();\n }), 10);\n element = $('');\n $('#repository').append(element);\n return Em.run.later((function() {\n return element.remove();\n }), 10);\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=app");minispade.register('auth', "(function() {(function() {\n\n this.Travis.Auth = Ember.Object.extend({\n iframe: $('