From 701f445125ed078e6b3dc4370f27716a4ca7626f Mon Sep 17 00:00:00 2001 From: lykmapipo Date: Thu, 4 Jun 2020 10:48:27 +0300 Subject: [PATCH] feat(case-aggregations): add base --- package-lock.json | 135 ++----------------- package.json | 4 +- src/aggregations/case.aggregations.js | 124 +++++++++++++++++ src/index.js | 1 + test/fixtures/cases.js | 6 +- test/fixtures/predefines/partyoccupations.js | 13 ++ test/integration/bootstrap.spec.js | 6 +- 7 files changed, 158 insertions(+), 131 deletions(-) create mode 100644 src/aggregations/case.aggregations.js create mode 100644 test/fixtures/predefines/partyoccupations.js diff --git a/package-lock.json b/package-lock.json index f895f4f..95104a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3641,15 +3641,6 @@ "read-package-json-fast": "^1.1.3" } }, - "@samverschueren/stream-to-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", - "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", - "dev": true, - "requires": { - "any-observable": "^0.3.0" - } - }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -5287,12 +5278,6 @@ } } }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", @@ -5318,12 +5303,6 @@ "color-convert": "^1.9.0" } }, - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true - }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -6560,12 +6539,6 @@ "wordwrap": "0.0.2" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -7576,15 +7549,6 @@ } } }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", @@ -8080,12 +8044,6 @@ "integrity": "sha512-4lwnxp+ArqOX9hiLwLpwhfqvwzUHFuDgLz4NTiU3lhygUzWtocIJ/5Vix+mWVNE2HQ9aI1k2ncGe5H/0OktMvA==", "dev": true }, - "elegant-spinner": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-2.0.0.tgz", - "integrity": "sha512-5YRYHhvhYzV/FC4AiMdeSIg3jAYGq9xFvbhZMpPlJoBsfYgrw2DSCYeXfat6tYBu45PWiyRr3+flaCPPmviPaA==", - "dev": true - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -8123,15 +8081,6 @@ "once": "^1.4.0" } }, - "enquirer": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.5.tgz", - "integrity": "sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA==", - "dev": true, - "requires": { - "ansi-colors": "^3.2.1" - } - }, "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", @@ -11768,9 +11717,9 @@ } }, "lint-staged": { - "version": "10.2.7", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.7.tgz", - "integrity": "sha512-srod2bTpF8riaLz+Bgr6v0mI/nSntE8M9jbh4WwAhoosx0G7RKEUIG7mI5Nu5SMbTF9o8GROPgK0Lhf5cDnUUw==", + "version": "10.2.8", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.8.tgz", + "integrity": "sha512-36VUVhZuTJUG0yuSv66o+/Cep9Uwp+od6VkjNxQjHKWvHClVD0SjAZx++4H3zgdr6DxPoUl1y/PVygfPhzAXQQ==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -12022,25 +11971,19 @@ } }, "listr2": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.0.4.tgz", - "integrity": "sha512-oJaAcplPsa72rKW0eg4P4LbEJjhH+UO2I8uqR/I2wzHrVg16ohSfUy0SlcHS21zfYXxtsUpL8YXGHjyfWMR0cg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.1.0.tgz", + "integrity": "sha512-pWrbMLO+6jxGbgAasTLUzfRYdBaQvv6sNTWDfIX8ENBNmTwt/eafZ/LlJ66/dNaDnEhzCpWricLH4U9cjSAHYg==", "dev": true, "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", "chalk": "^4.0.0", - "cli-cursor": "^3.1.0", "cli-truncate": "^2.1.0", - "elegant-spinner": "^2.0.0", - "enquirer": "^2.3.5", "figures": "^3.2.0", "indent-string": "^4.0.0", "log-update": "^4.0.0", "p-map": "^4.0.0", - "pad": "^3.2.0", "rxjs": "^6.5.5", - "through": "^2.3.8", - "uuid": "^7.0.2" + "through": "^2.3.8" }, "dependencies": { "ansi-styles": { @@ -12063,15 +12006,6 @@ "supports-color": "^7.1.0" } }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -12108,31 +12042,6 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -12141,12 +12050,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true } } }, @@ -15541,15 +15444,6 @@ } } }, - "pad": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", - "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==", - "dev": true, - "requires": { - "wcwidth": "^1.0.1" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -16692,9 +16586,9 @@ "integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==" }, "rollup": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.12.1.tgz", - "integrity": "sha512-qNl9jiVC4/jqTaGUTP0sUnKKCdnebAKYY/8hTy/NnNaeVfjHOW9aIwRT8XHV/zrcpRgJn1g/mjAorMcD38Dlhg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.13.1.tgz", + "integrity": "sha512-EiICynxIO1DTFmFn+/98gfaqCToK2nbjPjHJLuNvpcwc+P035VrXmJxi3JsOhqkdty+0cOEhJ26ceGTY3UPMPQ==", "dev": true, "requires": { "fsevents": "~2.1.2" @@ -18483,15 +18377,6 @@ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/package.json b/package.json index c0b7b9e..3db9578 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "generate-changelog": "^1.8.0", "handlebars": "^4.7.6", "husky": "^4.2.5", - "lint-staged": "^10.2.7", + "lint-staged": "^10.2.8", "lodash.template": "^4.5.0", "mocha": "^7.2.0", "mongoose": ">=5.9.17", @@ -110,7 +110,7 @@ "nyc": "^15.1.0", "prettier": "^2.0.5", "rimraf": "^3.0.2", - "rollup": "^2.12.1", + "rollup": "^2.13.1", "shelljs": "^0.8.4" }, "peerDependencies": { diff --git a/src/aggregations/case.aggregations.js b/src/aggregations/case.aggregations.js new file mode 100644 index 0000000..31e4be9 --- /dev/null +++ b/src/aggregations/case.aggregations.js @@ -0,0 +1,124 @@ +import { Case } from '@codetanzania/ewea-case'; + +// start: constants +// order: base to specific + +const CASE_AGGREGATION_EXCLUDE = []; + +// start: extra metric fields +// order: base to specific + +/** + * @constant + * @name CASE_BASE_METRIC_FIELDS + * @description Adds new metric fields to the next stage in the pipeline. + * @type {object} + * + * @author lally elias + * @license MIT + * @since 0.8.0 + * @version 0.1.0 + */ +export const CASE_BASE_METRIC_FIELDS = {}; + +// start: projections +// order: base to specific +// +/** + * @constant + * @name CASE_DEFAULT_PROJECTION + * @description Normalize Case fields with defaults before pass to + * the next stage in the pipeline. + * @type {object} + * + * @author lally elias + * @license MIT + * @since 0.5.0 + * @version 0.1.0 + */ +export const CASE_DEFAULT_PROJECTION = { + _id: 1, + createdAt: 1, + updatedAt: 1, + metrics: 1, +}; + +/** + * @constant + * @name CASE_BASE_PROJECTION + * @description Case fields passed to the next stage in the pipeline. + * @type {object} + * + * @author lally elias + * @license MIT + * @since 0.5.0 + * @version 0.1.0 + */ +export const CASE_BASE_PROJECTION = { + _id: 1, + createdAt: 1, + updatedAt: 1, + metrics: 1, +}; + +// start: facets +// order: base, overall to specific + +/** + * @constant + * @name CASE_FACET_OVERVIEW + * @description General `Event` overview facet. + * @type {object} + * + * @author lally elias + * @license MIT + * @since 0.5.0 + * @version 0.1.0 + */ +export const CASE_FACET_OVERVIEW = {}; + +// start: aggregations +// order: base to specific + +/** + * @function getEventCaseAggregation + * @name getEventCaseAggregation + * @description Create base aggregation for `Case` with all fields + * looked up and un-winded for further aggregation operations. + * @param {object} [criteria={}] conditions which will be applied in + * first aggregation stage. + * @returns {object} valid base aggregation for case. + * + * @author lally elias + * @license MIT + * @since 0.1.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * getEventCaseAggregation({ ... }); + * //=> Aggregation{ ... } + * + */ +export const getEventCaseAggregation = (criteria = {}) => { + // TODO: ignore agencies & focals unwind + + // initialize case base aggregation + const options = { exclude: CASE_AGGREGATION_EXCLUDE }; + const base = Case.lookup(criteria, options); + + // project default on relations + base.project(CASE_DEFAULT_PROJECTION); + + // add base projection + base.project(CASE_BASE_PROJECTION); + + // TODO: project per relations before add metrics + + // add extra metric fields + base.addFields(CASE_BASE_METRIC_FIELDS); + + // return case base aggregation + return base; +}; diff --git a/src/index.js b/src/index.js index a643263..f74ed68 100644 --- a/src/index.js +++ b/src/index.js @@ -29,6 +29,7 @@ export * from './aggregations/changelog.aggregations'; export * from './aggregations/event.aggregations'; export * from './aggregations/party.aggregations'; export * from './aggregations/dispatch.aggregations'; +export * from './aggregations/case.aggregations'; export * from './aggregations/predefine.aggregations'; export * from './aggregations/overview.aggregations'; diff --git a/test/fixtures/cases.js b/test/fixtures/cases.js index 02e0e37..3c5788b 100644 --- a/test/fixtures/cases.js +++ b/test/fixtures/cases.js @@ -15,14 +15,14 @@ const cases = [ description: 'Severe injury from Floods.', reportedAt: '2020-05-04T02:48:48.323Z', createdAt: '2020-05-04T02:48:48.323Z', - resolvedAt: '2020-05-04T02:59:48.323Z', + dischargedAt: '2020-05-04T02:59:48.323Z', remarks: 'Handled.', populate: { reporter: { match: { name: 'Ali Mdoe' }, model: 'Party', }, - resolver: { + discharger: { match: { name: 'Ali Mdoe' }, model: 'Party', }, @@ -32,7 +32,7 @@ const cases = [ }, 'victim.occupation': { match: { - namespace: 'PartyGender', + namespace: 'PartyOccupation', 'strings.name.en': 'Health Care Worker', }, model: 'Predefine', diff --git a/test/fixtures/predefines/partyoccupations.js b/test/fixtures/predefines/partyoccupations.js new file mode 100644 index 0000000..e40d01a --- /dev/null +++ b/test/fixtures/predefines/partyoccupations.js @@ -0,0 +1,13 @@ +const genders = [ + { + namespace: 'PartyOccupation', + strings: { name: { en: 'Health Care Worker' } }, + }, + { + namespace: 'PartyOccupation', + strings: { name: { en: 'Unknown' } }, + booleans: { default: true }, + }, +]; + +export default genders; diff --git a/test/integration/bootstrap.spec.js b/test/integration/bootstrap.spec.js index ff74bf4..62b710f 100644 --- a/test/integration/bootstrap.spec.js +++ b/test/integration/bootstrap.spec.js @@ -1,5 +1,9 @@ import { connect, seed } from '@codetanzania/ewea-common'; -import { clear, drop } from '@lykmapipo/mongoose-test-helpers'; +import { + clear, + drop, + // enableDebug +} from '@lykmapipo/mongoose-test-helpers'; process.env.BASE_PATH = __dirname; process.env.DATA_PATH = `${__dirname}'/../fixtures`;