@things-factory/dataset 10.1.154 → 10.1.155
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/activities/activity-data-collect.js +2 -2
- package/dist-server/activities/activity-data-collect.js.map +1 -1
- package/dist-server/controllers/create-data-ooc.js +2 -2
- package/dist-server/controllers/create-data-ooc.js.map +1 -1
- package/dist-server/controllers/create-data-sample.js +1 -2
- package/dist-server/controllers/create-data-sample.js.map +1 -1
- package/dist-server/controllers/finalize-data-collection.js +2 -3
- package/dist-server/controllers/finalize-data-collection.js.map +1 -1
- package/dist-server/controllers/issue-data-collection-task.js +1 -2
- package/dist-server/controllers/issue-data-collection-task.js.map +1 -1
- package/dist-server/controllers/issue-ooc-resolve.js +2 -2
- package/dist-server/controllers/issue-ooc-resolve.js.map +1 -1
- package/dist-server/controllers/issue-ooc-review.js +2 -2
- package/dist-server/controllers/issue-ooc-review.js.map +1 -1
- package/dist-server/controllers/query-data-summary-by-period.js +1 -2
- package/dist-server/controllers/query-data-summary-by-period.js.map +1 -1
- package/dist-server/routes.js +1 -2
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/data-archive/data-archive-query.js +2 -3
- package/dist-server/service/data-archive/data-archive-query.js.map +1 -1
- package/dist-server/service/data-key-set/data-key-set-query.js +2 -3
- package/dist-server/service/data-key-set/data-key-set-query.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-query.js +2 -3
- package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-query.js +5 -6
- package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-query.js +2 -3
- package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-mutation.js +2 -3
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +7 -8
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/service/data-set-history/data-set-history-query.js +2 -3
- package/dist-server/service/data-set-history/data-set-history-query.js.map +1 -1
- package/dist-server/service/data-summary/data-summary-query.js +5 -6
- package/dist-server/service/data-summary/data-summary-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -12
- package/dist-server/utils/domain-inheritance.d.ts +0 -2
- package/dist-server/utils/domain-inheritance.js +0 -31
- package/dist-server/utils/domain-inheritance.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-data-summary-by-period.js","sourceRoot":"","sources":["../../server/controllers/query-data-summary-by-period.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\n\nimport {\n getQueryBuilderFromListParams,\n getRepository,\n getTimesForPeriod,\n ListParam,\n Sorting\n} from '@things-factory/shell'\n\nimport { DataSet, DataSetSummaryPeriodType } from '../service/data-set/data-set.js'\nimport { DataSummary } from '../service/data-summary/data-summary.js'\nimport { getDomainIdsWithAncestors } from '../utils/domain-inheritance.js'\n\nconst STAT_FUNCTION_MAP = {\n sum: 'sum',\n mean: 'mean',\n stddev: 'standardDeviation',\n variance: 'variance',\n min: 'min',\n max: 'max',\n range: 'range',\n median: 'median',\n mode: 'mode'\n}\n\nexport async function queryDataSummaryByPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month',\n dataSetName: string,\n dataKeys: string[] | null,\n params: ListParam,\n context: ResolverContext\n): Promise<DataSummary[]> {\n const { domain, user, tx } = context.state\n const { t } = context\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const dataSet = await getRepository(DataSet).findOne({\n where: { domain: { id: In(domainIds) }, name: dataSetName },\n relations: ['dataKeySet']\n })\n\n if (!dataSet) {\n throw new Error(t('error.dataset not found', { dataSetName }))\n }\n\n // limitations\n const summaryPeriodType = dataSet.summaryPeriod\n if (\n (summaryPeriodType == DataSetSummaryPeriodType.Day || summaryPeriodType == DataSetSummaryPeriodType.WorkDate) &&\n period == 'today'\n ) {\n throw new Error(t('error.summary not supported', { dataSetName, period: t(`label.period-${period}`) }))\n }\n\n // dataKeys 가 설정되지 않았다면, dataSet의 dataKeySet을 그대로 적용한다는 의미임.\n // dataKeys == [] 라면, dataKeySet을 적용하지 않는다는 의미임.\n // dataKeys에는 dataKeySet의 dataKey 값을 따라야 한다.\n const dataKeyItems = !dataSet.dataKeySet?.dataKeyItems\n ? []\n : dataKeys\n ? dataKeys\n .map(dataKey => {\n return dataSet.dataKeySet.dataKeyItems.find(item => item.dataKey == dataKey)\n })\n .filter(Boolean)\n : dataSet.dataKeySet.dataKeyItems\n\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n const dataItems = dataSet.dataItems.filter(item => item.agg)\n\n const { date, month } = params.filters.reduce(\n (acc, filter) => {\n if (filter.name === 'date') acc.date = filter.value\n if (filter.name === 'month') acc.month = filter.value\n return acc\n },\n { date: null, month: null }\n )\n\n const { from, to } = await getTimesForPeriod(period, { date, month }, context)\n\n const selectPeriod = queryBuilder => {\n if (period == 'today') {\n queryBuilder.addSelect('summary.date', 'date').addSelect('summary.period', 'period')\n } else if (['this year', '12 months'].includes(period)) {\n queryBuilder.addSelect('SUBSTRING(summary.date, 1, 7) AS month')\n } else {\n queryBuilder.addSelect('summary.date', 'date')\n }\n\n return queryBuilder\n }\n const selectKeys = dataKeyItems.map((item, index) => {\n const aliasName = `key0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n return `${columnName} as ${aliasName}`\n }) as string[]\n const selectData = dataItems.map((item, index) => {\n const aliasName = `data0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n switch (item.agg) {\n case STAT_FUNCTION_MAP.sum:\n return `SUM(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mean:\n // 일차 mean 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `AVG(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.stddev:\n // 일차 stddev 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `STDDEV(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.variance:\n // 일차 variance 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `VARIANCE(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.min:\n return `MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.max:\n return `MAX(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.range:\n // 일차 range 값들을 다시 계산하므로, 무의미할 수 있다.\n return `MAX(${columnName}) - MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mode:\n // not guaranteed\n return `MODE() WITHIN GROUP (ORDER BY ${columnName})`\n default:\n return `AVG(${columnName}) as ${aliasName}`\n }\n })\n\n const groupByPeriod =\n period == 'today'\n ? 'summary.date, summary.period'\n : ['this year', '12 months'].includes(period)\n ? 'SUBSTRING(summary.date, 1, 7)'\n : 'summary.date'\n const groupByKeys = dataKeyItems\n .map((item, index) => {\n return `summary.key0${index + 1}`\n })\n .join(', ')\n\n const desc = false\n var orderByPeriod: Sorting[] =\n period == 'today'\n ? [\n { name: 'date', desc },\n { name: 'period', desc }\n ]\n : ['this year', '12 months'].includes(period)\n ? [{ name: 'month', desc }]\n : [{ name: 'date', desc }]\n\n if (params?.sortings && params.sortings.length > 0) {\n orderByPeriod = params.sortings\n }\n\n var queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSummary),\n params: {\n ...params,\n filters: params?.filters?.filter(({ name }) => name !== 'date' && name !== 'month') || [],\n sortings: []\n },\n domain: undefined,\n alias: 'summary',\n searchables: searchables\n })\n .select('summary.dataSet')\n .addSelect(selectData)\n .addSelect('SUM(summary.count)', 'count')\n .addSelect('SUM(summary.countOoc)', 'countOoc')\n .addSelect('SUM(summary.countOos)', 'countOos')\n\n queryBuilder = selectPeriod(queryBuilder)\n .innerJoin('summary.dataSet', 'ds', 'ds.id = :dataSetName', {\n dataSetName: dataSet.id\n })\n .andWhere('summary.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })\n .andWhere('summary.date >= :from', { from })\n .andWhere('summary.date < :to', { to })\n .addGroupBy('summary.dataSet')\n .addGroupBy(groupByPeriod)\n\n if (dataKeyItems.length > 0) {\n queryBuilder.addSelect(selectKeys).addGroupBy(groupByKeys)\n }\n\n orderByPeriod.map(orderBy => {\n const { name: sort, desc } = orderBy\n queryBuilder.addOrderBy(sort, desc ? 'DESC' : 'ASC')\n })\n\n const items = await queryBuilder.getRawMany()\n\n return items\n}\n"]}
|
|
1
|
+
{"version":3,"file":"query-data-summary-by-period.js","sourceRoot":"","sources":["../../server/controllers/query-data-summary-by-period.ts"],"names":[],"mappings":";;AA0BA,4DA0KC;AApMD,qCAA4B;AAE5B,iDAO8B;AAE9B,iEAAmF;AACnF,6EAAqE;AAErE,MAAM,iBAAiB,GAAG;IACxB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,mBAAmB;IAC3B,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;CACb,CAAA;AAEM,KAAK,UAAU,wBAAwB,CAC5C,MAA+F,EAC/F,WAAmB,EACnB,QAAyB,EACzB,MAAiB,EACjB,OAAwB;IAExB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAC1C,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,CAAA;IACrB,MAAM,SAAS,GAAG,MAAM,IAAA,iCAAyB,EAAC,MAAM,CAAC,CAAA;IAEzD,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAa,EAAC,qBAAO,CAAC,CAAC,OAAO,CAAC;QACnD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC3D,SAAS,EAAE,CAAC,YAAY,CAAC;KAC1B,CAAC,CAAA;IAEF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,yBAAyB,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;IAChE,CAAC;IAED,cAAc;IACd,MAAM,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAA;IAC/C,IACE,CAAC,iBAAiB,IAAI,sCAAwB,CAAC,GAAG,IAAI,iBAAiB,IAAI,sCAAwB,CAAC,QAAQ,CAAC;QAC7G,MAAM,IAAI,OAAO,EACjB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,6BAA6B,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,gBAAgB,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzG,CAAC;IAED,4DAA4D;IAC5D,gDAAgD;IAChD,4CAA4C;IAC5C,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY;QACpD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,QAAQ;YACR,CAAC,CAAC,QAAQ;iBACL,GAAG,CAAC,OAAO,CAAC,EAAE;gBACb,OAAO,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,CAAA;YAC9E,CAAC,CAAC;iBACD,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAA;IAErC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE5D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAC3C,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;QACd,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;YAAE,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAA;QACnD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;YAAE,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QACrD,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAC5B,CAAA;IAED,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,IAAA,yBAAiB,EAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;IAE9E,MAAM,YAAY,GAAG,YAAY,CAAC,EAAE;QAClC,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YACtB,YAAY,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAA;QACtF,CAAC;aAAM,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,YAAY,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAA;QAClE,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;QAChD,CAAC;QAED,OAAO,YAAY,CAAA;IACrB,CAAC,CAAA;IACD,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,SAAS,GAAG,OAAO,KAAK,GAAG,CAAC,EAAE,CAAA;QACpC,MAAM,UAAU,GAAG,WAAW,SAAS,EAAE,CAAA;QAEzC,OAAO,GAAG,UAAU,OAAO,SAAS,EAAE,CAAA;IACxC,CAAC,CAAa,CAAA;IACd,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/C,MAAM,SAAS,GAAG,QAAQ,KAAK,GAAG,CAAC,EAAE,CAAA;QACrC,MAAM,UAAU,GAAG,WAAW,SAAS,EAAE,CAAA;QAEzC,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC;YACjB,KAAK,iBAAiB,CAAC,GAAG;gBACxB,OAAO,OAAO,UAAU,QAAQ,SAAS,EAAE,CAAA;YAC7C,KAAK,iBAAiB,CAAC,IAAI;gBACzB,qCAAqC;gBACrC,OAAO,OAAO,UAAU,QAAQ,SAAS,EAAE,CAAA;YAC7C,KAAK,iBAAiB,CAAC,MAAM;gBAC3B,uCAAuC;gBACvC,OAAO,UAAU,UAAU,QAAQ,SAAS,EAAE,CAAA;YAChD,KAAK,iBAAiB,CAAC,QAAQ;gBAC7B,yCAAyC;gBACzC,OAAO,YAAY,UAAU,QAAQ,SAAS,EAAE,CAAA;YAClD,KAAK,iBAAiB,CAAC,GAAG;gBACxB,OAAO,OAAO,UAAU,QAAQ,SAAS,EAAE,CAAA;YAC7C,KAAK,iBAAiB,CAAC,GAAG;gBACxB,OAAO,OAAO,UAAU,QAAQ,SAAS,EAAE,CAAA;YAC7C,KAAK,iBAAiB,CAAC,KAAK;gBAC1B,oCAAoC;gBACpC,OAAO,OAAO,UAAU,WAAW,UAAU,QAAQ,SAAS,EAAE,CAAA;YAClE,KAAK,iBAAiB,CAAC,IAAI;gBACzB,iBAAiB;gBACjB,OAAO,iCAAiC,UAAU,GAAG,CAAA;YACvD;gBACE,OAAO,OAAO,UAAU,QAAQ,SAAS,EAAE,CAAA;QAC/C,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,aAAa,GACjB,MAAM,IAAI,OAAO;QACf,CAAC,CAAC,8BAA8B;QAChC,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC3C,CAAC,CAAC,+BAA+B;YACjC,CAAC,CAAC,cAAc,CAAA;IACtB,MAAM,WAAW,GAAG,YAAY;SAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACnB,OAAO,eAAe,KAAK,GAAG,CAAC,EAAE,CAAA;IACnC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,IAAI,GAAG,KAAK,CAAA;IAClB,IAAI,aAAa,GACf,MAAM,IAAI,OAAO;QACf,CAAC,CAAC;YACE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;YACtB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;SACzB;QACH,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC3C,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAEhC,IAAI,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAA;IACjC,CAAC;IAED,IAAI,YAAY,GAAG,IAAA,qCAA6B,EAAC;QAC/C,UAAU,EAAE,IAAA,qBAAa,EAAC,6BAAW,CAAC;QACtC,MAAM,EAAE;YACN,GAAG,MAAM;YACT,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE;YACzF,QAAQ,EAAE,EAAE;SACb;QACD,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,WAAW;KACzB,CAAC;SACC,MAAM,CAAC,iBAAiB,CAAC;SACzB,SAAS,CAAC,UAAU,CAAC;SACrB,SAAS,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACxC,SAAS,CAAC,uBAAuB,EAAE,UAAU,CAAC;SAC9C,SAAS,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAA;IAEjD,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC;SACtC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,sBAAsB,EAAE;QAC1D,WAAW,EAAE,OAAO,CAAC,EAAE;KACxB,CAAC;SACD,QAAQ,CAAC,2CAA2C,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC;SACvF,QAAQ,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,CAAC;SAC3C,QAAQ,CAAC,oBAAoB,EAAE,EAAE,EAAE,EAAE,CAAC;SACtC,UAAU,CAAC,iBAAiB,CAAC;SAC7B,UAAU,CAAC,aAAa,CAAC,CAAA;IAE5B,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;IAC5D,CAAC;IAED,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QAC1B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;QACpC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,CAAA;IAE7C,OAAO,KAAK,CAAA;AACd,CAAC","sourcesContent":["import { In } from 'typeorm'\n\nimport {\n getQueryBuilderFromListParams,\n getRepository,\n getTimesForPeriod,\n ListParam,\n Sorting,\n getDomainIdsWithAncestors\n} from '@things-factory/shell'\n\nimport { DataSet, DataSetSummaryPeriodType } from '../service/data-set/data-set.js'\nimport { DataSummary } from '../service/data-summary/data-summary.js'\n\nconst STAT_FUNCTION_MAP = {\n sum: 'sum',\n mean: 'mean',\n stddev: 'standardDeviation',\n variance: 'variance',\n min: 'min',\n max: 'max',\n range: 'range',\n median: 'median',\n mode: 'mode'\n}\n\nexport async function queryDataSummaryByPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month',\n dataSetName: string,\n dataKeys: string[] | null,\n params: ListParam,\n context: ResolverContext\n): Promise<DataSummary[]> {\n const { domain, user, tx } = context.state\n const { t } = context\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const dataSet = await getRepository(DataSet).findOne({\n where: { domain: { id: In(domainIds) }, name: dataSetName },\n relations: ['dataKeySet']\n })\n\n if (!dataSet) {\n throw new Error(t('error.dataset not found', { dataSetName }))\n }\n\n // limitations\n const summaryPeriodType = dataSet.summaryPeriod\n if (\n (summaryPeriodType == DataSetSummaryPeriodType.Day || summaryPeriodType == DataSetSummaryPeriodType.WorkDate) &&\n period == 'today'\n ) {\n throw new Error(t('error.summary not supported', { dataSetName, period: t(`label.period-${period}`) }))\n }\n\n // dataKeys 가 설정되지 않았다면, dataSet의 dataKeySet을 그대로 적용한다는 의미임.\n // dataKeys == [] 라면, dataKeySet을 적용하지 않는다는 의미임.\n // dataKeys에는 dataKeySet의 dataKey 값을 따라야 한다.\n const dataKeyItems = !dataSet.dataKeySet?.dataKeyItems\n ? []\n : dataKeys\n ? dataKeys\n .map(dataKey => {\n return dataSet.dataKeySet.dataKeyItems.find(item => item.dataKey == dataKey)\n })\n .filter(Boolean)\n : dataSet.dataKeySet.dataKeyItems\n\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n const dataItems = dataSet.dataItems.filter(item => item.agg)\n\n const { date, month } = params.filters.reduce(\n (acc, filter) => {\n if (filter.name === 'date') acc.date = filter.value\n if (filter.name === 'month') acc.month = filter.value\n return acc\n },\n { date: null, month: null }\n )\n\n const { from, to } = await getTimesForPeriod(period, { date, month }, context)\n\n const selectPeriod = queryBuilder => {\n if (period == 'today') {\n queryBuilder.addSelect('summary.date', 'date').addSelect('summary.period', 'period')\n } else if (['this year', '12 months'].includes(period)) {\n queryBuilder.addSelect('SUBSTRING(summary.date, 1, 7) AS month')\n } else {\n queryBuilder.addSelect('summary.date', 'date')\n }\n\n return queryBuilder\n }\n const selectKeys = dataKeyItems.map((item, index) => {\n const aliasName = `key0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n return `${columnName} as ${aliasName}`\n }) as string[]\n const selectData = dataItems.map((item, index) => {\n const aliasName = `data0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n switch (item.agg) {\n case STAT_FUNCTION_MAP.sum:\n return `SUM(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mean:\n // 일차 mean 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `AVG(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.stddev:\n // 일차 stddev 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `STDDEV(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.variance:\n // 일차 variance 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `VARIANCE(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.min:\n return `MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.max:\n return `MAX(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.range:\n // 일차 range 값들을 다시 계산하므로, 무의미할 수 있다.\n return `MAX(${columnName}) - MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mode:\n // not guaranteed\n return `MODE() WITHIN GROUP (ORDER BY ${columnName})`\n default:\n return `AVG(${columnName}) as ${aliasName}`\n }\n })\n\n const groupByPeriod =\n period == 'today'\n ? 'summary.date, summary.period'\n : ['this year', '12 months'].includes(period)\n ? 'SUBSTRING(summary.date, 1, 7)'\n : 'summary.date'\n const groupByKeys = dataKeyItems\n .map((item, index) => {\n return `summary.key0${index + 1}`\n })\n .join(', ')\n\n const desc = false\n var orderByPeriod: Sorting[] =\n period == 'today'\n ? [\n { name: 'date', desc },\n { name: 'period', desc }\n ]\n : ['this year', '12 months'].includes(period)\n ? [{ name: 'month', desc }]\n : [{ name: 'date', desc }]\n\n if (params?.sortings && params.sortings.length > 0) {\n orderByPeriod = params.sortings\n }\n\n var queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSummary),\n params: {\n ...params,\n filters: params?.filters?.filter(({ name }) => name !== 'date' && name !== 'month') || [],\n sortings: []\n },\n domain: undefined,\n alias: 'summary',\n searchables: searchables\n })\n .select('summary.dataSet')\n .addSelect(selectData)\n .addSelect('SUM(summary.count)', 'count')\n .addSelect('SUM(summary.countOoc)', 'countOoc')\n .addSelect('SUM(summary.countOos)', 'countOos')\n\n queryBuilder = selectPeriod(queryBuilder)\n .innerJoin('summary.dataSet', 'ds', 'ds.id = :dataSetName', {\n dataSetName: dataSet.id\n })\n .andWhere('summary.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })\n .andWhere('summary.date >= :from', { from })\n .andWhere('summary.date < :to', { to })\n .addGroupBy('summary.dataSet')\n .addGroupBy(groupByPeriod)\n\n if (dataKeyItems.length > 0) {\n queryBuilder.addSelect(selectKeys).addGroupBy(groupByKeys)\n }\n\n orderByPeriod.map(orderBy => {\n const { name: sort, desc } = orderBy\n queryBuilder.addOrderBy(sort, desc ? 'DESC' : 'ASC')\n })\n\n const items = await queryBuilder.getRawMany()\n\n return items\n}\n"]}
|
package/dist-server/routes.js
CHANGED
|
@@ -10,7 +10,6 @@ const shiny_report_js_1 = require("./controllers/shiny-report.js");
|
|
|
10
10
|
const issue_data_collection_task_js_1 = require("./controllers/issue-data-collection-task.js");
|
|
11
11
|
const data_sensor_js_1 = require("./service/data-sensor/data-sensor.js");
|
|
12
12
|
const data_set_js_1 = require("./service/data-set/data-set.js");
|
|
13
|
-
const domain_inheritance_js_1 = require("./utils/domain-inheritance.js");
|
|
14
13
|
process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) => {
|
|
15
14
|
/*
|
|
16
15
|
* can add global public routes to application (auth not required, tenancy not required)
|
|
@@ -116,7 +115,7 @@ process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) =>
|
|
|
116
115
|
if (!domain) {
|
|
117
116
|
throw new Error(`domain(${domainId}) not found`);
|
|
118
117
|
}
|
|
119
|
-
const domainIds = await (0,
|
|
118
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
120
119
|
const dataSet = await tx
|
|
121
120
|
.getRepository(data_set_js_1.DataSet)
|
|
122
121
|
.findOne({ where: { domain: { id: (0, typeorm_1.In)(domainIds) }, id: dataSetId } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\n\nimport { Domain, getDataSource } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { runScenario } from '@things-factory/integration-base'\nimport { ScheduleRegisterRequest } from '@things-factory/scheduler-client'\n\nimport { createDataSample } from './controllers/create-data-sample.js'\nimport { renderJasperReport } from './controllers/jasper-report.js'\nimport { renderShinyReport } from './controllers/shiny-report.js'\nimport { issueDataCollectionTask } from './controllers/issue-data-collection-task.js'\nimport { DataSensor } from './service/data-sensor/data-sensor.js'\nimport { DataSet } from './service/data-set/data-set.js'\nimport { getDomainIdsWithAncestors } from './utils/domain-inheritance.js'\n\nprocess.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {\n /*\n * can add global public routes to application (auth not required, tenancy not required)\n *\n * ex) routes.get('/path', async(context, next) => {})\n * ex) routes.post('/path', async(context, next) => {})\n */\n\n globalPublicRouter.post('/sensor-data', async (context, next) => {\n // 데이타 검증\n const { deviceId, data, rawData, timestamp = Date.now() } = context.request.body\n if (!deviceId) {\n throw new Error(`The deviceId(${deviceId}) property are mandatory`)\n }\n\n // make new data-sample\n await getDataSource().transaction(async tx => {\n // find sensor through deviceId\n const sensor = await tx.getRepository(DataSensor).findOne({\n where: { deviceId },\n relations: ['domain', 'appliance', 'dataSet', 'decoder']\n })\n\n if (!sensor) {\n throw new Error(`Sensor having given deviceId(${deviceId}) not found`)\n }\n\n if (!sensor.active) {\n throw new Error(`State of the sensor given deviceId(${deviceId}) is not active`)\n }\n\n if (!sensor.appliance) {\n throw new Error(`Appliance of the sensor given deviceId(${deviceId}) is not set up`)\n }\n\n const domain = sensor.domain\n const dataSet = sensor.dataSet\n\n /* \n 원칙적으로 user 인증정보를 가지고 요청해야 하지만, 인증정보를 보낼 수 없는 상황이라고 전제하여 처리한다.\n 앞으로, 보완되어야 한다.\n */\n const user: User =\n context.user ||\n (await tx.getRepository(User).findOne({\n where: {\n reference: sensor.appliance.id,\n userType: 'appliance'\n }\n }))\n\n context.state = {\n user,\n ...context.state,\n domain,\n tx\n }\n\n var decoded\n if (sensor.decoder) {\n const { name: scenarioName } = sensor.decoder\n const variables = {\n dataSensor: sensor,\n source: deviceId,\n data,\n rawData,\n timestamp\n }\n\n decoded = (await runScenario(null, scenarioName, variables, context))?.result\n }\n\n if (dataSet) {\n await createDataSample(\n {\n dataSet,\n data,\n rawData,\n source: deviceId,\n collectedAt: new Date(timestamp),\n ...decoded\n },\n context\n )\n }\n\n context.status = 200\n context.body = {\n data,\n ...decoded\n }\n })\n })\n\n /* When a callback occurs from the scheduler when a scheduled dataset is on schedule, data collection task for the dataset should be issued. */\n globalPublicRouter.post('/callback-schedule-for-dataset', async (context, next) => {\n const { client } = context.request.body as ScheduleRegisterRequest\n\n if (!client || typeof client !== 'object') {\n throw new Error('client property should be a part of callback body.')\n }\n\n const { group: domainId, key: dataSetId } = client\n\n if (!domainId || !dataSetId) {\n throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`)\n }\n\n await issueDataCollectionTask(domainId, dataSetId, context)\n\n context.status = 200\n })\n\n /* When a callback occurs from the scheduler when a scheduled summary is on schedule, data summary procedure for the dataset should be executed. */\n globalPublicRouter.post('/callback-schedule-for-data-summary', async (context, next) => {\n const { client } = context.request.body as ScheduleRegisterRequest\n\n if (!client || typeof client !== 'object') {\n throw new Error('client property should be a part of callback body.')\n }\n\n const { group: domainId, key: dataSetId } = client\n\n if (!domainId || !dataSetId) {\n throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`)\n }\n\n await getDataSource().transaction(async tx => {\n const domain = await tx.getRepository(Domain).findOneBy({ id: domainId })\n\n if (!domain) {\n throw new Error(`domain(${domainId}) not found`)\n }\n\n const domainIds = await getDomainIdsWithAncestors(domain)\n const dataSet = await tx\n .getRepository(DataSet)\n .findOne({ where: { domain: { id: In(domainIds) }, id: dataSetId } })\n\n // do what you gotta do\n })\n\n context.status = 200\n })\n})\n\nprocess.on('bootstrap-module-global-private-route' as any, (app, globalPrivateRouter) => {\n /*\n * can add global private routes to application (auth required, tenancy not required)\n */\n})\n\nprocess.on('bootstrap-module-domain-public-route' as any, (app, domainPublicRouter) => {\n /*\n * can add domain public routes to application (auth not required, tenancy required)\n */\n})\n\nprocess.on('bootstrap-module-domain-private-route' as any, (app, domainPrivateRouter) => {\n /*\n * can add domain private routes to application (auth required, tenancy required)\n */\n domainPrivateRouter.get('/data-report/jasper', async (context, next) => {\n context.body = await renderJasperReport(context)\n })\n\n domainPrivateRouter.get('/data-report/shiny', async (context, next) => {\n await renderShinyReport(context)\n })\n\n domainPrivateRouter.get('/data-report/:reportType', async (context, next) => {\n let { reportType } = context.params\n context.body = `${reportType} Not Implemented.`\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\n\nimport { Domain, getDataSource, getDomainIdsWithAncestors } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { runScenario } from '@things-factory/integration-base'\nimport { ScheduleRegisterRequest } from '@things-factory/scheduler-client'\n\nimport { createDataSample } from './controllers/create-data-sample.js'\nimport { renderJasperReport } from './controllers/jasper-report.js'\nimport { renderShinyReport } from './controllers/shiny-report.js'\nimport { issueDataCollectionTask } from './controllers/issue-data-collection-task.js'\nimport { DataSensor } from './service/data-sensor/data-sensor.js'\nimport { DataSet } from './service/data-set/data-set.js'\n\nprocess.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {\n /*\n * can add global public routes to application (auth not required, tenancy not required)\n *\n * ex) routes.get('/path', async(context, next) => {})\n * ex) routes.post('/path', async(context, next) => {})\n */\n\n globalPublicRouter.post('/sensor-data', async (context, next) => {\n // 데이타 검증\n const { deviceId, data, rawData, timestamp = Date.now() } = context.request.body\n if (!deviceId) {\n throw new Error(`The deviceId(${deviceId}) property are mandatory`)\n }\n\n // make new data-sample\n await getDataSource().transaction(async tx => {\n // find sensor through deviceId\n const sensor = await tx.getRepository(DataSensor).findOne({\n where: { deviceId },\n relations: ['domain', 'appliance', 'dataSet', 'decoder']\n })\n\n if (!sensor) {\n throw new Error(`Sensor having given deviceId(${deviceId}) not found`)\n }\n\n if (!sensor.active) {\n throw new Error(`State of the sensor given deviceId(${deviceId}) is not active`)\n }\n\n if (!sensor.appliance) {\n throw new Error(`Appliance of the sensor given deviceId(${deviceId}) is not set up`)\n }\n\n const domain = sensor.domain\n const dataSet = sensor.dataSet\n\n /* \n 원칙적으로 user 인증정보를 가지고 요청해야 하지만, 인증정보를 보낼 수 없는 상황이라고 전제하여 처리한다.\n 앞으로, 보완되어야 한다.\n */\n const user: User =\n context.user ||\n (await tx.getRepository(User).findOne({\n where: {\n reference: sensor.appliance.id,\n userType: 'appliance'\n }\n }))\n\n context.state = {\n user,\n ...context.state,\n domain,\n tx\n }\n\n var decoded\n if (sensor.decoder) {\n const { name: scenarioName } = sensor.decoder\n const variables = {\n dataSensor: sensor,\n source: deviceId,\n data,\n rawData,\n timestamp\n }\n\n decoded = (await runScenario(null, scenarioName, variables, context))?.result\n }\n\n if (dataSet) {\n await createDataSample(\n {\n dataSet,\n data,\n rawData,\n source: deviceId,\n collectedAt: new Date(timestamp),\n ...decoded\n },\n context\n )\n }\n\n context.status = 200\n context.body = {\n data,\n ...decoded\n }\n })\n })\n\n /* When a callback occurs from the scheduler when a scheduled dataset is on schedule, data collection task for the dataset should be issued. */\n globalPublicRouter.post('/callback-schedule-for-dataset', async (context, next) => {\n const { client } = context.request.body as ScheduleRegisterRequest\n\n if (!client || typeof client !== 'object') {\n throw new Error('client property should be a part of callback body.')\n }\n\n const { group: domainId, key: dataSetId } = client\n\n if (!domainId || !dataSetId) {\n throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`)\n }\n\n await issueDataCollectionTask(domainId, dataSetId, context)\n\n context.status = 200\n })\n\n /* When a callback occurs from the scheduler when a scheduled summary is on schedule, data summary procedure for the dataset should be executed. */\n globalPublicRouter.post('/callback-schedule-for-data-summary', async (context, next) => {\n const { client } = context.request.body as ScheduleRegisterRequest\n\n if (!client || typeof client !== 'object') {\n throw new Error('client property should be a part of callback body.')\n }\n\n const { group: domainId, key: dataSetId } = client\n\n if (!domainId || !dataSetId) {\n throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`)\n }\n\n await getDataSource().transaction(async tx => {\n const domain = await tx.getRepository(Domain).findOneBy({ id: domainId })\n\n if (!domain) {\n throw new Error(`domain(${domainId}) not found`)\n }\n\n const domainIds = await getDomainIdsWithAncestors(domain)\n const dataSet = await tx\n .getRepository(DataSet)\n .findOne({ where: { domain: { id: In(domainIds) }, id: dataSetId } })\n\n // do what you gotta do\n })\n\n context.status = 200\n })\n})\n\nprocess.on('bootstrap-module-global-private-route' as any, (app, globalPrivateRouter) => {\n /*\n * can add global private routes to application (auth required, tenancy not required)\n */\n})\n\nprocess.on('bootstrap-module-domain-public-route' as any, (app, domainPublicRouter) => {\n /*\n * can add domain public routes to application (auth not required, tenancy required)\n */\n})\n\nprocess.on('bootstrap-module-domain-private-route' as any, (app, domainPrivateRouter) => {\n /*\n * can add domain private routes to application (auth required, tenancy required)\n */\n domainPrivateRouter.get('/data-report/jasper', async (context, next) => {\n context.body = await renderJasperReport(context)\n })\n\n domainPrivateRouter.get('/data-report/shiny', async (context, next) => {\n await renderShinyReport(context)\n })\n\n domainPrivateRouter.get('/data-report/:reportType', async (context, next) => {\n let { reportType } = context.params\n context.body = `${reportType} Not Implemented.`\n })\n})\n"]}
|
|
@@ -8,19 +8,18 @@ const auth_base_1 = require("@things-factory/auth-base");
|
|
|
8
8
|
const shell_1 = require("@things-factory/shell");
|
|
9
9
|
const data_archive_js_1 = require("./data-archive.js");
|
|
10
10
|
const data_archive_type_js_1 = require("./data-archive-type.js");
|
|
11
|
-
const domain_inheritance_js_1 = require("../../utils/domain-inheritance.js");
|
|
12
11
|
var parser = require('cron-parser');
|
|
13
12
|
let DataArchiveQuery = class DataArchiveQuery {
|
|
14
13
|
async dataArchive(id, context) {
|
|
15
14
|
const { domain } = context.state;
|
|
16
|
-
const domainIds = await (0,
|
|
15
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
17
16
|
return await (0, shell_1.getRepository)(data_archive_js_1.DataArchive).findOne({
|
|
18
17
|
where: { domain: { id: (0, typeorm_1.In)(domainIds) }, id }
|
|
19
18
|
});
|
|
20
19
|
}
|
|
21
20
|
async dataArchives(params, context) {
|
|
22
21
|
const { domain } = context.state;
|
|
23
|
-
const domainIds = await (0,
|
|
22
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
24
23
|
const queryBuilder = (0, shell_1.getQueryBuilderFromListParams)({
|
|
25
24
|
repository: (0, shell_1.getRepository)(data_archive_js_1.DataArchive),
|
|
26
25
|
params,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-archive-query.js","sourceRoot":"","sources":["../../../server/service/data-archive/data-archive-query.ts"],"names":[],"mappings":";;;;AAAA,+CAA8F;AAC9F,qCAA4B;AAE5B,yDAAsD;AACtD,
|
|
1
|
+
{"version":3,"file":"data-archive-query.js","sourceRoot":"","sources":["../../../server/service/data-archive/data-archive-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { Role, User } from '@things-factory/auth-base'\nimport { Domain, getQueryBuilderFromListParams, ListParam, getRepository, getDomainIdsWithAncestors } from '@things-factory/shell'\n\nimport { DataArchive } from './data-archive.js'\nimport { DataArchiveList } from './data-archive-type.js'\n\nvar parser = require('cron-parser')\n\n@Resolver(DataArchive)\nexport class DataArchiveQuery {\n @Directive('@privilege(category: \"data-archive\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataArchive, {\n description:\n 'Retrieves a single data archive by its unique identifier. This query fetches detailed information about a data archive request including its status, download URL, and associated dataset information for data export purposes.'\n })\n async dataArchive(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataArchive> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n return await getRepository(DataArchive).findOne({\n where: { domain: { id: In(domainIds) }, id }\n })\n }\n\n @Directive('@privilege(category: \"data-archive\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataArchiveList, {\n description:\n 'Retrieves multiple data archives with pagination support. This query is used for listing and managing data export requests, allowing users to track the status of their data download requests and access completed archives.'\n })\n async dataArchives(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<DataArchiveList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataArchive),\n params,\n domain: undefined,\n alias: 'dataArchive',\n searchables: []\n })\n\n queryBuilder.andWhere('dataArchive.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Domain, {\n description:\n 'Retrieves the domain that this data archive belongs to. This field resolver provides access to the organizational context and settings associated with the archive request.'\n })\n async domain(@Root() dataArchive: DataArchive): Promise<Domain> {\n return dataArchive.domainId && (await getRepository(Domain).findOneBy({ id: dataArchive.domainId }))\n }\n\n @FieldResolver(type => User, {\n description:\n 'Retrieves the user who last updated this data archive. This field resolver identifies the person responsible for the most recent modifications to the archive request.'\n })\n async updater(@Root() dataArchive: DataArchive): Promise<User> {\n return dataArchive.updaterId && (await getRepository(User).findOneBy({ id: dataArchive.updaterId }))\n }\n\n @FieldResolver(type => User, {\n description:\n 'Retrieves the user who created this data archive request. This field resolver identifies the person responsible for initiating the data export and download process.'\n })\n async creator(@Root() dataArchive: DataArchive): Promise<User> {\n return dataArchive.creatorId && (await getRepository(User).findOneBy({ id: dataArchive.creatorId }))\n }\n}\n"]}
|
|
@@ -9,18 +9,17 @@ const auth_base_1 = require("@things-factory/auth-base");
|
|
|
9
9
|
const shell_1 = require("@things-factory/shell");
|
|
10
10
|
const data_key_set_js_1 = require("./data-key-set.js");
|
|
11
11
|
const data_key_set_type_js_1 = require("./data-key-set-type.js");
|
|
12
|
-
const domain_inheritance_js_1 = require("../../utils/domain-inheritance.js");
|
|
13
12
|
let DataKeySetQuery = class DataKeySetQuery {
|
|
14
13
|
async dataKeySet(id, context) {
|
|
15
14
|
const { domain } = context.state;
|
|
16
|
-
const domainIds = await (0,
|
|
15
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
17
16
|
return await (0, shell_1.getRepository)(data_key_set_js_1.DataKeySet).findOne({
|
|
18
17
|
where: { domain: { id: (0, typeorm_1.In)(domainIds) }, id }
|
|
19
18
|
});
|
|
20
19
|
}
|
|
21
20
|
async dataKeySets(params, context) {
|
|
22
21
|
const { domain } = context.state;
|
|
23
|
-
const domainIds = await (0,
|
|
22
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
24
23
|
const queryBuilder = (0, shell_1.getQueryBuilderFromListParams)({
|
|
25
24
|
// 도메인 필터링은 ancestor 기반으로 직접 적용
|
|
26
25
|
domain: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-key-set-query.js","sourceRoot":"","sources":["../../../server/service/data-key-set/data-key-set-query.ts"],"names":[],"mappings":";;;;AAAA,qCAA4B;AAC5B,+CAAmF;AAEnF,qEAA4D;AAC5D,yDAAgD;AAChD,
|
|
1
|
+
{"version":3,"file":"data-key-set-query.js","sourceRoot":"","sources":["../../../server/service/data-key-set/data-key-set-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\nimport { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'\n\nimport { Attachment } from '@things-factory/attachment-base'\nimport { User } from '@things-factory/auth-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam, getDomainIdsWithAncestors } from '@things-factory/shell'\n\nimport { DataKeySet } from './data-key-set.js'\nimport { DataKeySetList } from './data-key-set-type.js'\n\n@Resolver(DataKeySet)\nexport class DataKeySetQuery {\n @Query(returns => DataKeySet!, {\n nullable: true,\n description:\n 'Retrieves a single data key set by its unique identifier. This query fetches detailed information about a key set including its key items, configuration, and metadata. Data key sets define the indexing and categorization structure for data samples and summaries.'\n })\n async dataKeySet(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataKeySet> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n return await getRepository(DataKeySet).findOne({\n where: { domain: { id: In(domainIds) }, id }\n })\n }\n\n @Query(returns => DataKeySetList, {\n description:\n 'Retrieves multiple data key sets with pagination and filtering support. This query allows searching key sets by name and description, and is used for listing and managing data categorization structures across all datasets.'\n })\n async dataKeySets(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<DataKeySetList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const queryBuilder = getQueryBuilderFromListParams({\n // 도메인 필터링은 ancestor 기반으로 직접 적용\n domain: undefined,\n params,\n repository: getRepository(DataKeySet),\n searchables: ['name', 'description']\n })\n\n queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {\n ancestorDomainIds: domainIds\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => String, {\n description:\n 'Retrieves the thumbnail image path for this data key set. This field resolver provides access to visual representation of the key set, typically used for display purposes in user interfaces.'\n })\n async thumbnail(@Root() dataKeySet: DataKeySet): Promise<string | undefined> {\n const attachment: Attachment = await getRepository(Attachment).findOne({\n where: {\n domain: { id: dataKeySet.domainId },\n refType: DataKeySet.name,\n refBy: dataKeySet.id\n }\n })\n\n return attachment?.fullpath\n }\n\n @FieldResolver(type => Domain, {\n description:\n 'Retrieves the domain that this data key set belongs to. This field resolver provides access to the organizational context and settings associated with the key set.'\n })\n async domain(@Root() dataKeySet: DataKeySet): Promise<Domain> {\n return dataKeySet.domainId && (await getRepository(Domain).findOneBy({ id: dataKeySet.domainId }))\n }\n\n @FieldResolver(type => User, {\n description:\n 'Retrieves the user who last updated this data key set. This field resolver identifies the person responsible for the most recent modifications to the key set configuration.'\n })\n async updater(@Root() dataKeySet: DataKeySet): Promise<User> {\n return dataKeySet.updaterId && (await getRepository(User).findOneBy({ id: dataKeySet.updaterId }))\n }\n\n @FieldResolver(type => User, {\n description:\n 'Retrieves the user who created this data key set. This field resolver identifies the person responsible for initially defining the key set structure and configuration.'\n })\n async creator(@Root() dataKeySet: DataKeySet): Promise<User> {\n return dataKeySet.creatorId && (await getRepository(User).findOneBy({ id: dataKeySet.creatorId }))\n }\n}\n"]}
|
|
@@ -13,18 +13,17 @@ const data_set_js_1 = require("../data-set/data-set.js");
|
|
|
13
13
|
const data_sample_js_1 = require("../data-sample/data-sample.js");
|
|
14
14
|
const data_ooc_js_1 = require("./data-ooc.js");
|
|
15
15
|
const data_ooc_type_js_1 = require("./data-ooc-type.js");
|
|
16
|
-
const domain_inheritance_js_1 = require("../../utils/domain-inheritance.js");
|
|
17
16
|
let DataOocQuery = class DataOocQuery {
|
|
18
17
|
async dataOoc(id, context) {
|
|
19
18
|
const { domain } = context.state;
|
|
20
|
-
const domainIds = await (0,
|
|
19
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
21
20
|
return await (0, shell_1.getRepository)(data_ooc_js_1.DataOoc).findOne({
|
|
22
21
|
where: { domain: { id: (0, typeorm_1.In)(domainIds) }, id }
|
|
23
22
|
});
|
|
24
23
|
}
|
|
25
24
|
async dataOocs(params, context) {
|
|
26
25
|
const { domain } = context.state;
|
|
27
|
-
const domainIds = await (0,
|
|
26
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
28
27
|
const queryBuilder = (0, shell_1.getQueryBuilderFromListParams)({
|
|
29
28
|
repository: (0, shell_1.getRepository)(data_ooc_js_1.DataOoc),
|
|
30
29
|
params,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-ooc-query.js","sourceRoot":"","sources":["../../../server/service/data-ooc/data-ooc-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { ActivityInstance } from '@things-factory/worklist'\n\nimport { DataSetHistory } from '../data-set-history/data-set-history.js'\nimport { DataItem } from '../data-set/data-item-type.js'\nimport { DataSet } from '../data-set/data-set.js'\nimport { DataSample } from '../data-sample/data-sample.js'\nimport { DataOoc } from './data-ooc.js'\nimport { DataOocList } from './data-ooc-type.js'\nimport { getDomainIdsWithAncestors } from '../../utils/domain-inheritance.js'\n\n@Resolver(DataOoc)\nexport class DataOocQuery {\n @Directive('@privilege(category: \"data-ooc\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataOoc, {\n description:\n 'Retrieves a single out-of-control (OOC) record by its unique identifier. This query fetches detailed information about an OOC event including its status, corrective actions, review process, and associated data sample.'\n })\n async dataOoc(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataOoc> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n return await getRepository(DataOoc).findOne({\n where: { domain: { id: In(domainIds) }, id }\n })\n }\n\n @Directive('@privilege(category: \"data-ooc\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataOocList, {\n description:\n 'Retrieves multiple out-of-control (OOC) records with pagination and filtering support. This query allows searching OOC events by name and description, and is used for monitoring and managing quality control issues across all datasets.'\n })\n async dataOocs(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<DataOocList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataOoc),\n params,\n domain: undefined,\n searchables: ['name', 'description']\n })\n\n queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {\n ancestorDomainIds: domainIds\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => [DataItem], {\n description:\n 'Retrieves the data items (field definitions) associated with this OOC record. These items define the structure and validation rules for the OOC data, including field names, types, and constraints.'\n })\n async dataItems(@Root() dataOoc: DataOoc): Promise<DataItem[]> {\n const dataSetHistory: DataSetHistory =\n dataOoc.dataSetId &&\n (await getRepository(DataSetHistory).findOne({\n where: {\n originalId: dataOoc.dataSetId,\n version: dataOoc.dataSetVersion\n }\n }))\n return dataSetHistory?.dataItems.filter(item => item.active) || []\n }\n\n @FieldResolver(type => DataSample, {\n description:\n 'Retrieves the original data sample that triggered this OOC event. This field resolver provides access to the source data that was flagged as out of control or out of specification.'\n })\n async dataSample(@Root() dataOoc: DataOoc): Promise<DataSample> {\n return dataOoc.dataSampleId && (await getRepository(DataSample).findOneBy({ id: dataOoc.dataSampleId }))\n }\n\n @FieldResolver(type => DataSet, {\n description:\n 'Retrieves the dataset that this OOC event belongs to. This field resolver provides access to the dataset configuration and settings associated with the OOC event.'\n })\n async dataSet(@Root() dataOoc: DataOoc): Promise<DataSet> {\n return dataOoc.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataOoc.dataSetId }))\n }\n\n @FieldResolver(type => ActivityInstance, {\n description:\n 'Retrieves the review activity instance associated with this OOC event. This field resolver provides access to the workflow process for reviewing and approving the OOC event.'\n })\n async reviewActivityInstance(@Root() dataOoc: DataOoc): Promise<ActivityInstance> {\n return (\n dataOoc.reviewActivityInstanceId &&\n (await getRepository(ActivityInstance).findOneBy({ id: dataOoc.reviewActivityInstanceId }))\n )\n }\n\n @FieldResolver(type => ActivityInstance, {\n description:\n 'Retrieves the resolution activity instance associated with this OOC event. This field resolver provides access to the workflow process for implementing corrective actions and resolving the OOC issue.'\n })\n async resolveActivityInstance(@Root() dataOoc: DataOoc): Promise<ActivityInstance> {\n return (\n dataOoc.resolveActivityInstanceId &&\n (await getRepository(ActivityInstance).findOneBy({ id: dataOoc.resolveActivityInstanceId }))\n )\n }\n\n @FieldResolver(type => User, {\n description:\n 'Retrieves the user who implemented the corrective action for this OOC event. This field resolver identifies the person responsible for resolving the out-of-control situation.'\n })\n async corrector(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.correctorId && (await getRepository(User).findOneBy({ id: dataOoc.correctorId }))\n }\n\n @FieldResolver(type => User, {\n description:\n 'Retrieves the user who reviewed this OOC event. This field resolver identifies the person responsible for reviewing and approving the out-of-control situation.'\n })\n async reviewer(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.reviewerId && (await getRepository(User).findOneBy({ id: dataOoc.reviewerId }))\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() dataOoc: DataOoc): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: dataOoc.domainId })\n }\n\n @FieldResolver(type => User)\n async updater(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.updaterId && (await getRepository(User).findOneBy({ id: dataOoc.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.creatorId && (await getRepository(User).findOneBy({ id: dataOoc.creatorId }))\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-ooc-query.js","sourceRoot":"","sources":["../../../server/service/data-ooc/data-ooc-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam, getDomainIdsWithAncestors } from '@things-factory/shell'\nimport { ActivityInstance } from '@things-factory/worklist'\n\nimport { DataSetHistory } from '../data-set-history/data-set-history.js'\nimport { DataItem } from '../data-set/data-item-type.js'\nimport { DataSet } from '../data-set/data-set.js'\nimport { DataSample } from '../data-sample/data-sample.js'\nimport { DataOoc } from './data-ooc.js'\nimport { DataOocList } from './data-ooc-type.js'\n\n@Resolver(DataOoc)\nexport class DataOocQuery {\n @Directive('@privilege(category: \"data-ooc\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataOoc, {\n description:\n 'Retrieves a single out-of-control (OOC) record by its unique identifier. This query fetches detailed information about an OOC event including its status, corrective actions, review process, and associated data sample.'\n })\n async dataOoc(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataOoc> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n return await getRepository(DataOoc).findOne({\n where: { domain: { id: In(domainIds) }, id }\n })\n }\n\n @Directive('@privilege(category: \"data-ooc\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataOocList, {\n description:\n 'Retrieves multiple out-of-control (OOC) records with pagination and filtering support. This query allows searching OOC events by name and description, and is used for monitoring and managing quality control issues across all datasets.'\n })\n async dataOocs(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<DataOocList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataOoc),\n params,\n domain: undefined,\n searchables: ['name', 'description']\n })\n\n queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {\n ancestorDomainIds: domainIds\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => [DataItem], {\n description:\n 'Retrieves the data items (field definitions) associated with this OOC record. These items define the structure and validation rules for the OOC data, including field names, types, and constraints.'\n })\n async dataItems(@Root() dataOoc: DataOoc): Promise<DataItem[]> {\n const dataSetHistory: DataSetHistory =\n dataOoc.dataSetId &&\n (await getRepository(DataSetHistory).findOne({\n where: {\n originalId: dataOoc.dataSetId,\n version: dataOoc.dataSetVersion\n }\n }))\n return dataSetHistory?.dataItems.filter(item => item.active) || []\n }\n\n @FieldResolver(type => DataSample, {\n description:\n 'Retrieves the original data sample that triggered this OOC event. This field resolver provides access to the source data that was flagged as out of control or out of specification.'\n })\n async dataSample(@Root() dataOoc: DataOoc): Promise<DataSample> {\n return dataOoc.dataSampleId && (await getRepository(DataSample).findOneBy({ id: dataOoc.dataSampleId }))\n }\n\n @FieldResolver(type => DataSet, {\n description:\n 'Retrieves the dataset that this OOC event belongs to. This field resolver provides access to the dataset configuration and settings associated with the OOC event.'\n })\n async dataSet(@Root() dataOoc: DataOoc): Promise<DataSet> {\n return dataOoc.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataOoc.dataSetId }))\n }\n\n @FieldResolver(type => ActivityInstance, {\n description:\n 'Retrieves the review activity instance associated with this OOC event. This field resolver provides access to the workflow process for reviewing and approving the OOC event.'\n })\n async reviewActivityInstance(@Root() dataOoc: DataOoc): Promise<ActivityInstance> {\n return (\n dataOoc.reviewActivityInstanceId &&\n (await getRepository(ActivityInstance).findOneBy({ id: dataOoc.reviewActivityInstanceId }))\n )\n }\n\n @FieldResolver(type => ActivityInstance, {\n description:\n 'Retrieves the resolution activity instance associated with this OOC event. This field resolver provides access to the workflow process for implementing corrective actions and resolving the OOC issue.'\n })\n async resolveActivityInstance(@Root() dataOoc: DataOoc): Promise<ActivityInstance> {\n return (\n dataOoc.resolveActivityInstanceId &&\n (await getRepository(ActivityInstance).findOneBy({ id: dataOoc.resolveActivityInstanceId }))\n )\n }\n\n @FieldResolver(type => User, {\n description:\n 'Retrieves the user who implemented the corrective action for this OOC event. This field resolver identifies the person responsible for resolving the out-of-control situation.'\n })\n async corrector(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.correctorId && (await getRepository(User).findOneBy({ id: dataOoc.correctorId }))\n }\n\n @FieldResolver(type => User, {\n description:\n 'Retrieves the user who reviewed this OOC event. This field resolver identifies the person responsible for reviewing and approving the out-of-control situation.'\n })\n async reviewer(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.reviewerId && (await getRepository(User).findOneBy({ id: dataOoc.reviewerId }))\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() dataOoc: DataOoc): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: dataOoc.domainId })\n }\n\n @FieldResolver(type => User)\n async updater(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.updaterId && (await getRepository(User).findOneBy({ id: dataOoc.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() dataOoc: DataOoc): Promise<User> {\n return dataOoc.creatorId && (await getRepository(User).findOneBy({ id: dataOoc.creatorId }))\n }\n}\n"]}
|
|
@@ -14,18 +14,17 @@ const data_set_js_1 = require("../data-set/data-set.js");
|
|
|
14
14
|
const data_ooc_js_1 = require("../data-ooc/data-ooc.js");
|
|
15
15
|
const data_sample_js_1 = require("./data-sample.js");
|
|
16
16
|
const data_sample_type_js_1 = require("./data-sample-type.js");
|
|
17
|
-
const domain_inheritance_js_1 = require("../../utils/domain-inheritance.js");
|
|
18
17
|
let DataSampleQuery = class DataSampleQuery {
|
|
19
18
|
async dataSample(id, context) {
|
|
20
19
|
const { domain } = context.state;
|
|
21
|
-
const domainIds = await (0,
|
|
20
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
22
21
|
return await (0, shell_1.getRepository)(data_sample_js_1.DataSample).findOne({
|
|
23
22
|
where: { domain: { id: (0, typeorm_1.In)(domainIds) }, id }
|
|
24
23
|
});
|
|
25
24
|
}
|
|
26
25
|
async dataSamples(params, context) {
|
|
27
26
|
const { domain } = context.state;
|
|
28
|
-
const domainIds = await (0,
|
|
27
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
29
28
|
const queryBuilder = (0, shell_1.getQueryBuilderFromListParams)({
|
|
30
29
|
repository: (0, shell_1.getRepository)(data_sample_js_1.DataSample),
|
|
31
30
|
params,
|
|
@@ -40,7 +39,7 @@ let DataSampleQuery = class DataSampleQuery {
|
|
|
40
39
|
}
|
|
41
40
|
async dataSamplesByDataSet(dataSetId, params, context) {
|
|
42
41
|
const { domain } = context.state;
|
|
43
|
-
const domainIds = await (0,
|
|
42
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
44
43
|
const dataSet = await (0, shell_1.getRepository)(data_set_js_1.DataSet).findOne({
|
|
45
44
|
where: { domain: { id: (0, typeorm_1.In)(domainIds) }, id: dataSetId },
|
|
46
45
|
relations: ['dataKeySet']
|
|
@@ -64,7 +63,7 @@ let DataSampleQuery = class DataSampleQuery {
|
|
|
64
63
|
}
|
|
65
64
|
async dataSamplesByDataKeySet(dataKeySetId, params, context) {
|
|
66
65
|
const { domain } = context.state;
|
|
67
|
-
const domainIds = await (0,
|
|
66
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
68
67
|
const dataKeySet = await (0, shell_1.getRepository)(data_key_set_js_1.DataKeySet).findOneBy({ id: dataKeySetId });
|
|
69
68
|
const dataKeyItems = dataKeySet?.dataKeyItems || [];
|
|
70
69
|
const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`);
|
|
@@ -82,7 +81,7 @@ let DataSampleQuery = class DataSampleQuery {
|
|
|
82
81
|
}
|
|
83
82
|
async dataSamplesByPeriod(period, dataSetName, params, context) {
|
|
84
83
|
const { domain } = context.state;
|
|
85
|
-
const domainIds = await (0,
|
|
84
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
86
85
|
const { date, month } = params.filters.reduce((acc, filter) => {
|
|
87
86
|
if (filter.name === 'date')
|
|
88
87
|
acc.date = filter.value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-sample-query.js","sourceRoot":"","sources":["../../../server/service/data-sample/data-sample-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\nimport { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport {\n Domain,\n getQueryBuilderFromListParams,\n getRepository,\n getISOStringsForPeriod,\n ListParam\n} from '@things-factory/shell'\nimport { ActivityInstance } from '@things-factory/worklist'\n\nimport { DataKeySet } from '../data-key-set/data-key-set.js'\nimport { DataSetHistory } from '../data-set-history/data-set-history.js'\nimport { DataItem } from '../data-set/data-item-type.js'\nimport { DataSet } from '../data-set/data-set.js'\nimport { DataOoc } from '../data-ooc/data-ooc.js'\nimport { DataSample } from './data-sample.js'\nimport { DataSampleList } from './data-sample-type.js'\nimport { getDomainIdsWithAncestors } from '../../utils/domain-inheritance.js'\n\n@Resolver(DataSample)\nexport class DataSampleQuery {\n @Directive('@privilege(category: \"data-sample\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataSample, {\n description:\n 'Retrieves a single data sample by its unique identifier. This query fetches detailed information about a specific data sample including its values, metadata, collection timestamp, and associated dataset information.'\n })\n async dataSample(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataSample> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n return await getRepository(DataSample).findOne({\n where: { domain: { id: In(domainIds) }, id }\n })\n }\n\n @Directive('@privilege(category: \"data-sample\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataSampleList, {\n description:\n 'Retrieves multiple data samples with pagination and filtering support. This query allows searching samples by name and description, and is used for listing and browsing collected data samples across all datasets.'\n })\n async dataSamples(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<DataSampleList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSample),\n params,\n domain: undefined,\n searchables: ['name', 'description']\n })\n\n queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {\n ancestorDomainIds: domainIds\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"data-sample\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataSampleList, {\n description:\n \"Retrieves data samples that belong to a specific dataset. This query filters samples by dataset ID and includes searchable fields based on the dataset's key configuration, allowing for targeted data analysis within a particular dataset context.\"\n })\n async dataSamplesByDataSet(\n @Arg('dataSetId') dataSetId: string,\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<DataSampleList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const dataSet = await getRepository(DataSet).findOne({\n where: { domain: { id: In(domainIds) }, id: dataSetId },\n relations: ['dataKeySet']\n })\n\n if (!dataSet) {\n throw new Error(`dataSet not found by the given dataSetId(${dataSetId})`)\n }\n\n const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || []\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSample),\n params,\n domain: undefined,\n alias: 'sample',\n searchables: ['name', 'description'].concat(searchables)\n })\n .andWhere('sample.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })\n .innerJoin('sample.dataSet', 'ds', 'ds.id = :dataSetId', { dataSetId })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"data-sample\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataSampleList, {\n description:\n 'Retrieves data samples that belong to datasets using a specific data key set. This query filters samples by key set ID and enables cross-dataset analysis based on shared key configurations, useful for comparing data across related datasets.'\n })\n async dataSamplesByDataKeySet(\n @Arg('dataKeySetId') dataKeySetId: string,\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<DataSampleList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const dataKeySet = await getRepository(DataKeySet).findOneBy({ id: dataKeySetId })\n const dataKeyItems = dataKeySet?.dataKeyItems || []\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSample),\n params,\n domain: undefined,\n alias: 'sample',\n searchables: ['name', 'description'].concat(searchables)\n })\n .andWhere('sample.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })\n .innerJoin('sample.dataSet', 'ds', 'ds.dataKeySet = :dataKeySetId', { dataKeySetId })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Query(returns => DataSampleList, {\n description:\n 'Retrieves data samples within a specified time period for a given dataset. This query supports various period options (today, this month, 30 days, etc.) and is essential for time-based data analysis, trend monitoring, and historical data review.'\n })\n async dataSamplesByPeriod(\n @Arg('period') period: 'today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month',\n @Arg('dataSetName') dataSetName: string,\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<DataSampleList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const { date, month } = params.filters.reduce(\n (acc, filter) => {\n if (filter.name === 'date') acc.date = filter.value\n if (filter.name === 'month') acc.month = filter.value\n return acc\n },\n { date: null, month: null }\n )\n\n const { from, to } = await getISOStringsForPeriod(period, { date, month }, context)\n\n const dataSet = await getRepository(DataSet).findOne({\n where: { domain: { id: In(domainIds) }, name: dataSetName },\n relations: ['dataKeySet']\n })\n\n if (!dataSet) {\n throw new Error(`dataSet not found by the given dataSetName(${dataSetName})`)\n }\n\n const { filters = [] } = params || {}\n const alteredFilters = filters.concat([\n {\n name: 'collectedAt',\n operator: 'between',\n value: [from, to]\n }\n ])\n\n const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || []\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSample),\n params: {\n ...params,\n filters: alteredFilters\n },\n domain: undefined,\n alias: 'sample',\n searchables: ['name', 'description'].concat(searchables)\n })\n .andWhere('sample.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })\n .innerJoin('sample.dataSet', 'ds', 'ds.id = :dataSetId', { dataSetId: dataSet.id })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => [DataItem], {\n description:\n 'Retrieves the data items (field definitions) associated with this data sample. These items define the structure and validation rules for the sample data, including field names, types, and constraints.'\n })\n async dataItems(@Root() dataSample: DataSample): Promise<DataItem[]> {\n const dataSetHistory: DataSetHistory =\n dataSample.dataSetId &&\n (await getRepository(DataSetHistory).findOne({\n where: {\n originalId: dataSample.dataSetId,\n version: dataSample.dataSetVersion\n }\n }))\n\n return dataSetHistory?.dataItems.filter(item => item.active) || []\n }\n\n @FieldResolver(type => DataSet, {\n description:\n 'Retrieves the dataset that this data sample belongs to. This field resolver provides access to the dataset configuration, metadata, and settings associated with the sample.'\n })\n async dataSet(@Root() dataSample: DataSample): Promise<DataSet> {\n return dataSample.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataSample.dataSetId }))\n }\n\n @FieldResolver(type => DataOoc, {\n description:\n 'Retrieves the out-of-control (OOC) record associated with this data sample, if it exists. This field resolver is used when the sample has been flagged as out of control or out of specification, providing access to the corrective action workflow.'\n })\n async dataOoc(@Root() dataSample: DataSample): Promise<DataOoc> {\n if (dataSample.ooc || dataSample.oos) {\n return await getRepository(DataOoc).findOneBy({ dataSample: { id: dataSample.id } })\n }\n }\n\n @FieldResolver(type => ActivityInstance)\n async reviewActivityInstance(@Root() dataSample: DataSample): Promise<ActivityInstance> {\n return (\n dataSample.reviewActivityInstanceId &&\n (await getRepository(ActivityInstance).findOneBy({ id: dataSample.reviewActivityInstanceId }))\n )\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() dataSample: DataSample): Promise<Domain> {\n return dataSample.domainId && (await getRepository(Domain).findOneBy({ id: dataSample.domainId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() dataSample: DataSample): Promise<User> {\n return dataSample.updaterId && (await getRepository(User).findOneBy({ id: dataSample.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() dataSample: DataSample): Promise<User> {\n return dataSample.creatorId && (await getRepository(User).findOneBy({ id: dataSample.creatorId }))\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-sample-query.js","sourceRoot":"","sources":["../../../server/service/data-sample/data-sample-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\nimport { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport {\n Domain,\n getQueryBuilderFromListParams,\n getRepository,\n getISOStringsForPeriod,\n ListParam,\n getDomainIdsWithAncestors\n} from '@things-factory/shell'\nimport { ActivityInstance } from '@things-factory/worklist'\n\nimport { DataKeySet } from '../data-key-set/data-key-set.js'\nimport { DataSetHistory } from '../data-set-history/data-set-history.js'\nimport { DataItem } from '../data-set/data-item-type.js'\nimport { DataSet } from '../data-set/data-set.js'\nimport { DataOoc } from '../data-ooc/data-ooc.js'\nimport { DataSample } from './data-sample.js'\nimport { DataSampleList } from './data-sample-type.js'\n\n@Resolver(DataSample)\nexport class DataSampleQuery {\n @Directive('@privilege(category: \"data-sample\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataSample, {\n description:\n 'Retrieves a single data sample by its unique identifier. This query fetches detailed information about a specific data sample including its values, metadata, collection timestamp, and associated dataset information.'\n })\n async dataSample(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataSample> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n return await getRepository(DataSample).findOne({\n where: { domain: { id: In(domainIds) }, id }\n })\n }\n\n @Directive('@privilege(category: \"data-sample\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataSampleList, {\n description:\n 'Retrieves multiple data samples with pagination and filtering support. This query allows searching samples by name and description, and is used for listing and browsing collected data samples across all datasets.'\n })\n async dataSamples(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<DataSampleList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSample),\n params,\n domain: undefined,\n searchables: ['name', 'description']\n })\n\n queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {\n ancestorDomainIds: domainIds\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"data-sample\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataSampleList, {\n description:\n \"Retrieves data samples that belong to a specific dataset. This query filters samples by dataset ID and includes searchable fields based on the dataset's key configuration, allowing for targeted data analysis within a particular dataset context.\"\n })\n async dataSamplesByDataSet(\n @Arg('dataSetId') dataSetId: string,\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<DataSampleList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const dataSet = await getRepository(DataSet).findOne({\n where: { domain: { id: In(domainIds) }, id: dataSetId },\n relations: ['dataKeySet']\n })\n\n if (!dataSet) {\n throw new Error(`dataSet not found by the given dataSetId(${dataSetId})`)\n }\n\n const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || []\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSample),\n params,\n domain: undefined,\n alias: 'sample',\n searchables: ['name', 'description'].concat(searchables)\n })\n .andWhere('sample.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })\n .innerJoin('sample.dataSet', 'ds', 'ds.id = :dataSetId', { dataSetId })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"data-sample\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => DataSampleList, {\n description:\n 'Retrieves data samples that belong to datasets using a specific data key set. This query filters samples by key set ID and enables cross-dataset analysis based on shared key configurations, useful for comparing data across related datasets.'\n })\n async dataSamplesByDataKeySet(\n @Arg('dataKeySetId') dataKeySetId: string,\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<DataSampleList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const dataKeySet = await getRepository(DataKeySet).findOneBy({ id: dataKeySetId })\n const dataKeyItems = dataKeySet?.dataKeyItems || []\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSample),\n params,\n domain: undefined,\n alias: 'sample',\n searchables: ['name', 'description'].concat(searchables)\n })\n .andWhere('sample.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })\n .innerJoin('sample.dataSet', 'ds', 'ds.dataKeySet = :dataKeySetId', { dataKeySetId })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Query(returns => DataSampleList, {\n description:\n 'Retrieves data samples within a specified time period for a given dataset. This query supports various period options (today, this month, 30 days, etc.) and is essential for time-based data analysis, trend monitoring, and historical data review.'\n })\n async dataSamplesByPeriod(\n @Arg('period') period: 'today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month',\n @Arg('dataSetName') dataSetName: string,\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<DataSampleList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const { date, month } = params.filters.reduce(\n (acc, filter) => {\n if (filter.name === 'date') acc.date = filter.value\n if (filter.name === 'month') acc.month = filter.value\n return acc\n },\n { date: null, month: null }\n )\n\n const { from, to } = await getISOStringsForPeriod(period, { date, month }, context)\n\n const dataSet = await getRepository(DataSet).findOne({\n where: { domain: { id: In(domainIds) }, name: dataSetName },\n relations: ['dataKeySet']\n })\n\n if (!dataSet) {\n throw new Error(`dataSet not found by the given dataSetName(${dataSetName})`)\n }\n\n const { filters = [] } = params || {}\n const alteredFilters = filters.concat([\n {\n name: 'collectedAt',\n operator: 'between',\n value: [from, to]\n }\n ])\n\n const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || []\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSample),\n params: {\n ...params,\n filters: alteredFilters\n },\n domain: undefined,\n alias: 'sample',\n searchables: ['name', 'description'].concat(searchables)\n })\n .andWhere('sample.domain IN (:...ancestorDomainIds)', { ancestorDomainIds: domainIds })\n .innerJoin('sample.dataSet', 'ds', 'ds.id = :dataSetId', { dataSetId: dataSet.id })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => [DataItem], {\n description:\n 'Retrieves the data items (field definitions) associated with this data sample. These items define the structure and validation rules for the sample data, including field names, types, and constraints.'\n })\n async dataItems(@Root() dataSample: DataSample): Promise<DataItem[]> {\n const dataSetHistory: DataSetHistory =\n dataSample.dataSetId &&\n (await getRepository(DataSetHistory).findOne({\n where: {\n originalId: dataSample.dataSetId,\n version: dataSample.dataSetVersion\n }\n }))\n\n return dataSetHistory?.dataItems.filter(item => item.active) || []\n }\n\n @FieldResolver(type => DataSet, {\n description:\n 'Retrieves the dataset that this data sample belongs to. This field resolver provides access to the dataset configuration, metadata, and settings associated with the sample.'\n })\n async dataSet(@Root() dataSample: DataSample): Promise<DataSet> {\n return dataSample.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataSample.dataSetId }))\n }\n\n @FieldResolver(type => DataOoc, {\n description:\n 'Retrieves the out-of-control (OOC) record associated with this data sample, if it exists. This field resolver is used when the sample has been flagged as out of control or out of specification, providing access to the corrective action workflow.'\n })\n async dataOoc(@Root() dataSample: DataSample): Promise<DataOoc> {\n if (dataSample.ooc || dataSample.oos) {\n return await getRepository(DataOoc).findOneBy({ dataSample: { id: dataSample.id } })\n }\n }\n\n @FieldResolver(type => ActivityInstance)\n async reviewActivityInstance(@Root() dataSample: DataSample): Promise<ActivityInstance> {\n return (\n dataSample.reviewActivityInstanceId &&\n (await getRepository(ActivityInstance).findOneBy({ id: dataSample.reviewActivityInstanceId }))\n )\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() dataSample: DataSample): Promise<Domain> {\n return dataSample.domainId && (await getRepository(Domain).findOneBy({ id: dataSample.domainId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() dataSample: DataSample): Promise<User> {\n return dataSample.updaterId && (await getRepository(User).findOneBy({ id: dataSample.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() dataSample: DataSample): Promise<User> {\n return dataSample.creatorId && (await getRepository(User).findOneBy({ id: dataSample.creatorId }))\n }\n}\n"]}
|
|
@@ -10,18 +10,17 @@ const integration_base_1 = require("@things-factory/integration-base");
|
|
|
10
10
|
const data_set_js_1 = require("../data-set/data-set.js");
|
|
11
11
|
const data_sensor_js_1 = require("./data-sensor.js");
|
|
12
12
|
const data_sensor_type_js_1 = require("./data-sensor-type.js");
|
|
13
|
-
const domain_inheritance_js_1 = require("../../utils/domain-inheritance.js");
|
|
14
13
|
let DataSensorQuery = class DataSensorQuery {
|
|
15
14
|
async dataSensor(id, context) {
|
|
16
15
|
const { domain } = context.state;
|
|
17
|
-
const domainIds = await (0,
|
|
16
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
18
17
|
return await (0, shell_1.getRepository)(data_sensor_js_1.DataSensor).findOne({
|
|
19
18
|
where: { domain: { id: (0, typeorm_1.In)(domainIds) }, id }
|
|
20
19
|
});
|
|
21
20
|
}
|
|
22
21
|
async dataSensors(params, context) {
|
|
23
22
|
const { domain } = context.state;
|
|
24
|
-
const domainIds = await (0,
|
|
23
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
25
24
|
const queryBuilder = (0, shell_1.getQueryBuilderFromListParams)({
|
|
26
25
|
repository: (0, shell_1.getRepository)(data_sensor_js_1.DataSensor),
|
|
27
26
|
params,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-sensor-query.js","sourceRoot":"","sources":["../../../server/service/data-sensor/data-sensor-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAmF;AACnF,qCAA4B;AAE5B,yDAA2D;AAC3D,
|
|
1
|
+
{"version":3,"file":"data-sensor-query.js","sourceRoot":"","sources":["../../../server/service/data-sensor/data-sensor-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { Appliance, User } from '@things-factory/auth-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam, getDomainIdsWithAncestors } from '@things-factory/shell'\nimport { Scenario } from '@things-factory/integration-base'\n\nimport { DataSet } from '../data-set/data-set.js'\nimport { DataSensor } from './data-sensor.js'\nimport { DataSensorList } from './data-sensor-type.js'\n\n@Resolver(DataSensor)\nexport class DataSensorQuery {\n @Query(returns => DataSensor, {\n description:\n 'Retrieves a single data sensor by its unique identifier. This query fetches detailed information about a sensor including its device configuration, data collection settings, and associated dataset information.'\n })\n async dataSensor(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataSensor> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n return await getRepository(DataSensor).findOne({\n where: { domain: { id: In(domainIds) }, id }\n })\n }\n\n @Query(returns => DataSensorList, {\n description:\n 'Retrieves multiple data sensors with pagination and filtering support. This query allows searching sensors by name, description, device ID, and tag, and is used for listing and managing automated data collection devices across all datasets.'\n })\n async dataSensors(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<DataSensorList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSensor),\n params,\n domain: undefined,\n searchables: ['name', 'description', 'deviceId', 'tag']\n })\n\n queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {\n ancestorDomainIds: domainIds\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Appliance, {\n description:\n 'Retrieves the appliance (device) associated with this data sensor. This field resolver provides access to the hardware device configuration and settings that the sensor is connected to.'\n })\n async appliance(@Root() dataSensor: DataSensor): Promise<Appliance> {\n return dataSensor.applianceId && (await getRepository(Appliance).findOneBy({ id: dataSensor.applianceId }))\n }\n\n @FieldResolver(type => DataSet, {\n description:\n 'Retrieves the dataset that this data sensor is configured to collect data for. This field resolver provides access to the dataset configuration and settings associated with the sensor.'\n })\n async dataSet(@Root() dataSensor: DataSensor): Promise<DataSet> {\n return dataSensor.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataSensor.dataSetId }))\n }\n\n @FieldResolver(type => Scenario, {\n description:\n 'Retrieves the decoder scenario associated with this data sensor. This field resolver provides access to the data processing and transformation logic that converts raw sensor data into structured format.'\n })\n async decoder(@Root() dataSensor: DataSensor): Promise<Scenario> {\n return (\n dataSensor.decoder ||\n (dataSensor.decoderId &&\n (await getRepository(Scenario).findOneBy({\n id: dataSensor.decoderId\n })))\n )\n }\n\n @FieldResolver(type => Domain, {\n description:\n 'Retrieves the domain that this data sensor belongs to. This field resolver provides access to the organizational context and settings associated with the sensor.'\n })\n async domain(@Root() dataSensor: DataSensor): Promise<Domain> {\n return dataSensor.domainId && (await getRepository(Domain).findOneBy({ id: dataSensor.domainId }))\n }\n\n @FieldResolver(type => User, {\n description:\n 'Retrieves the user who last updated this data sensor. This field resolver identifies the person responsible for the most recent modifications to the sensor configuration.'\n })\n async updater(@Root() dataSensor: DataSensor): Promise<User> {\n return dataSensor.updaterId && (await getRepository(User).findOneBy({ id: dataSensor.updaterId }))\n }\n\n @FieldResolver(type => User, {\n description:\n 'Retrieves the user who created this data sensor. This field resolver identifies the person responsible for initially configuring the sensor and its data collection settings.'\n })\n async creator(@Root() dataSensor: DataSensor): Promise<User> {\n return dataSensor.creatorId && (await getRepository(User).findOneBy({ id: dataSensor.creatorId }))\n }\n}\n"]}
|
|
@@ -13,7 +13,6 @@ const finalize_data_collection_js_1 = require("../../controllers/finalize-data-c
|
|
|
13
13
|
const data_set_js_1 = require("./data-set.js");
|
|
14
14
|
const data_set_type_js_1 = require("./data-set-type.js");
|
|
15
15
|
const issue_data_collection_task_js_1 = require("../../controllers/issue-data-collection-task.js");
|
|
16
|
-
const domain_inheritance_js_1 = require("../../utils/domain-inheritance.js");
|
|
17
16
|
const crypto = require('crypto');
|
|
18
17
|
function getApprovalLineValue(patch) {
|
|
19
18
|
const { reviewApprovalLine } = patch;
|
|
@@ -174,7 +173,7 @@ let DataSetMutation = class DataSetMutation {
|
|
|
174
173
|
}
|
|
175
174
|
async issueDataCollection(dataSetId, context) {
|
|
176
175
|
const { domain, tx, user } = context.state;
|
|
177
|
-
const domainIds = await (0,
|
|
176
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
178
177
|
const dataSet = await (0, shell_1.getRepository)(data_set_js_1.DataSet, tx).findOne({
|
|
179
178
|
where: {
|
|
180
179
|
domain: {
|
|
@@ -364,7 +363,7 @@ let DataSetMutation = class DataSetMutation {
|
|
|
364
363
|
}
|
|
365
364
|
async copyDataSets(ids, context) {
|
|
366
365
|
const { domain, user, tx } = context.state;
|
|
367
|
-
const domainIds = await (0,
|
|
366
|
+
const domainIds = await (0, shell_1.getDomainIdsWithAncestors)(domain);
|
|
368
367
|
const dataSetRepo = (0, shell_1.getRepository)(data_set_js_1.DataSet, tx);
|
|
369
368
|
const originals = await dataSetRepo.find({
|
|
370
369
|
where: {
|