Manual Reference Source Test

src/helpers/consult/Consultation.js

import ConsultationModel from '../../models/consult/Consultation';
import ConsultationParticipant from './ConsultationParticipant';
import Client from '../../Client';
import Helper from '../Helper';
import { aggregate } from '../../utilities/ClassUtility';
import { serviceFactory } from '../../utilities/factories/ServiceFactory';

/**
 * Helper class representing a Consultation.
 * @example
 * import { Consultation, clinical6 } from 'clinical6';
 *
 * // Get user consultations
 * const consultations = await clinical6.getChildren(clinical6.user, Consultation);
 */
class Consultation extends aggregate(ConsultationModel, Helper) {
  /**
   * Constructor for helper class representing an Video Consultation
   *
   * @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 'video_consultations';
  }

  /** @type {ConsultationParticipant[]} */
  get participants() {
    return this._relationships.video_consultation_participants || [];
  }

  /** @type {ConsultationParticipant[]} */
  set participants(participants) {
    /** @type {ConsultationParticipant[]} */
    this._relationships.video_consultation_participants = participants;
  }

  /**
   * Deletes a consultation
   * @return {Promise} - Returns a promise via ajax call.
   *
   * @example
   * import { Consultation, Client } from 'clinical6';
   *
   * // Removes consultation from server and local storage
   * const consultation = new Consultation({...});
   * consultation.delete();
   *
   * // No longer in storage
   * Client.instance.storageUtility.has('consultations', { id: 1 });
   */
  delete() {
    const service = serviceFactory.get(this.type);
    return service.delete(this);
  }

  /**
   * Joins a video consultation (insert if id doesn't exist, update if it does)
   * @return {Promise<Consultation>} - Returns a promise via ajax call.
   *
   * @example
   * import { Consultation, clinical6 } from 'clinical6';
   *
   * // join using current user
   * const consultations = await clinical6.getChildren(clinical6.user, Consultation);
   * await consultations[0].join();
   * myToken = consultations[0].meta.joinToken;
   *
   * // get the meta token through a pass by reference
   * const meta = {};
   * await consultations[0].join(undefined, meta);
   * myToken = meta.joinToken;
   *
   * // join using a new participant directly
   * const consultations = await clinical6.getChildren(clinical6.user, Consultation);
   * await consultations[0].join(new Participant({...}));
   * myToken = consultations[0].meta.joinToken;
   */
  async join(participant = undefined, meta = {}) {
    const service = serviceFactory.get(this.type);

    if (!participant) {
      participant = this.participants.find(p => p.user.id === Client.instance.user.id);
    }
    if (!participant) {
      const p = new ConsultationParticipant();
      p.consultation = this;
      p.user = Client.instance.user;
      participant = await p.save();
    }
    if (!this.participants.find(p => p.id === participant.id)) {
      this.participants.push(participant);
    }

    return service.join(this, participant, { meta }).then((r) => {
      r._meta = meta;
      Object.assign(this, r);
      return r;
    });
  }

  /**
   * Saves a video consultation (insert if id doesn't exist, update if it does)
   * @return {Promise<Consultation>} - Returns a promise via ajax call.
   *
   * @example
   * import { Consultation, clinical6 } from 'clinical6';
   *
   * // Inserts new role (no existing id)
   * const consultation = new Consultation({
   *   "data": {
   *     "type": "video_consultations",
   *     "attributes": {
   *       "name": "Video Consultation Name",
   *       "start_at": "2018-08-09T19:13:20+00:00"
   *     }
   *   }
   * });
   * consultation.save();
   *
   * // Updates existing consultation (has existing id)
   * clinical6.getChildren(clinical6.user, Consultation).then(consultations => consultations[0].save());
   */
  async save() {
    const service = serviceFactory.get(this.type);
    return (this.id) ? service.update(this) : service.insert(this);
  }
}

export default Consultation;