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;