UNPKG

@codetanzania/ewea-case

Version:

A representation of an entity which define and track cases during an emergency event.

196 lines (173 loc) 5.39 kB
import { MODEL_NAME_CASE, COLLECTION_NAME_CASE, PREDEFINE_NAMESPACE_CASESTAGE, PREDEFINE_NAMESPACE_PARTYGENDER, PREDEFINE_NAMESPACE_PARTYOCCUPATION, PREDEFINE_NAMESPACE_PARTYNATIONALITY, PREDEFINE_NAMESPACE_ADMINISTRATIVEAREA, DEFAULT_SEEDS, } from '@codetanzania/ewea-internals'; import { get, pick, set } from 'lodash'; import { mergeObjects, idOf } from '@lykmapipo/common'; import '@lykmapipo/mongoose-sequenceable'; import { copyInstance, createSchema, model } from '@lykmapipo/mongoose-common'; import actions from 'mongoose-rest-actions'; import exportable from '@lykmapipo/mongoose-exportable'; import { caseSeverityFor } from '@codetanzania/ewea-common'; import { CASE_SCHEMA_OPTIONS, CASE_OPTION_SELECT, CASE_OPTION_AUTOPOPULATE, } from './internals'; import { number, stage, severity, description, remarks, } from './schema/base.schema'; import { victim, followup } from './schema/common.schema'; import { reporter, resolver } from './schema/parties.schema'; import { reportedAt, resolvedAt } from './schema/dates.schema'; const SCHEMA = mergeObjects( { number }, // TODO: occured location { stage, severity }, { victim }, { description }, { reportedAt, reporter }, { resolvedAt, resolver }, { followup }, { remarks } ); /** * @module Case * @namespace Case * @name Case * @description A representation of an entity which define and track cases * during an emergency event. * * @see {@link https://en.wikipedia.org/wiki/Emergency} * * @author lally elias <lallyelias87@gmail.com> * @license MIT * @since 0.1.0 * @version 0.1.0 * @public * @example * const { Case } = require('@codetanzania/ewea-case'); * Case.create(case, (error, created) => { ... }); */ const CaseSchema = createSchema( SCHEMA, CASE_SCHEMA_OPTIONS, actions, exportable ); /* *------------------------------------------------------------------------------ * Hooks *------------------------------------------------------------------------------ */ /** * @name validate * @function validate * @description Case schema pre validation hook * @param {Function} done callback to invoke on success or error * @returns {object|Error} valid instance or error * * @author lally elias <lallyelias87@gmail.com> * @since 0.1.0 * @version 0.1.0 * @private */ CaseSchema.pre('validate', function onPreValidate(done) { return this.preValidate(done); }); /* *------------------------------------------------------------------------------ * Instance *------------------------------------------------------------------------------ */ /** * @name preValidate * @function preValidate * @description Case schema pre validation hook logic * @param {Function} done callback to invoke on success or error * @returns {object|Error} valid instance or error * * @author lally elias <lallyelias87@gmail.com> * @since 0.1.0 * @version 0.1.0 * @instance */ CaseSchema.methods.preValidate = function preValidate(done) { // ensure reported date this.reportedAt = this.reportedAt || this.createdAt || new Date(); // ensure case stage if (!get(this, 'stage')) { const staje = DEFAULT_SEEDS[PREDEFINE_NAMESPACE_CASESTAGE]; set(this, 'stage', staje); } // TODO: compute score // TODO: move score to case base schema // always: ensure case severity from followup score const score = get(this, 'followup.score'); this.severity = caseSeverityFor({ score }); // ensure victim gender if (!get(this, 'victim.gender')) { const gender = DEFAULT_SEEDS[PREDEFINE_NAMESPACE_PARTYGENDER]; set(this, 'victim.gender', gender); } // ensure victim default occupation if (!get(this, 'victim.occupation')) { const occupation = DEFAULT_SEEDS[PREDEFINE_NAMESPACE_PARTYOCCUPATION]; set(this, 'victim.occupation', occupation); } // ensure victim default nationality if (!get(this, 'victim.nationality')) { const nationality = DEFAULT_SEEDS[PREDEFINE_NAMESPACE_PARTYNATIONALITY]; set(this, 'victim.nationality', nationality); } // ensure victim default area if (!get(this, 'victim.area')) { const area = DEFAULT_SEEDS[PREDEFINE_NAMESPACE_ADMINISTRATIVEAREA]; set(this, 'victim.area', area); } // TODO: ensure event group and type // TODO: ensure default values // TODO: ensure case status // return return done(null, this); }; /* *------------------------------------------------------------------------------ * Statics *------------------------------------------------------------------------------ */ /* static constants */ CaseSchema.statics.MODEL_NAME = MODEL_NAME_CASE; CaseSchema.statics.COLLECTION_NAME = COLLECTION_NAME_CASE; CaseSchema.statics.OPTION_SELECT = CASE_OPTION_SELECT; CaseSchema.statics.OPTION_AUTOPOPULATE = CASE_OPTION_AUTOPOPULATE; /** * @name prepareSeedCriteria * @function prepareSeedCriteria * @description Define seed data criteria * @param {object} seed event to be seeded * @returns {object} packed criteria for seeding * * @author lally elias <lallyelias87@gmail.com> * @since 0.1.0 * @version 0.1.0 * @static */ CaseSchema.statics.prepareSeedCriteria = (seed) => { const copyOfSeed = copyInstance(seed); const criteria = idOf(copyOfSeed) ? pick(copyOfSeed, '_id') : pick(copyOfSeed, 'number'); return criteria; }; /* export case model */ export default model(MODEL_NAME_CASE, CaseSchema);