@things-factory/ops-master 10.0.18
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/.dockerignore +31 -0
- package/dist-client/index.d.ts +1 -0
- package/dist-client/index.js +2 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/pages/master-axes.d.ts +33 -0
- package/dist-client/pages/master-axes.js +176 -0
- package/dist-client/pages/master-axes.js.map +1 -0
- package/dist-client/pages/master-list.d.ts +68 -0
- package/dist-client/pages/master-list.js +267 -0
- package/dist-client/pages/master-list.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +8 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +5 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/service/asset/asset-lifecycle.d.ts +83 -0
- package/dist-server/service/asset/asset-lifecycle.js +99 -0
- package/dist-server/service/asset/asset-lifecycle.js.map +1 -0
- package/dist-server/service/asset/asset-master-resolver.d.ts +44 -0
- package/dist-server/service/asset/asset-master-resolver.js +140 -0
- package/dist-server/service/asset/asset-master-resolver.js.map +1 -0
- package/dist-server/service/asset/asset-master.d.ts +21 -0
- package/dist-server/service/asset/asset-master.js +25 -0
- package/dist-server/service/asset/asset-master.js.map +1 -0
- package/dist-server/service/asset/asset-query.d.ts +8 -0
- package/dist-server/service/asset/asset-query.js +50 -0
- package/dist-server/service/asset/asset-query.js.map +1 -0
- package/dist-server/service/asset/index.d.ts +6 -0
- package/dist-server/service/asset/index.js +10 -0
- package/dist-server/service/asset/index.js.map +1 -0
- package/dist-server/service/asset/physical-asset-class.d.ts +34 -0
- package/dist-server/service/asset/physical-asset-class.js +104 -0
- package/dist-server/service/asset/physical-asset-class.js.map +1 -0
- package/dist-server/service/asset/physical-asset.d.ts +53 -0
- package/dist-server/service/asset/physical-asset.js +123 -0
- package/dist-server/service/asset/physical-asset.js.map +1 -0
- package/dist-server/service/equipment/equipment-class.d.ts +34 -0
- package/dist-server/service/equipment/equipment-class.js +104 -0
- package/dist-server/service/equipment/equipment-class.js.map +1 -0
- package/dist-server/service/equipment/equipment-master-resolver.d.ts +60 -0
- package/dist-server/service/equipment/equipment-master-resolver.js +200 -0
- package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -0
- package/dist-server/service/equipment/equipment-master.d.ts +29 -0
- package/dist-server/service/equipment/equipment-master.js +36 -0
- package/dist-server/service/equipment/equipment-master.js.map +1 -0
- package/dist-server/service/equipment/equipment-query.d.ts +8 -0
- package/dist-server/service/equipment/equipment-query.js +50 -0
- package/dist-server/service/equipment/equipment-query.js.map +1 -0
- package/dist-server/service/equipment/equipment.d.ts +45 -0
- package/dist-server/service/equipment/equipment.js +133 -0
- package/dist-server/service/equipment/equipment.js.map +1 -0
- package/dist-server/service/equipment/index.d.ts +8 -0
- package/dist-server/service/equipment/index.js +12 -0
- package/dist-server/service/equipment/index.js.map +1 -0
- package/dist-server/service/equipment/state-period-rules.d.ts +76 -0
- package/dist-server/service/equipment/state-period-rules.js +88 -0
- package/dist-server/service/equipment/state-period-rules.js.map +1 -0
- package/dist-server/service/equipment/stop-reason-query.d.ts +11 -0
- package/dist-server/service/equipment/stop-reason-query.js +39 -0
- package/dist-server/service/equipment/stop-reason-query.js.map +1 -0
- package/dist-server/service/equipment/stop-reason.d.ts +58 -0
- package/dist-server/service/equipment/stop-reason.js +114 -0
- package/dist-server/service/equipment/stop-reason.js.map +1 -0
- package/dist-server/service/index.d.ts +46 -0
- package/dist-server/service/index.js +80 -0
- package/dist-server/service/index.js.map +1 -0
- package/dist-server/service/location/index.d.ts +5 -0
- package/dist-server/service/location/index.js +9 -0
- package/dist-server/service/location/index.js.map +1 -0
- package/dist-server/service/location/location-master-resolver.d.ts +28 -0
- package/dist-server/service/location/location-master-resolver.js +80 -0
- package/dist-server/service/location/location-master-resolver.js.map +1 -0
- package/dist-server/service/location/location-master.d.ts +24 -0
- package/dist-server/service/location/location-master.js +27 -0
- package/dist-server/service/location/location-master.js.map +1 -0
- package/dist-server/service/location/location-query.d.ts +7 -0
- package/dist-server/service/location/location-query.js +41 -0
- package/dist-server/service/location/location-query.js.map +1 -0
- package/dist-server/service/location/operational-location.d.ts +52 -0
- package/dist-server/service/location/operational-location.js +132 -0
- package/dist-server/service/location/operational-location.js.map +1 -0
- package/dist-server/service/master-axis.d.ts +29 -0
- package/dist-server/service/master-axis.js +39 -0
- package/dist-server/service/master-axis.js.map +1 -0
- package/dist-server/service/master-crud.d.ts +44 -0
- package/dist-server/service/master-crud.js +73 -0
- package/dist-server/service/master-crud.js.map +1 -0
- package/dist-server/service/master-list.d.ts +12 -0
- package/dist-server/service/master-list.js +24 -0
- package/dist-server/service/master-list.js.map +1 -0
- package/dist-server/service/material/index.d.ts +6 -0
- package/dist-server/service/material/index.js +10 -0
- package/dist-server/service/material/index.js.map +1 -0
- package/dist-server/service/material/material-class.d.ts +34 -0
- package/dist-server/service/material/material-class.js +104 -0
- package/dist-server/service/material/material-class.js.map +1 -0
- package/dist-server/service/material/material-definition.d.ts +42 -0
- package/dist-server/service/material/material-definition.js +112 -0
- package/dist-server/service/material/material-definition.js.map +1 -0
- package/dist-server/service/material/material-master-resolver.d.ts +44 -0
- package/dist-server/service/material/material-master-resolver.js +140 -0
- package/dist-server/service/material/material-master-resolver.js.map +1 -0
- package/dist-server/service/material/material-master.d.ts +9 -0
- package/dist-server/service/material/material-master.js +24 -0
- package/dist-server/service/material/material-master.js.map +1 -0
- package/dist-server/service/material/material-query.d.ts +8 -0
- package/dist-server/service/material/material-query.js +50 -0
- package/dist-server/service/material/material-query.js.map +1 -0
- package/dist-server/service/operation/index.d.ts +5 -0
- package/dist-server/service/operation/index.js +9 -0
- package/dist-server/service/operation/index.js.map +1 -0
- package/dist-server/service/operation/operation-definition.d.ts +52 -0
- package/dist-server/service/operation/operation-definition.js +142 -0
- package/dist-server/service/operation/operation-definition.js.map +1 -0
- package/dist-server/service/operation/operation-master-resolver.d.ts +28 -0
- package/dist-server/service/operation/operation-master-resolver.js +80 -0
- package/dist-server/service/operation/operation-master-resolver.js.map +1 -0
- package/dist-server/service/operation/operation-master.d.ts +21 -0
- package/dist-server/service/operation/operation-master.js +28 -0
- package/dist-server/service/operation/operation-master.js.map +1 -0
- package/dist-server/service/operation/operation-query.d.ts +7 -0
- package/dist-server/service/operation/operation-query.js +41 -0
- package/dist-server/service/operation/operation-query.js.map +1 -0
- package/dist-server/service/personnel/index.d.ts +6 -0
- package/dist-server/service/personnel/index.js +10 -0
- package/dist-server/service/personnel/index.js.map +1 -0
- package/dist-server/service/personnel/person.d.ts +51 -0
- package/dist-server/service/personnel/person.js +119 -0
- package/dist-server/service/personnel/person.js.map +1 -0
- package/dist-server/service/personnel/personnel-class.d.ts +54 -0
- package/dist-server/service/personnel/personnel-class.js +114 -0
- package/dist-server/service/personnel/personnel-class.js.map +1 -0
- package/dist-server/service/personnel/personnel-master-resolver.d.ts +44 -0
- package/dist-server/service/personnel/personnel-master-resolver.js +140 -0
- package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -0
- package/dist-server/service/personnel/personnel-master.d.ts +39 -0
- package/dist-server/service/personnel/personnel-master.js +34 -0
- package/dist-server/service/personnel/personnel-master.js.map +1 -0
- package/dist-server/service/personnel/personnel-query.d.ts +21 -0
- package/dist-server/service/personnel/personnel-query.js +57 -0
- package/dist-server/service/personnel/personnel-query.js.map +1 -0
- package/dist-server/service/personnel/qualification.d.ts +97 -0
- package/dist-server/service/personnel/qualification.js +122 -0
- package/dist-server/service/personnel/qualification.js.map +1 -0
- package/dist-server/service/resource/resource-class.d.ts +25 -0
- package/dist-server/service/resource/resource-class.js +29 -0
- package/dist-server/service/resource/resource-class.js.map +1 -0
- package/dist-server/service/status/axis-stamp.d.ts +16 -0
- package/dist-server/service/status/axis-stamp.js +22 -0
- package/dist-server/service/status/axis-stamp.js.map +1 -0
- package/dist-server/service/status/index.d.ts +3 -0
- package/dist-server/service/status/index.js +7 -0
- package/dist-server/service/status/index.js.map +1 -0
- package/dist-server/service/status/master-status.d.ts +45 -0
- package/dist-server/service/status/master-status.js +129 -0
- package/dist-server/service/status/master-status.js.map +1 -0
- package/dist-server/service/test-spec/index.d.ts +5 -0
- package/dist-server/service/test-spec/index.js +9 -0
- package/dist-server/service/test-spec/index.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +28 -0
- package/dist-server/service/test-spec/test-spec-master-resolver.js +80 -0
- package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-master.d.ts +6 -0
- package/dist-server/service/test-spec/test-spec-master.js +18 -0
- package/dist-server/service/test-spec/test-spec-master.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-query.d.ts +7 -0
- package/dist-server/service/test-spec/test-spec-query.js +41 -0
- package/dist-server/service/test-spec/test-spec-query.js.map +1 -0
- package/dist-server/service/test-spec/test-specification.d.ts +41 -0
- package/dist-server/service/test-spec/test-specification.js +106 -0
- package/dist-server/service/test-spec/test-specification.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/package.json +50 -0
- package/things-factory.config.js +12 -0
- package/translations/en.json +53 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +53 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestSpecificationResolver = exports.TestSpecificationList = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const type_graphql_1 = require("type-graphql");
|
|
6
|
+
const shell_1 = require("@things-factory/shell");
|
|
7
|
+
const master_crud_1 = require("../master-crud");
|
|
8
|
+
const master_axis_1 = require("../master-axis");
|
|
9
|
+
const master_list_1 = require("../master-list");
|
|
10
|
+
const test_specification_1 = require("./test-specification");
|
|
11
|
+
/**
|
|
12
|
+
* 검사 명세 축을 채우고 고친다.
|
|
13
|
+
*
|
|
14
|
+
* ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────
|
|
15
|
+
* 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의
|
|
16
|
+
* 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —
|
|
17
|
+
* 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
|
|
18
|
+
*
|
|
19
|
+
* 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.
|
|
20
|
+
*/
|
|
21
|
+
let TestSpecificationList = class TestSpecificationList {
|
|
22
|
+
};
|
|
23
|
+
exports.TestSpecificationList = TestSpecificationList;
|
|
24
|
+
tslib_1.__decorate([
|
|
25
|
+
(0, type_graphql_1.Field)(type => [test_specification_1.TestSpecification]),
|
|
26
|
+
tslib_1.__metadata("design:type", Array)
|
|
27
|
+
], TestSpecificationList.prototype, "items", void 0);
|
|
28
|
+
tslib_1.__decorate([
|
|
29
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Int),
|
|
30
|
+
tslib_1.__metadata("design:type", Number)
|
|
31
|
+
], TestSpecificationList.prototype, "total", void 0);
|
|
32
|
+
exports.TestSpecificationList = TestSpecificationList = tslib_1.__decorate([
|
|
33
|
+
(0, type_graphql_1.ObjectType)({ description: 'A page of test specifications' })
|
|
34
|
+
], TestSpecificationList);
|
|
35
|
+
let TestSpecificationResolver = class TestSpecificationResolver {
|
|
36
|
+
async testSpecifications(params, context) {
|
|
37
|
+
const { domain } = context.state;
|
|
38
|
+
const { items, total } = await (0, master_list_1.listMaster)('testSpecification', params, domain);
|
|
39
|
+
return { items: items, total };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 그리드가 보낸 변경을 한 번에 적용한다.
|
|
43
|
+
*
|
|
44
|
+
* 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
|
|
45
|
+
* 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
|
|
46
|
+
* 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
|
|
47
|
+
*/
|
|
48
|
+
async updateMultipleTestSpecification(patches, context) {
|
|
49
|
+
const { domain, user, tx } = context.state;
|
|
50
|
+
const axis = (0, master_axis_1.masterAxisOf)('testSpecification');
|
|
51
|
+
const saved = await (0, master_crud_1.saveMasterPatches)(tx, domain, axis.entity, patches, user, {
|
|
52
|
+
hasEffectivePeriod: axis.hasEffectivePeriod
|
|
53
|
+
});
|
|
54
|
+
return saved;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
exports.TestSpecificationResolver = TestSpecificationResolver;
|
|
58
|
+
tslib_1.__decorate([
|
|
59
|
+
(0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
|
|
60
|
+
(0, type_graphql_1.Query)(returns => TestSpecificationList, { description: 'To fetch test specifications' }),
|
|
61
|
+
tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
|
|
62
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
63
|
+
tslib_1.__metadata("design:type", Function),
|
|
64
|
+
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
|
|
65
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
66
|
+
], TestSpecificationResolver.prototype, "testSpecifications", null);
|
|
67
|
+
tslib_1.__decorate([
|
|
68
|
+
(0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
|
|
69
|
+
(0, type_graphql_1.Directive)('@transaction'),
|
|
70
|
+
(0, type_graphql_1.Mutation)(returns => [test_specification_1.TestSpecification], { description: 'To create, change or retire test specifications' }),
|
|
71
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [shell_1.ScalarObject])),
|
|
72
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
73
|
+
tslib_1.__metadata("design:type", Function),
|
|
74
|
+
tslib_1.__metadata("design:paramtypes", [Array, Object]),
|
|
75
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
76
|
+
], TestSpecificationResolver.prototype, "updateMultipleTestSpecification", null);
|
|
77
|
+
exports.TestSpecificationResolver = TestSpecificationResolver = tslib_1.__decorate([
|
|
78
|
+
(0, type_graphql_1.Resolver)(test_specification_1.TestSpecification)
|
|
79
|
+
], TestSpecificationResolver);
|
|
80
|
+
//# sourceMappingURL=test-spec-master-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-spec-master-resolver.js","sourceRoot":"","sources":["../../../server/service/test-spec/test-spec-master-resolver.ts"],"names":[],"mappings":";;;;AAAA,+CAA2G;AAE3G,iDAA+D;AAE/D,gDAA+D;AAC/D,gDAA6C;AAC7C,gDAA2C;AAC3C,6DAAwD;AAExD;;;;;;;;;GASG;AAGI,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAMjC,CAAA;AANY,sDAAqB;AAEhC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,sCAAiB,CAAC,CAAC;;oDACT;AAG1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;oDACN;gCALF,qBAAqB;IADjC,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;GAChD,qBAAqB,CAMjC;AAGM,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAG9B,AAAN,KAAK,CAAC,kBAAkB,CAA0B,MAAiB,EAAS,OAAwB;QAClG,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,wBAAU,EAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAE9E,OAAO,EAAE,KAAK,EAAE,KAA4B,EAAE,KAAK,EAAE,CAAA;IACvD,CAAC;IAED;;;;;;OAMG;IAIG,AAAN,KAAK,CAAC,+BAA+B,CACK,OAAsB,EACvD,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,IAAI,GAAG,IAAA,0BAAY,EAAC,mBAAmB,CAAC,CAAA;QAE9C,MAAM,KAAK,GAAG,MAAM,IAAA,+BAAiB,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YAC5E,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C,CAAC,CAAA;QAEF,OAAO,KAA4B,CAAA;IACrC,CAAC;CACF,CAAA;AAjCY,8DAAyB;AAG9B;IAFL,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,qBAAqB,EAAE,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;IAC/D,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;mEAKlE;AAYK;IAHL,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,sCAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;IAE1G,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,CAAC,CAAA;IACtC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;gFAUP;oCAhCU,yBAAyB;IADrC,IAAA,uBAAQ,EAAC,sCAAiB,CAAC;GACf,yBAAyB,CAiCrC","sourcesContent":["import { Args, Arg, Ctx, Directive, Int, Mutation, ObjectType, Field, Query, Resolver } from 'type-graphql'\n\nimport { ListParam, ScalarObject } from '@things-factory/shell'\n\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { TestSpecification } from './test-specification'\n\n/**\n * 검사 명세 축을 채우고 고친다.\n *\n * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────\n * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의\n * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —\n * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.\n *\n * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.\n */\n\n@ObjectType({ description: 'A page of test specifications' })\nexport class TestSpecificationList {\n @Field(type => [TestSpecification])\n items: TestSpecification[]\n\n @Field(type => Int)\n total: number\n}\n\n@Resolver(TestSpecification)\nexport class TestSpecificationResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => TestSpecificationList, { description: 'To fetch test specifications' })\n async testSpecifications(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<TestSpecificationList> {\n const { domain } = context.state\n const { items, total } = await listMaster('testSpecification', params, domain)\n\n return { items: items as TestSpecification[], total }\n }\n\n /**\n * 그리드가 보낸 변경을 한 번에 적용한다.\n *\n * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을\n * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는\n * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [TestSpecification], { description: 'To create, change or retire test specifications' })\n async updateMultipleTestSpecification(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<TestSpecification[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('testSpecification')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as TestSpecification[]\n }\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TestSpecification as TestSpecificationDef } from '@operato/ops-contract';
|
|
2
|
+
import type { TestSpecification } from './test-specification';
|
|
3
|
+
export declare function toTestSpecification(spec: TestSpecification): TestSpecificationDef;
|
|
4
|
+
export declare function testSpecificationMaster(specs: TestSpecification[]): {
|
|
5
|
+
testSpecifications: TestSpecificationDef[];
|
|
6
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toTestSpecification = toTestSpecification;
|
|
4
|
+
exports.testSpecificationMaster = testSpecificationMaster;
|
|
5
|
+
const resource_class_1 = require("../resource/resource-class");
|
|
6
|
+
function toTestSpecification(spec) {
|
|
7
|
+
const out = { id: spec.name };
|
|
8
|
+
(0, resource_class_1.put)(out, 'description', spec.description);
|
|
9
|
+
(0, resource_class_1.put)(out, 'version', spec.version);
|
|
10
|
+
(0, resource_class_1.put)(out, 'criteria', spec.criteria);
|
|
11
|
+
(0, resource_class_1.put)(out, 'effectiveStart', (0, resource_class_1.iso)(spec.effectiveStart));
|
|
12
|
+
(0, resource_class_1.put)(out, 'effectiveEnd', (0, resource_class_1.iso)(spec.effectiveEnd));
|
|
13
|
+
return out;
|
|
14
|
+
}
|
|
15
|
+
function testSpecificationMaster(specs) {
|
|
16
|
+
return { testSpecifications: specs.map(toTestSpecification) };
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=test-spec-master.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-spec-master.js","sourceRoot":"","sources":["../../../server/service/test-spec/test-spec-master.ts"],"names":[],"mappings":";;AAKA,kDAUC;AAED,0DAEC;AAjBD,+DAAqD;AAGrD,SAAgB,mBAAmB,CAAC,IAAuB;IACzD,MAAM,GAAG,GAA4B,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAA;IAEtD,IAAA,oBAAG,EAAC,GAAG,EAAE,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;IACzC,IAAA,oBAAG,EAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IACjC,IAAA,oBAAG,EAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACnC,IAAA,oBAAG,EAAC,GAAG,EAAE,gBAAgB,EAAE,IAAA,oBAAG,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAA;IACpD,IAAA,oBAAG,EAAC,GAAG,EAAE,cAAc,EAAE,IAAA,oBAAG,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;IAEhD,OAAO,GAAsC,CAAA;AAC/C,CAAC;AAED,SAAgB,uBAAuB,CAAC,KAA0B;IAChE,OAAO,EAAE,kBAAkB,EAAE,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAA;AAC/D,CAAC","sourcesContent":["import type { TestSpecification as TestSpecificationDef } from '@operato/ops-contract'\n\nimport { iso, put } from '../resource/resource-class'\nimport type { TestSpecification } from './test-specification'\n\nexport function toTestSpecification(spec: TestSpecification): TestSpecificationDef {\n const out: Record<string, unknown> = { id: spec.name }\n\n put(out, 'description', spec.description)\n put(out, 'version', spec.version)\n put(out, 'criteria', spec.criteria)\n put(out, 'effectiveStart', iso(spec.effectiveStart))\n put(out, 'effectiveEnd', iso(spec.effectiveEnd))\n\n return out as unknown as TestSpecificationDef\n}\n\nexport function testSpecificationMaster(specs: TestSpecification[]): { testSpecifications: TestSpecificationDef[] } {\n return { testSpecifications: specs.map(toTestSpecification) }\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare class TestSpecificationMaster {
|
|
2
|
+
testSpecifications: string;
|
|
3
|
+
}
|
|
4
|
+
export declare class TestSpecificationQuery {
|
|
5
|
+
/** `TestSpecification` 전체 — 자원의 참조가 가리킬 대상이다. */
|
|
6
|
+
testSpecificationMaster(context: ResolverContext): Promise<TestSpecificationMaster>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestSpecificationQuery = exports.TestSpecificationMaster = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const type_graphql_1 = require("type-graphql");
|
|
6
|
+
const shell_1 = require("@things-factory/shell");
|
|
7
|
+
const test_spec_master_1 = require("./test-spec-master");
|
|
8
|
+
const test_specification_1 = require("./test-specification");
|
|
9
|
+
let TestSpecificationMaster = class TestSpecificationMaster {
|
|
10
|
+
};
|
|
11
|
+
exports.TestSpecificationMaster = TestSpecificationMaster;
|
|
12
|
+
tslib_1.__decorate([
|
|
13
|
+
(0, type_graphql_1.Field)(type => String, { description: 'TestSpecification[] as JSON text' }),
|
|
14
|
+
tslib_1.__metadata("design:type", String)
|
|
15
|
+
], TestSpecificationMaster.prototype, "testSpecifications", void 0);
|
|
16
|
+
exports.TestSpecificationMaster = TestSpecificationMaster = tslib_1.__decorate([
|
|
17
|
+
(0, type_graphql_1.ObjectType)({ description: 'Test specifications as the twin receives them' })
|
|
18
|
+
], TestSpecificationMaster);
|
|
19
|
+
let TestSpecificationQuery = class TestSpecificationQuery {
|
|
20
|
+
/** `TestSpecification` 전체 — 자원의 참조가 가리킬 대상이다. */
|
|
21
|
+
async testSpecificationMaster(context) {
|
|
22
|
+
const { domain } = context.state;
|
|
23
|
+
const specs = await (0, shell_1.getRepository)(test_specification_1.TestSpecification).find({
|
|
24
|
+
where: { domain: { id: domain.id } },
|
|
25
|
+
order: { name: 'ASC' }
|
|
26
|
+
});
|
|
27
|
+
return { testSpecifications: JSON.stringify((0, test_spec_master_1.testSpecificationMaster)(specs).testSpecifications) };
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.TestSpecificationQuery = TestSpecificationQuery;
|
|
31
|
+
tslib_1.__decorate([
|
|
32
|
+
(0, type_graphql_1.Query)(returns => TestSpecificationMaster, { description: 'Test specifications for the twin to pull' }),
|
|
33
|
+
tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
|
|
34
|
+
tslib_1.__metadata("design:type", Function),
|
|
35
|
+
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
36
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
37
|
+
], TestSpecificationQuery.prototype, "testSpecificationMaster", null);
|
|
38
|
+
exports.TestSpecificationQuery = TestSpecificationQuery = tslib_1.__decorate([
|
|
39
|
+
(0, type_graphql_1.Resolver)(test_specification_1.TestSpecification)
|
|
40
|
+
], TestSpecificationQuery);
|
|
41
|
+
//# sourceMappingURL=test-spec-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-spec-query.js","sourceRoot":"","sources":["../../../server/service/test-spec/test-spec-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AAEtE,iDAAqD;AAErD,yDAA4F;AAC5F,6DAAwD;AAGjD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAGnC,CAAA;AAHY,0DAAuB;AAElC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC;;mEACjD;kCAFf,uBAAuB;IADnC,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,+CAA+C,EAAE,CAAC;GAChE,uBAAuB,CAGnC;AAGM,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,iDAAiD;IAE3C,AAAN,KAAK,CAAC,uBAAuB,CAAQ,OAAwB;QAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAa,EAAC,sCAAiB,CAAC,CAAC,IAAI,CAAC;YACxD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE;YACpC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACvB,CAAC,CAAA;QAEF,OAAO,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAA,0CAA4B,EAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAA;IACvG,CAAC;CACF,CAAA;AAbY,wDAAsB;AAG3B;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,uBAAuB,EAAE,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC;IACxE,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;qEASnC;iCAZU,sBAAsB;IADlC,IAAA,uBAAQ,EAAC,sCAAiB,CAAC;GACf,sBAAsB,CAalC","sourcesContent":["import { Ctx, Field, ObjectType, Query, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { testSpecificationMaster as buildTestSpecificationMaster } from './test-spec-master'\nimport { TestSpecification } from './test-specification'\n\n@ObjectType({ description: 'Test specifications as the twin receives them' })\nexport class TestSpecificationMaster {\n @Field(type => String, { description: 'TestSpecification[] as JSON text' })\n testSpecifications: string\n}\n\n@Resolver(TestSpecification)\nexport class TestSpecificationQuery {\n /** `TestSpecification` 전체 — 자원의 참조가 가리킬 대상이다. */\n @Query(returns => TestSpecificationMaster, { description: 'Test specifications for the twin to pull' })\n async testSpecificationMaster(@Ctx() context: ResolverContext): Promise<TestSpecificationMaster> {\n const { domain } = context.state\n\n const specs = await getRepository(TestSpecification).find({\n where: { domain: { id: domain.id } },\n order: { name: 'ASC' }\n })\n\n return { testSpecifications: JSON.stringify(buildTestSpecificationMaster(specs).testSpecifications) }\n }\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Domain } from '@things-factory/shell';
|
|
2
|
+
import { User } from '@things-factory/auth-base';
|
|
3
|
+
/**
|
|
4
|
+
* `TestSpecification` — **ISA-95 표준 명세**.
|
|
5
|
+
*
|
|
6
|
+
* 자원의 `testSpecificationIds` 가 가리키는 대상이다. 「무엇으로 검증하는가」를 이름으로 답하고,
|
|
7
|
+
* 기준(`criteria`)을 적으면 「판단에 근거가 있는가」까지 물을 수 있다.
|
|
8
|
+
*
|
|
9
|
+
* 버전을 갖는 이유는 같은 명세의 버전이 바뀌면 자격의 뜻도 바뀌기 때문이다 — 어느 버전으로 검증했는지가
|
|
10
|
+
* 남아야 한다.
|
|
11
|
+
*/
|
|
12
|
+
export declare class TestSpecification {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
domain?: Domain;
|
|
15
|
+
domainId?: string;
|
|
16
|
+
/** 표준 `ID` — 자원이 이 값을 가리킨다. */
|
|
17
|
+
name: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
/** 표준 `Version`. 버전이 바뀌면 자격의 뜻이 바뀐다. */
|
|
20
|
+
version?: string;
|
|
21
|
+
/**
|
|
22
|
+
* 판단 기준들 — 표준 `TestSpecificationCriteria`.
|
|
23
|
+
*
|
|
24
|
+
* 한계값에는 단위가 함께 있어야 한다. 섭씨 한계에 화씨 관측을 비교하면 오류보고없이 틀린 답이 나온다.
|
|
25
|
+
*/
|
|
26
|
+
criteria?: Record<string, unknown>[];
|
|
27
|
+
/** 언제부터 유효한가 — 표준 `EffectiveStartDate`. */
|
|
28
|
+
effectiveStart?: Date;
|
|
29
|
+
/**
|
|
30
|
+
* 언제까지 유효한가 — 표준 `EffectiveEndDate`.
|
|
31
|
+
*
|
|
32
|
+
* **없앨 때 행을 지우지 않고 이 칸을 채운다.** 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
|
|
33
|
+
*/
|
|
34
|
+
effectiveEnd?: Date;
|
|
35
|
+
createdAt?: Date;
|
|
36
|
+
updatedAt?: Date;
|
|
37
|
+
creator?: User;
|
|
38
|
+
creatorId?: string;
|
|
39
|
+
updater?: User;
|
|
40
|
+
updaterId?: string;
|
|
41
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestSpecification = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const type_graphql_1 = require("type-graphql");
|
|
7
|
+
const shell_1 = require("@things-factory/shell");
|
|
8
|
+
const auth_base_1 = require("@things-factory/auth-base");
|
|
9
|
+
/**
|
|
10
|
+
* `TestSpecification` — **ISA-95 표준 명세**.
|
|
11
|
+
*
|
|
12
|
+
* 자원의 `testSpecificationIds` 가 가리키는 대상이다. 「무엇으로 검증하는가」를 이름으로 답하고,
|
|
13
|
+
* 기준(`criteria`)을 적으면 「판단에 근거가 있는가」까지 물을 수 있다.
|
|
14
|
+
*
|
|
15
|
+
* 버전을 갖는 이유는 같은 명세의 버전이 바뀌면 자격의 뜻도 바뀌기 때문이다 — 어느 버전으로 검증했는지가
|
|
16
|
+
* 남아야 한다.
|
|
17
|
+
*/
|
|
18
|
+
let TestSpecification = class TestSpecification {
|
|
19
|
+
};
|
|
20
|
+
exports.TestSpecification = TestSpecification;
|
|
21
|
+
tslib_1.__decorate([
|
|
22
|
+
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
|
|
23
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.ID),
|
|
24
|
+
tslib_1.__metadata("design:type", String)
|
|
25
|
+
], TestSpecification.prototype, "id", void 0);
|
|
26
|
+
tslib_1.__decorate([
|
|
27
|
+
(0, typeorm_1.ManyToOne)(type => shell_1.Domain),
|
|
28
|
+
(0, type_graphql_1.Field)(type => shell_1.Domain),
|
|
29
|
+
tslib_1.__metadata("design:type", shell_1.Domain)
|
|
30
|
+
], TestSpecification.prototype, "domain", void 0);
|
|
31
|
+
tslib_1.__decorate([
|
|
32
|
+
(0, typeorm_1.RelationId)((spec) => spec.domain),
|
|
33
|
+
tslib_1.__metadata("design:type", String)
|
|
34
|
+
], TestSpecification.prototype, "domainId", void 0);
|
|
35
|
+
tslib_1.__decorate([
|
|
36
|
+
(0, typeorm_1.Column)(),
|
|
37
|
+
(0, type_graphql_1.Field)(),
|
|
38
|
+
tslib_1.__metadata("design:type", String)
|
|
39
|
+
], TestSpecification.prototype, "name", void 0);
|
|
40
|
+
tslib_1.__decorate([
|
|
41
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
42
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
43
|
+
tslib_1.__metadata("design:type", String)
|
|
44
|
+
], TestSpecification.prototype, "description", void 0);
|
|
45
|
+
tslib_1.__decorate([
|
|
46
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
47
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
48
|
+
tslib_1.__metadata("design:type", String)
|
|
49
|
+
], TestSpecification.prototype, "version", void 0);
|
|
50
|
+
tslib_1.__decorate([
|
|
51
|
+
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
52
|
+
(0, type_graphql_1.Field)(type => String, { nullable: true, description: 'TestSpecificationCriterion[] as JSON text' }),
|
|
53
|
+
tslib_1.__metadata("design:type", Array)
|
|
54
|
+
], TestSpecification.prototype, "criteria", void 0);
|
|
55
|
+
tslib_1.__decorate([
|
|
56
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
57
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
58
|
+
tslib_1.__metadata("design:type", Date
|
|
59
|
+
/**
|
|
60
|
+
* 언제까지 유효한가 — 표준 `EffectiveEndDate`.
|
|
61
|
+
*
|
|
62
|
+
* **없앨 때 행을 지우지 않고 이 칸을 채운다.** 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
|
|
63
|
+
*/
|
|
64
|
+
)
|
|
65
|
+
], TestSpecification.prototype, "effectiveStart", void 0);
|
|
66
|
+
tslib_1.__decorate([
|
|
67
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
68
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
69
|
+
tslib_1.__metadata("design:type", Date)
|
|
70
|
+
], TestSpecification.prototype, "effectiveEnd", void 0);
|
|
71
|
+
tslib_1.__decorate([
|
|
72
|
+
(0, typeorm_1.CreateDateColumn)(),
|
|
73
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
74
|
+
tslib_1.__metadata("design:type", Date)
|
|
75
|
+
], TestSpecification.prototype, "createdAt", void 0);
|
|
76
|
+
tslib_1.__decorate([
|
|
77
|
+
(0, typeorm_1.UpdateDateColumn)(),
|
|
78
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
79
|
+
tslib_1.__metadata("design:type", Date)
|
|
80
|
+
], TestSpecification.prototype, "updatedAt", void 0);
|
|
81
|
+
tslib_1.__decorate([
|
|
82
|
+
(0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
|
|
83
|
+
(0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
|
|
84
|
+
tslib_1.__metadata("design:type", auth_base_1.User)
|
|
85
|
+
], TestSpecification.prototype, "creator", void 0);
|
|
86
|
+
tslib_1.__decorate([
|
|
87
|
+
(0, typeorm_1.RelationId)((spec) => spec.creator),
|
|
88
|
+
tslib_1.__metadata("design:type", String)
|
|
89
|
+
], TestSpecification.prototype, "creatorId", void 0);
|
|
90
|
+
tslib_1.__decorate([
|
|
91
|
+
(0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
|
|
92
|
+
(0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
|
|
93
|
+
tslib_1.__metadata("design:type", auth_base_1.User)
|
|
94
|
+
], TestSpecification.prototype, "updater", void 0);
|
|
95
|
+
tslib_1.__decorate([
|
|
96
|
+
(0, typeorm_1.RelationId)((spec) => spec.updater),
|
|
97
|
+
tslib_1.__metadata("design:type", String)
|
|
98
|
+
], TestSpecification.prototype, "updaterId", void 0);
|
|
99
|
+
exports.TestSpecification = TestSpecification = tslib_1.__decorate([
|
|
100
|
+
(0, typeorm_1.Entity)({ name: 'ops_test_specification' }),
|
|
101
|
+
(0, typeorm_1.Index)('ix_ops_test_specification_0', (spec) => [spec.domain, spec.name, spec.version], {
|
|
102
|
+
unique: true
|
|
103
|
+
}),
|
|
104
|
+
(0, type_graphql_1.ObjectType)({ description: 'ISA-95 TestSpecification — what a qualification is verified against' })
|
|
105
|
+
], TestSpecification);
|
|
106
|
+
//# sourceMappingURL=test-specification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-specification.js","sourceRoot":"","sources":["../../../server/service/test-spec/test-specification.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/**\n * `TestSpecification` — **ISA-95 표준 명세**.\n *\n * 자원의 `testSpecificationIds` 가 가리키는 대상이다. 「무엇으로 검증하는가」를 이름으로 답하고,\n * 기준(`criteria`)을 적으면 「판단에 근거가 있는가」까지 물을 수 있다.\n *\n * 버전을 갖는 이유는 같은 명세의 버전이 바뀌면 자격의 뜻도 바뀌기 때문이다 — 어느 버전으로 검증했는지가\n * 남아야 한다.\n */\n@Entity({ name: 'ops_test_specification' })\n@Index('ix_ops_test_specification_0', (spec: TestSpecification) => [spec.domain, spec.name, spec.version], {\n unique: true\n})\n@ObjectType({ description: 'ISA-95 TestSpecification — what a qualification is verified against' })\nexport class TestSpecification {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain)\n domain?: Domain\n\n @RelationId((spec: TestSpecification) => spec.domain)\n domainId?: string\n\n /** 표준 `ID` — 자원이 이 값을 가리킨다. */\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /** 표준 `Version`. 버전이 바뀌면 자격의 뜻이 바뀐다. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n version?: string\n\n /**\n * 판단 기준들 — 표준 `TestSpecificationCriteria`.\n *\n * 한계값에는 단위가 함께 있어야 한다. 섭씨 한계에 화씨 관측을 비교하면 오류보고없이 틀린 답이 나온다.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'TestSpecificationCriterion[] as JSON text' })\n criteria?: Record<string, unknown>[]\n\n /** 언제부터 유효한가 — 표준 `EffectiveStartDate`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveStart?: Date\n\n /**\n * 언제까지 유효한가 — 표준 `EffectiveEndDate`.\n *\n * **없앨 때 행을 지우지 않고 이 칸을 채운다.** 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.\n */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveEnd?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((spec: TestSpecification) => spec.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((spec: TestSpecification) => spec.updater)\n updaterId?: string\n}\n"]}
|