travis-web/app/models/user.js
2016-01-04 13:15:15 +01:00

136 lines
3.3 KiB
JavaScript

import Ember from 'ember';
import Model from 'travis/models/model';
import config from 'travis/config/environment';
import DS from 'ember-data';
export default 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(),
token: DS.attr(),
gravatarId: DS.attr(),
isSyncing: DS.attr('boolean'),
syncedAt: DS.attr(),
repoCount: DS.attr('number'),
fullName: function() {
return this.get('name') || this.get('login');
}.property('name', 'login'),
isSyncingDidChange: function() {
return Ember.run.next(this, function() {
if (this.get('isSyncing')) {
return this.poll();
}
});
}.observes('isSyncing'),
urlGithub: function() {
return config.sourceEndpoint + "/" + (this.get('login'));
}.property(),
_rawPermissions: function() {
return this.get('ajax').get('/users/permissions');
}.property(),
permissions: function() {
var permissions;
permissions = Ember.ArrayProxy.create({
content: []
});
this.get('_rawPermissions').then((data) => {
return permissions.set('content', data.permissions);
});
return permissions;
}.property(),
adminPermissions: function() {
var permissions;
permissions = Ember.ArrayProxy.create({
content: []
});
this.get('_rawPermissions').then((data) => {
return permissions.set('content', data.admin);
});
return permissions;
}.property(),
pullPermissions: function() {
var permissions;
permissions = Ember.ArrayProxy.create({
content: []
});
this.get('_rawPermissions').then((data) => {
return permissions.set('content', data.pull);
});
return permissions;
}.property(),
pushPermissions: function() {
var permissions;
permissions = Ember.ArrayProxy.create({
content: []
});
this.get('_rawPermissions').then((data) => {
return permissions.set('content', data.push);
});
return permissions;
}.property(),
pushPermissionsPromise: function() {
return this.get('_rawPermissions').then((data) => {
return data.pull;
});
}.property(),
hasAccessToRepo(repo) {
var id, permissions;
id = repo.get ? repo.get('id') : repo;
if (permissions = this.get('permissions')) {
return permissions.contains(parseInt(id));
}
},
type: function() {
return 'user';
}.property(),
sync() {
var self;
self = this;
return this.get('ajax').post('/users/sync', {}, function() {
return self.setWithSession('isSyncing', true);
});
},
poll() {
return this.get('ajax').get('/users', (data) => {
var self;
if (data.user.is_syncing) {
self = this;
return setTimeout(function() {
return self.poll();
}, 3000);
} else {
this.set('isSyncing', false);
this.setWithSession('syncedAt', data.user.synced_at);
Travis.trigger('user:synced', data.user);
return this.store.query('account', {});
}
});
},
setWithSession(name, value) {
var user;
this.set(name, value);
user = JSON.parse(this.get('sessionStorage').getItem('travis.user'));
user[name.underscore()] = this.get(name);
return this.get('sessionStorage').setItem('travis.user', JSON.stringify(user));
}
});