travis-web/app/models/repo.coffee
2015-12-17 12:39:17 +01:00

253 lines
7.1 KiB
CoffeeScript

`import ExpandableRecordArray from 'travis/utils/expandable-record-array'`
`import Model from 'travis/models/model'`
# 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'`
`import Config from 'travis/config/environment'`
Repo = null
if Config.useV3API
Repo = Model.extend
defaultBranch: DS.belongsTo('branch', async: false)
lastBuild: Ember.computed.oneWay('defaultBranch.lastBuild')
lastBuildFinishedAt: Ember.computed.oneWay('lastBuild.finishedAt')
lastBuildId: Ember.computed.oneWay('lastBuild.id')
lastBuildState: Ember.computed.oneWay('lastBuild.state')
lastBuildNumber: Ember.computed.oneWay('lastBuild.number')
lastBuildStartedAt: Ember.computed.oneWay('lastBuild.startedAt')
lastBuildDuration: Ember.computed.oneWay('lastBuild.duration')
else
Repo = Model.extend
lastBuildNumber: DS.attr('number')
lastBuildState: DS.attr()
lastBuildStartedAt: DS.attr()
lastBuildFinishedAt: DS.attr()
_lastBuildDuration: DS.attr('number')
lastBuildLanguage: DS.attr()
lastBuildId: DS.attr('number')
lastBuildHash: (->
{
id: @get('lastBuildId')
number: @get('lastBuildNumber')
repo: this
}
).property('lastBuildId', 'lastBuildNumber')
lastBuild: (->
if id = @get('lastBuildId')
@store.findRecord('build', id)
@store.recordForId('build', id)
).property('lastBuildId')
lastBuildDuration: (->
duration = @get('_lastBuildDuration')
duration = durationFromHelper(@get('lastBuildStartedAt'), @get('lastBuildFinishedAt')) unless duration
duration
).property('_lastBuildDuration', 'lastBuildStartedAt', 'lastBuildFinishedAt')
Repo.reopen
ajax: Ember.inject.service()
slug: DS.attr()
description: DS.attr()
private: DS.attr('boolean')
githubLanguage: DS.attr()
active: DS.attr()
withLastBuild: ->
@filter( (repo) -> repo.get('lastBuildId') )
sshKey: (->
@store.find('ssh_key', @get('id'))
@store.recordForId('ssh_key', @get('id'))
)
envVars: (->
id = @get('id')
@store.filter('env_var', { repository_id: id }, (v) ->
v.get('repo.id') == id
)
).property()
builds: (->
id = @get('id')
builds = @store.filter('build', event_type: ['push', 'api'], repository_id: id, (b) ->
b.get('repo.id')+'' == id+'' && (b.get('eventType') == 'push' || b.get('eventType') == 'api')
)
# TODO: move to controller
array = ExpandableRecordArray.create
type: 'build'
content: Ember.A([])
array.load(builds)
array.observe(builds)
array
).property()
pullRequests: (->
id = @get('id')
builds = @store.filter('build', event_type: 'pull_request', repository_id: id, (b) ->
b.get('repo.id')+'' == id+'' && b.get('eventType') == 'pull_request'
)
# TODO: move to controller
array = ExpandableRecordArray.create
type: 'build'
content: Ember.A([])
array.load(builds)
id = @get('id')
array.observe(builds)
array
).property()
branches: (->
builds = @store.query 'build', repository_id: @get('id'), branches: true
builds.then ->
builds.set 'isLoaded', true
builds
).property()
owner: (->
(@get('slug') || '').split('/')[0]
).property('slug')
name: (->
(@get('slug') || '').split('/')[1]
).property('slug')
sortOrderForLandingPage: (->
state = @get('lastBuildState')
if state != 'passed' && state != 'failed'
0
else
parseInt(@get('lastBuildId'))
).property('lastBuildId', 'lastBuildState')
stats: (->
if @get('slug')
@get('_stats') || $.get("https://api.github.com/repos/#{@get('slug')}", (data) =>
@set('_stats', data)
@notifyPropertyChange 'stats'
) && {}
).property('slug')
updateTimes: ->
if Config.useV3API
if lastBuild = @get('lastBuild')
lastBuild.updateTimes()
else
@notifyPropertyChange 'lastBuildDuration'
regenerateKey: (options) ->
@get('ajax').ajax '/repos/' + @get('id') + '/key', 'post', options
fetchSettings: ->
@get('ajax').ajax('/repos/' + @get('id') + '/settings', 'get', forceAuth: true).then (data) ->
data['settings']
saveSettings: (settings) ->
@get('ajax').ajax('/repos/' + @get('id') + '/settings', 'patch', data: { settings: settings })
Repo.reopenClass
recent: ->
@find()
accessibleBy: (store, reposIdsOrlogin) ->
if Config.useV3API
reposIds = reposIdsOrlogin
# this fires only for authenticated users and with API v3 that means getting
# only repos of currently logged in owner, but in the future it would be
# nice to not use that as it may change in the future
repos = store.filter('repo', (repo) ->
reposIds.indexOf(parseInt(repo.get('id'))) != -1
)
promise = new Ember.RSVP.Promise (resolve, reject) ->
store.query('repo', { 'repository.active': 'true', limit: 20 }).then( ->
resolve(repos)
, ->
reject()
)
promise
else
login = reposIdsOrlogin
store.find('repo', { member: login, orderBy: 'name' })
search: (store, ajax, query) ->
if Config.useV3API
queryString = $.param(search: query, orderBy: 'name', limit: 5)
promise = ajax.ajax("/repos?#{queryString}", 'get')
result = Ember.ArrayProxy.create(content: [])
promise.then (data, status, xhr) ->
promises = data.repos.map (repoData) ->
store.findRecord('repo', repoData.id).then (record) ->
result.pushObject(record)
result.set('isLoaded', true)
record
Ember.RSVP.allSettled(promises).then ->
result
else
store.find('repo', search: query, orderBy: 'name')
withLastBuild: (store) ->
repos = store.filter('repo', {}, (build) ->
build.get('lastBuildId')
)
repos.then () ->
repos.set('isLoaded', true)
repos
fetchBySlug: (store, slug) ->
repos = store.peekAll('repo').filterBy('slug', slug)
if repos.get('length') > 0
repos.get('firstObject')
else
promise = null
if Config.useV3API
adapter = store.adapterFor('repo')
modelClass = store.modelFor('repo')
promise = adapter.findRecord(store, modelClass, slug).then (payload) ->
serializer = store.serializerFor('repo')
modelClass = store.modelFor('repo')
result = serializer.normalizeResponse(store, modelClass, payload, null, 'findRecord')
repo = store.push(data: result.data)
for record in result.included
r = store.push(data: record)
repo
else
promise = store.find('repo', { slug: slug }).then (repos) ->
repos.get('firstObject') || throw("no repos found")
promise.catch ->
error = new Error('repo not found')
error.slug = slug
throw(error)
# buildURL: (slug) ->
# if slug then slug else 'repos'
`export default Repo`