@codetanzania/ewea-api-client
Version:
http client for EWEA API.
409 lines (392 loc) • 9.49 kB
JavaScript
import clone from 'lodash/clone';
import forEach from 'lodash/forEach';
import merge from 'lodash/merge';
import upperFirst from 'lodash/upperFirst';
import { mergeObjects } from '@lykmapipo/common';
import {
get,
createHttpActionsFor,
createGetHttpActionForReport,
} from './client';
/**
* @name DEFAULT_FILTER
* @description default resource filtering options
* @type {Object}
* @since 0.7.0
* @version 0.1.0
* @static
* @public
*/
export const DEFAULT_FILTER = { deletedAt: { $eq: null } };
/**
* @name DEFAULT_PAGINATION
* @description default resource pagination options
* @type {Object}
* @since 0.7.0
* @version 0.1.0
* @static
* @public
*/
export const DEFAULT_PAGINATION = { limit: 10, skip: 0, page: 1 };
/**
* @name DEFAULT_SORT
* @description default resource sorting order options
* @type {Object}
* @since 0.7.0
* @version 0.1.0
* @private
*/
export const DEFAULT_SORT = { updatedAt: -1 };
/**
* @constant
* @name WELL_KNOWN
* @description set of well known api endpoints. they must be one-to-one to
* naked api endpoints exposed by the server and they must presented in
* camelcase.
* @type {String[]}
* @since 0.7.0
* @version 0.1.0
* @static
* @public
*/
export const WELL_KNOWN = [
'assessment',
'campaign',
'changelog',
'dispatch',
'event',
'indicator',
'message',
'party',
'permission',
'predefine',
'question',
'questionnaire',
'case',
];
/**
* @constant
* @name WELL_KNOWN_REPORTS
* @description set of well known api endpoints for reports. they must be
* one-to-one to naked api endpoints exposed by the server and they must
* presented in camel-case.
* @type {String[]}
* @since 0.13.0
* @version 0.1.0
* @static
* @public
*/
export const WELL_KNOWN_REPORTS = [
'overview',
'indicator',
'risk',
'action',
'need',
'effect',
'resource',
'party',
'alert',
'event',
'dispatch',
'case',
];
// default request params
const DEFAULT_PARAMS = {
filter: DEFAULT_FILTER,
paginate: DEFAULT_PAGINATION,
sort: DEFAULT_SORT,
};
// parties shortcuts
const PARTY_SHORTCUTS = {
focalPerson: {
shortcut: 'focalPerson',
wellknown: 'party',
params: mergeObjects(DEFAULT_PARAMS, {
filter: { type: 'Focal' },
}),
},
agency: {
shortcut: 'agency',
wellknown: 'party',
params: mergeObjects(DEFAULT_PARAMS, {
filter: { type: 'Agency' },
}),
},
};
// predefine shortcuts
const PREDEFINE_SHORTCUTS = {
administrativeLevel: {
shortcut: 'administrativeLevel',
wellknown: 'predefine',
bucket: 'administrativelevels',
params: mergeObjects(DEFAULT_PARAMS),
},
administrativeArea: {
shortcut: 'administrativeArea',
wellknown: 'predefine',
bucket: 'administrativeareas',
params: mergeObjects(DEFAULT_PARAMS),
},
eventLevel: {
shortcut: 'eventLevel',
wellknown: 'predefine',
bucket: 'eventlevels',
params: mergeObjects(DEFAULT_PARAMS),
},
eventSeverity: {
shortcut: 'eventSeverity',
wellknown: 'predefine',
bucket: 'eventseverities',
params: mergeObjects(DEFAULT_PARAMS),
},
eventCertainty: {
shortcut: 'eventCertainty',
wellknown: 'predefine',
bucket: 'eventcertainties',
params: mergeObjects(DEFAULT_PARAMS),
},
eventStatus: {
shortcut: 'eventStatus',
wellknown: 'predefine',
bucket: 'eventstatuses',
params: mergeObjects(DEFAULT_PARAMS),
},
eventUrgency: {
shortcut: 'eventUrgency',
wellknown: 'predefine',
bucket: 'eventurgencies',
params: mergeObjects(DEFAULT_PARAMS),
},
eventResponse: {
shortcut: 'eventResponse',
wellknown: 'predefine',
bucket: 'eventresponses',
params: mergeObjects(DEFAULT_PARAMS),
},
eventAction: {
shortcut: 'eventAction',
wellknown: 'predefine',
bucket: 'eventactions',
params: mergeObjects(DEFAULT_PARAMS),
},
eventFunction: {
shortcut: 'eventFunction',
wellknown: 'predefine',
bucket: 'eventfunctions',
params: mergeObjects(DEFAULT_PARAMS),
},
eventGroup: {
shortcut: 'eventGroup',
wellknown: 'predefine',
bucket: 'eventgroups',
params: mergeObjects(DEFAULT_PARAMS),
},
eventIndicator: {
shortcut: 'eventIndicator',
wellknown: 'predefine',
bucket: 'eventindicators',
params: mergeObjects(DEFAULT_PARAMS),
},
eventQuestion: {
shortcut: 'eventQuestion',
wellknown: 'predefine',
bucket: 'eventquestions',
params: mergeObjects(DEFAULT_PARAMS),
},
eventTopic: {
shortcut: 'eventTopic',
wellknown: 'predefine',
bucket: 'eventtopics',
params: mergeObjects(DEFAULT_PARAMS),
},
eventType: {
shortcut: 'eventType',
wellknown: 'predefine',
bucket: 'eventtypes',
params: mergeObjects(DEFAULT_PARAMS),
},
eventActionCatalogue: {
shortcut: 'eventActionCatalogue',
wellknown: 'predefine',
bucket: 'eventactioncatalogues',
params: mergeObjects(DEFAULT_PARAMS),
},
featureType: {
shortcut: 'featureType',
wellknown: 'predefine',
bucket: 'featuretypes',
params: mergeObjects(DEFAULT_PARAMS),
},
feature: {
shortcut: 'feature',
wellknown: 'predefine',
bucket: 'features',
params: mergeObjects(DEFAULT_PARAMS),
},
notificationTemplate: {
shortcut: 'notificationTemplate',
wellknown: 'predefine',
bucket: 'notificationtemplates',
params: mergeObjects(DEFAULT_PARAMS),
},
partyGender: {
shortcut: 'partyGender',
wellknown: 'predefine',
bucket: 'partygenders',
params: mergeObjects(DEFAULT_PARAMS),
},
partyOccupation: {
shortcut: 'partyOccupation',
wellknown: 'predefine',
bucket: 'partyoccupations',
params: mergeObjects(DEFAULT_PARAMS),
},
partyNationality: {
shortcut: 'partyNationality',
wellknown: 'predefine',
bucket: 'partynationalities',
params: mergeObjects(DEFAULT_PARAMS),
},
partyGroup: {
shortcut: 'partyGroup',
wellknown: 'predefine',
bucket: 'partygroups',
params: mergeObjects(DEFAULT_PARAMS),
},
partyOwnership: {
shortcut: 'partyOwnership',
wellknown: 'predefine',
bucket: 'partyownerships',
params: mergeObjects(DEFAULT_PARAMS),
},
partyRole: {
shortcut: 'partyRole',
wellknown: 'predefine',
bucket: 'partyroles',
params: mergeObjects(DEFAULT_PARAMS),
},
priorities: {
shortcut: 'priority',
wellknown: 'predefine',
bucket: 'priorities',
params: mergeObjects(DEFAULT_PARAMS),
},
unit: {
shortcut: 'unit',
wellknown: 'predefine',
bucket: 'units',
params: mergeObjects(DEFAULT_PARAMS),
},
vehicle: {
shortcut: 'vehicle',
wellknown: 'predefine',
bucket: 'vehicles',
params: mergeObjects(DEFAULT_PARAMS),
},
vehicleModel: {
shortcut: 'vehicleModel',
wellknown: 'predefine',
bucket: 'vehiclemodels',
params: mergeObjects(DEFAULT_PARAMS),
},
vehicleMake: {
shortcut: 'vehicleMake',
wellknown: 'predefine',
bucket: 'vehiclemakes',
params: mergeObjects(DEFAULT_PARAMS),
},
vehicleStatus: {
shortcut: 'vehicleStatus',
wellknown: 'predefine',
bucket: 'vehiclestatuses',
params: mergeObjects(DEFAULT_PARAMS),
},
vehicleType: {
shortcut: 'vehicleType',
wellknown: 'predefine',
bucket: 'vehicletypes',
params: mergeObjects(DEFAULT_PARAMS),
},
caseSeverity: {
shortcut: 'caseSeverity',
wellknown: 'predefine',
bucket: 'caseseverities',
params: mergeObjects(DEFAULT_PARAMS),
},
caseStage: {
shortcut: 'caseStage',
wellknown: 'predefine',
bucket: 'casestages',
params: mergeObjects(DEFAULT_PARAMS),
},
};
/**
* @constant
* @name SHORTCUTS
* @description set of applicable api shortcuts.
* @type {Object}
* @since 0.7.0
* @version 0.1.0
* @static
* @public
*/
export const SHORTCUTS = mergeObjects(
// FEATURE_SHORTCUTS,
PARTY_SHORTCUTS,
PREDEFINE_SHORTCUTS
);
/**
* @constant
* @name RESOURCES
* @description set of applicable api endpoints including both well-known and
* shortcuts. they must presented in camel-case and wellknown key should point
* back to {@link WELL_KNOWN}.
* @type {Object}
* @since 0.7.0
* @version 0.1.0
* @static
* @public
*/
export const RESOURCES = mergeObjects(SHORTCUTS);
// build wellknown resources
forEach([...WELL_KNOWN], (wellknown) => {
const name = clone(wellknown);
const shortcut = clone(wellknown);
const params = mergeObjects(DEFAULT_PARAMS);
const resource = { shortcut, wellknown, params };
RESOURCES[name] = resource;
});
/**
* @name httpActions
* @description resource http actions
* @type {Object}
* @since 0.7.0
* @version 0.1.0
* @static
* @public
*/
export const httpActions = {
getSchemas: () =>
get('/schemas').then((response) => {
const schemas = { ...response };
// expose shortcuts schema
if (schemas) {
forEach(SHORTCUTS, (shortcut) => {
const key = upperFirst(shortcut.shortcut);
const wellknown = upperFirst(shortcut.wellknown);
schemas[key] = schemas[wellknown];
});
}
return schemas;
}),
};
// build resource http actions
forEach(RESOURCES, (resource) => {
const resourceHttpActions = createHttpActionsFor(resource);
merge(httpActions, resourceHttpActions);
});
// build report http Get Actions
forEach(WELL_KNOWN_REPORTS, (report) => {
const reportHttpAction = createGetHttpActionForReport(report);
merge(httpActions, reportHttpAction);
});