@dssp/dkpi 1.0.0-alpha.102 → 1.0.0-alpha.103
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/pages/project-complete-tabs/pc-tab4-monthly.js +20 -1
- package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js.map +1 -1
- package/dist-client/shared/complete-api.js +5 -3
- package/dist-client/shared/complete-api.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +7 -4
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +24 -8
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -3,10 +3,13 @@ import { KpiMetricValue, KpiMetricValueList } from '@things-factory/kpi';
|
|
|
3
3
|
import { Project } from '@dssp/project';
|
|
4
4
|
export declare class KpiMetricValueQuery {
|
|
5
5
|
/**
|
|
6
|
-
* KPI 메트릭 값 목록
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* KPI 메트릭 값 목록 조회.
|
|
7
|
+
* - projectId 지정: 그 프로젝트의 **테넌트 도메인으로 스코프**. 프로젝트 KPI 화면 전용.
|
|
8
|
+
* (프로젝트가 SYSTEM + 테넌트 두 도메인에 KMV 중복을 가진 경우, cross-domain 조회는
|
|
9
|
+
* 동일 metric 을 여러 row 로 돌려줘 저장 시 서로 덮어쓰는 문제를 유발 → 스코프로 차단)
|
|
10
|
+
* - projectId 미지정: 도메인 필터 없이 전 도메인 조회 (admin 목록 페이지 cross-domain view).
|
|
11
|
+
* 접근 권한은 @privilege 가 superUser/domainOwner 만 허용해 보호.
|
|
9
12
|
*/
|
|
10
|
-
kpiMetricValues(params: ListParam, context: ResolverContext): Promise<KpiMetricValueList>;
|
|
13
|
+
kpiMetricValues(params: ListParam, projectId: string, context: ResolverContext): Promise<KpiMetricValueList>;
|
|
11
14
|
project(kpiMetricValue: KpiMetricValue): Promise<Project | null>;
|
|
12
15
|
}
|
|
@@ -8,13 +8,28 @@ const kpi_1 = require("@things-factory/kpi");
|
|
|
8
8
|
const project_1 = require("@dssp/project");
|
|
9
9
|
let KpiMetricValueQuery = class KpiMetricValueQuery {
|
|
10
10
|
/**
|
|
11
|
-
* KPI 메트릭 값 목록
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* KPI 메트릭 값 목록 조회.
|
|
12
|
+
* - projectId 지정: 그 프로젝트의 **테넌트 도메인으로 스코프**. 프로젝트 KPI 화면 전용.
|
|
13
|
+
* (프로젝트가 SYSTEM + 테넌트 두 도메인에 KMV 중복을 가진 경우, cross-domain 조회는
|
|
14
|
+
* 동일 metric 을 여러 row 로 돌려줘 저장 시 서로 덮어쓰는 문제를 유발 → 스코프로 차단)
|
|
15
|
+
* - projectId 미지정: 도메인 필터 없이 전 도메인 조회 (admin 목록 페이지 cross-domain view).
|
|
16
|
+
* 접근 권한은 @privilege 가 superUser/domainOwner 만 허용해 보호.
|
|
14
17
|
*/
|
|
15
|
-
async kpiMetricValues(params, context) {
|
|
18
|
+
async kpiMetricValues(params, projectId, context) {
|
|
19
|
+
// projectId 가 있으면 그 프로젝트가 속한 도메인(테넌트 승격됐으면 테넌트, 아니면 프로젝트 도메인)
|
|
20
|
+
// 으로 스코프. 없으면 undefined(=전 도메인, admin view).
|
|
21
|
+
let domain = undefined;
|
|
22
|
+
if (projectId) {
|
|
23
|
+
const project = await (0, shell_1.getRepository)(project_1.Project).findOneBy({ id: projectId });
|
|
24
|
+
if (project) {
|
|
25
|
+
const tenant = project.code &&
|
|
26
|
+
(await (0, shell_1.getRepository)(shell_1.Domain).findOne({ where: { subdomain: project.code, extType: 'project' } }));
|
|
27
|
+
domain =
|
|
28
|
+
tenant || (project.domainId ? await (0, shell_1.getRepository)(shell_1.Domain).findOneBy({ id: project.domainId }) : undefined);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
16
31
|
const queryBuilder = (0, shell_1.getQueryBuilderFromListParams)({
|
|
17
|
-
domain
|
|
32
|
+
domain,
|
|
18
33
|
params,
|
|
19
34
|
repository: await (0, shell_1.getRepository)(kpi_1.KpiMetricValue),
|
|
20
35
|
searchables: ['metricId', 'group', 'valueDate', 'org']
|
|
@@ -36,11 +51,12 @@ let KpiMetricValueQuery = class KpiMetricValueQuery {
|
|
|
36
51
|
exports.KpiMetricValueQuery = KpiMetricValueQuery;
|
|
37
52
|
tslib_1.__decorate([
|
|
38
53
|
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "read", domainOwnerGranted: true, superUserGranted: true)'),
|
|
39
|
-
(0, type_graphql_1.Query)(returns => kpi_1.KpiMetricValueList, { description: 'To fetch multiple KpiMetricValues (cross-domain admin view)' }),
|
|
54
|
+
(0, type_graphql_1.Query)(returns => kpi_1.KpiMetricValueList, { description: 'To fetch multiple KpiMetricValues (project-scoped or cross-domain admin view)' }),
|
|
40
55
|
tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
|
|
41
|
-
tslib_1.__param(1, (0, type_graphql_1.
|
|
56
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('projectId', { nullable: true })),
|
|
57
|
+
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|
|
42
58
|
tslib_1.__metadata("design:type", Function),
|
|
43
|
-
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
|
|
59
|
+
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, String, Object]),
|
|
44
60
|
tslib_1.__metadata("design:returntype", Promise)
|
|
45
61
|
], KpiMetricValueQuery.prototype, "kpiMetricValues", null);
|
|
46
62
|
tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-metric-value-query.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-query.ts"],"names":[],"mappings":";;;;AAAA,+CAA8F;AAC9F,iDAAuG;AAEvG,6CAAwE;AACxE,2CAAuC;AAGhC,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B
|
|
1
|
+
{"version":3,"file":"kpi-metric-value-query.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-query.ts"],"names":[],"mappings":";;;;AAAA,+CAA8F;AAC9F,iDAAuG;AAEvG,6CAAwE;AACxE,2CAAuC;AAGhC,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B;;;;;;;OAOG;IAGG,AAAN,KAAK,CAAC,eAAe,CACM,MAAiB,EACJ,SAAiB,EAChD,OAAwB;QAE/B,8DAA8D;QAC9D,6CAA6C;QAC7C,IAAI,MAAM,GAAuB,SAAS,CAAA;QAC1C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAa,EAAC,iBAAO,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;YACzE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,MAAM,GACV,OAAO,CAAC,IAAI;oBACZ,CAAC,MAAM,IAAA,qBAAa,EAAC,cAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAS,EAAE,CAAC,CAAC,CAAA;gBAC1G,MAAM;oBACJ,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,cAAM,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YAC9G,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,IAAA,qCAA6B,EAAC;YACjD,MAAM;YACN,MAAM;YACN,UAAU,EAAE,MAAM,IAAA,qBAAa,EAAC,oBAAc,CAAC;YAC/C,WAAW,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC;SACvD,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAA;QAE3D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAS,cAA8B;QAClD,IAAI,CAAC,cAAc,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,IAAA,qBAAa,EAAC,iBAAO,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC,CAAA;QAC3E,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF,CAAA;AAnDY,kDAAmB;AAWxB;IAFL,IAAA,wBAAS,EAAC,kGAAkG,CAAC;IAC7G,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,wBAAkB,EAAE,EAAE,WAAW,EAAE,+EAA+E,EAAE,CAAC;IAEpI,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IACvB,mBAAA,IAAA,kBAAG,EAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACpC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAF2B,iBAAS;;0DA4B3C;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACpC,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAiB,oBAAc;;kDAOnD;8BAlDU,mBAAmB;IAD/B,IAAA,uBAAQ,EAAC,oBAAc,CAAC;GACZ,mBAAmB,CAmD/B","sourcesContent":["import { Directive, Resolver, Query, Args, Arg, Ctx, FieldResolver, Root } from 'type-graphql'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { KpiMetricValue, KpiMetricValueList } from '@things-factory/kpi'\nimport { Project } from '@dssp/project'\n\n@Resolver(KpiMetricValue)\nexport class KpiMetricValueQuery {\n /**\n * KPI 메트릭 값 목록 조회.\n * - projectId 지정: 그 프로젝트의 **테넌트 도메인으로 스코프**. 프로젝트 KPI 화면 전용.\n * (프로젝트가 SYSTEM + 테넌트 두 도메인에 KMV 중복을 가진 경우, cross-domain 조회는\n * 동일 metric 을 여러 row 로 돌려줘 저장 시 서로 덮어쓰는 문제를 유발 → 스코프로 차단)\n * - projectId 미지정: 도메인 필터 없이 전 도메인 조회 (admin 목록 페이지 cross-domain view).\n * 접근 권한은 @privilege 가 superUser/domainOwner 만 허용해 보호.\n */\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => KpiMetricValueList, { description: 'To fetch multiple KpiMetricValues (project-scoped or cross-domain admin view)' })\n async kpiMetricValues(\n @Args(type => ListParam) params: ListParam,\n @Arg('projectId', { nullable: true }) projectId: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValueList> {\n // projectId 가 있으면 그 프로젝트가 속한 도메인(테넌트 승격됐으면 테넌트, 아니면 프로젝트 도메인)\n // 으로 스코프. 없으면 undefined(=전 도메인, admin view).\n let domain: Domain | undefined = undefined\n if (projectId) {\n const project = await getRepository(Project).findOneBy({ id: projectId })\n if (project) {\n const tenant =\n project.code &&\n (await getRepository(Domain).findOne({ where: { subdomain: project.code, extType: 'project' } as any }))\n domain =\n tenant || (project.domainId ? await getRepository(Domain).findOneBy({ id: project.domainId }) : undefined)\n }\n }\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository(KpiMetricValue),\n searchables: ['metricId', 'group', 'valueDate', 'org']\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Project, { nullable: true })\n async project(@Root() kpiMetricValue: KpiMetricValue): Promise<Project | null> {\n if (!kpiMetricValue.org) return null\n try {\n return await getRepository(Project).findOneBy({ id: kpiMetricValue.org })\n } catch {\n return null\n }\n }\n}\n"]}
|