253 lines
7.1 KiB
CoffeeScript
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`
|