Manual Reference Source Test

src/helpers/gamification/AwardedBadge.js

import AwardedBadgeModel from '../../models/gamification/AwardedBadge';
import UserService from '../../services/UserService';
import Helper from '../Helper';
import { aggregate } from '../../utilities/ClassUtility';

/**
 * Helper class representing an badge.
 *
 * @extends {AwardedBadgeModel}
 * @extends {Helper}
 *
 * @example
 * import { AwardedBadge, userService } from 'clinical6';
 *
 * // Typically use userService.getAwardedBadges()
 * userService.getAwardedBadges().then(badges => console.log(badges));
 *
 * const badge = new AwardedBadge({
 *   data: {
 *     id: '20',
 *     type: 'awarded_badges',
 *     attributes: {
 *       created_at: '2017-08-10T17:54:18Z',
 *       updated_at: '2017-08-10T17:54:18Z',
 *       count: 0,
 *       earned_on_date: null
 *     },
 *     relationships: {
 *       awardee: {
 *         data: {
 *           type: 'mobile_users',
 *           id: '510'
 *         }
 *       },
 *       badge: {
 *         data: {
 *           type: 'badges',
 *           id: '41'
 *         }
 *       }
 *     }
 *   },
 *   included: [
 *     {
 *       id: '41',
 *       type: 'badges',
 *       attributes: {
 *         created_at: '2017-08-09T16:23:56Z',
 *         updated_at: '2017-08-09T16:23:56Z',
 *         title: 'dummy_462',
 *         description: 'Demo Content info...',
 *         redemption_points: 250,
 *         image: {
 *           image: {
 *             url: '/uploads/test/reward/image/17/1.png',
 *             small: {
 *               url: '/uploads/test/reward/image/17/small_1.png'
 *             },
 *             small_hd: {
 *               url: '/uploads/test/reward/image/17/small_hd_1.png'
 *             },
 *             fullscreen: {
 *               url: '/uploads/test/reward/image/17/fullscreen_1.png'
 *             },
 *             main: {
 *               url: '/uploads/test/reward/image/17/main_1.png'
 *             },
 *             fullscreen_hd: {
 *               url: '/uploads/test/reward/image/17/fullscreen_hd_1.png'
 *             },
 *             main_hd: {
 *               url: '/uploads/test/reward/image/17/main_hd_1.png'
 *             }
 *           }
 *         },
 *         position: 1,
 *         enabled: true,
 *         featured: null,
 *         based_on: null,
 *         threshold: null,
 *         time_unit: null,
 *         start_point: null,
 *         start_at: null,
 *         disabled_image: {
 *           disabled_image: {
 *             url: '/default/default.png',
 *             small: {
 *               url: '/default/small_default.png'
 *             },
 *             small_hd: {
 *               url: '/default/small_hd_default.png'
 *             },
 *             fullscreen: {
 *               url: '/default/fullscreen_default.png'
 *             },
 *             main: {
 *               url: '/default/main_default.png'
 *             },
 *             fullscreen_hd: {
 *               url: '/default/fullscreen_hd_default.png'
 *             },
 *             main_hd: {
 *               url: '/default/main_hd_default.png'
 *             }
 *           }
 *         },
 *         cache_token: 'xMnLvzU_uu4'
 *       }
 *     }
 *   ]
 * });
 */
class AwardedBadge extends aggregate(AwardedBadgeModel, Helper) {
  /**
   * Constructor for helper class representing an AwardedBadge
   *
   * @param {Object} json - json api response from server
   */
  constructor(json = {}) {
    super(json);
    this.deserializeRelationshipStubs(json);
    this.syncRelationships(json);
  }

  /** @type {String}  - The type */
  static get type() {
    return 'awarded_badges';
  }

  /** @type {User} */
  get awardee() {
    return this._relationships.awardee;
  }

  /** @type {User} */
  set awardee(awardee) {
    /** @type {User} */
    this._relationships.awardee = awardee;
  }

  /** @type {Badge} */
  get badge() {
    return this._relationships.badge;
  }

  /** @type {Badge} */
  set badge(badge) {
    /** @type {Badge} */
    this._relationships.badge = badge;
  }

  /**
   * Saves an awarded badge (insert if id doesn't exist, update if it does)
   * @return {Promise} - Returns a promise via ajax call.
   *
   * @example
   * import { AwardedBadge, Client } from 'clinical6';
   *
   * // Removes awarded badge from server and local storage
   * const awardedBadge = new AwardedBadge({...});
   * awardedBadge.delete();
   *
   * // No longer in storage
   * Client.instance.storageUtility.has('awarded_badges', 1);
   */
  delete() {
    return (new UserService()).removeAwardedBadge(this);
  }

  /**
   * Saves an awarded badge (insert if id doesn't exist, update if it does)
   * @return {Promise<AwardedBadge>} - Returns a promise via ajax call.
   *
   * @example
   * import { AwardedBadge, userService } from 'clinical6';
   *
   * // Insert is different from other inserts.  Uses mobile application key
   * const awardedBadge = new AwardedBadge({...});
   * awardedBadge.save();
   *
   * // After you have the authtoken and then you've logged in
   *
   * // Updates existing awarded badge (has existing id)
   * userService.getAwardedBadges().then(awardedBadges => awardedBadges[0].save());
   */
  save() {
    return (this.id)
      ? (new UserService()).updateAwardedBadge(this)
      : (new UserService()).addAwardedBadge(this);
  }
}

export default AwardedBadge;