travis-web/app/store.coffee
Piotr Sarnacki 6f0eaf7091 Don't save data from pusher that won't likely be used
If user is logged in and doesn't keep 'recent repositories' tab opened, most of
the pusher events from 'common' channel are useless.

This commit introduces a logic to reject pusher events if:

  * recent tab hasn't been opened
  * user is signed in
  * Travis CI for open source is used
  * repository for a given event is not yet in store
  * repository for a given event is not part of current user's repositories
2015-02-05 10:57:36 +01:00

73 lines
2.3 KiB
CoffeeScript

`import DS from 'ember-data'`
`import config from 'travis/config/environment'`
Store = DS.Store.extend
defaultAdapter: 'application'
adapter: 'application'
receivePusherEvent: (event, data) ->
[name, type] = event.split(':')
auth = @container.lookup('auth:main')
if !@get('recentReposOpened') && event != 'job:log' && auth.get('signedIn') &&
!config.pro && !config.enterprise
# if recent repos hasn't been opened yet, we can safely
# drop any events that doesn't belong to repos owned by
# the logged in user and that aren't related to any
# repositories that are already opened
permissions = auth.get('permissions')
if name == 'job'
id = data.job.repository_id
else if name == 'build'
id = data.repository.id
return if !@hasRecordForId('repo', id) && !permissions.contains(id)
if name == 'job' && data.job?.commit
@pushPayload(commits: [data.job.commit])
if name == 'build' && data.build?.commit
# TODO: commit should be a sideload record on build, not mixed with it
build = data.build
commit = {
id: build.commit_id
author_email: build.author_email
author_name: build.author_name
branch: build.branch
committed_at: build.committed_at
committer_email: build.committer_email
committer_name: build.committer_name
compare_url: build.compare_url
message: build.message
sha: build.commit
}
delete(data.build.commit)
@pushPayload(commits: [commit])
if event == 'job:log'
data = data.job
job = @recordForId('job', data.id)
job.appendLog(number: parseInt(data.number), content: data._log, final: data.final)
else if data[name]
@_loadOne(name, data)
else
throw "can't load data for #{name}" unless type
_loadOne: (type, json) ->
payload = {}
payload[type.pluralize()] = [json[type]]
@pushPayload(payload)
# we get other types of records only in a few situations and
# it's not always needed to update data, so I'm specyfing which
# things I want to update here:
if type == 'build' && (json.repository || json.repo)
data = json.repository || json.repo
@pushPayload(repos: [data])
`export default Store`