kelsin/coretheloothound

View on GitHub
app/models/raid.js

Summary

Maintainability
A
2 hrs
Test Coverage
import DS from 'ember-data';
import Ember from 'ember';
import Permissioned from './permissioned';

/* global moment */
export default Permissioned.extend({
  name: DS.attr('string'),
  date: DS.attr('date'),
  note: DS.attr('string'),
  account: DS.belongsTo('account', {
    async: false
  }),
  groups: DS.attr(),
  admin: DS.attr(),
  guild: DS.belongsTo('guild', {
    async: false
  }),
  signups: DS.hasMany('signup', {
    async: false
  }),
  finalized: DS.attr(),
  hidden: DS.attr(),

  moreThanOneGroup: Ember.computed('groups.number', function() {
    return this.get('groups.number') > 1;
  }),

  signedUpCharacterIds: Ember.computed('signups.[].character', function() {
    return this.get('signups').mapBy('character.id');
  }),

  hiddenAndNotFinalized: Ember.computed('hidden', 'finalized', function() {
    return this.get('hidden') && !this.get('finalized');
  }),

  dateAgo: Ember.computed('date', function() {
    return moment(this.get('date')).fromNow();
  }),

  dateCalendar: Ember.computed('date', function() {
    return moment(this.get('date')).format('ddd MMM Do');
  }),

  dateTime: Ember.computed('date', function() {
    return moment(this.get('date')).format('h:mm a');
  }),

  accountSignups: Ember.computed('signups.[].character', function() {
    return this.get('signups').mapBy('character.account.id').uniq().get('length');
  }),

  accountWaitingList: Ember.computed('waitingList.[].character', function() {
    return this.get('waitingList').mapBy('character.account.id').uniq().get('length');
  }),

  accountSeated: Ember.computed('seated.[].character', function() {
    return this.get('seated').mapBy('character.account.id').uniq().get('length');
  }),

  totalSlots: Ember.computed('groups', function() {
    var groups = this.get('groups');
    return groups.size * groups.number;
  }),

  className(class_id) {
    switch(class_id) {
    case 1: return 'Warrior';
    case 2: return 'Paladin';
    case 3: return 'Hunter';
    case 4: return 'Rogue';
    case 5: return 'Priest';
    case 6: return 'Death Knight';
    case 7: return 'Shaman';
    case 8: return 'Mage';
    case 9: return 'Warlock';
    case 10: return 'Monk';
    case 11: return 'Druid';
    default: return '';
    }
  },

  hasWaitingList: Ember.computed('waitingList.length', function() {
    return this.get('waitingList.length') > 0;
  }),

  hasSeated: Ember.computed('seated.length', function() {
    return this.get('seated.length') > 0;
  }),

  seatedUnsorted: Ember.computed.filterBy('signups', 'seated', true),
  seatedSortFields: ['name'],
  seated: Ember.computed.sort('seatedUnsorted', 'seatedSortFields'),
  unseated: Ember.computed.filterBy('signups', 'seated', false),

  // Waiting list doesn't include anyone from an account that has been seated
  waitingList: Ember.computed('seated.[].character', 'unseated.[].character', function() {
    var seated = this.get('seated');
    var unseated = this.get('unseated');
    var account_ids = seated.mapBy('character.account.id').uniq();
    return unseated.filter(function(signup) {
      return !account_ids.includes(signup.get('character.account.id'));
    }).sortBy('character.account.battletag');
  }),

  waitingListByAccount: Ember.computed('waitingList.[].account', function() {
    var _this = this;

    return this.get('waitingList').mapBy('character.account').uniq().map(function(account) {
      return Ember.Object.create({
        account: account,
        signups: _this.get('waitingList').filterBy('character.account.id', account.get('id')).sortBy('character.name')
      });
    });
  }),

  averageItemLevels: Ember.computed('seated.[].character', function() {
    var counts = {};
    var sums = {};
    var avgs = {total:undefined};

    this.get('seated').forEach(function(signup) {
      var roleSlug = signup.get('role.slug');
      var ilvl = signup.get('character.item_level');

      if (ilvl > 0) {
        counts.total = (counts.total || 0) + 1;
        counts[roleSlug] = (counts[roleSlug] || 0) + 1;

        sums.total = (sums.total || 0) + ilvl;
        sums[roleSlug] = (sums[roleSlug] || 0) + ilvl;
      }
    });

    Object.keys(sums).forEach(function(slug) {
      avgs[slug] = Math.round(sums[slug] / counts[slug]);
    });

    return avgs;
  })
});