@things-factory/headless-twin 10.0.8 โ 10.0.10
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-server/engine/attention-digest.d.ts +52 -0
- package/dist-server/engine/attention-digest.js +76 -0
- package/dist-server/engine/attention-digest.js.map +1 -0
- package/dist-server/engine/canonical-ingest.d.ts +2 -2
- package/dist-server/engine/canonical-ingest.js +24 -2
- package/dist-server/engine/canonical-ingest.js.map +1 -1
- package/dist-server/engine/command-routing.d.ts +33 -0
- package/dist-server/engine/command-routing.js +53 -0
- package/dist-server/engine/command-routing.js.map +1 -0
- package/dist-server/engine/energy-topology.d.ts +86 -0
- package/dist-server/engine/energy-topology.js +144 -0
- package/dist-server/engine/energy-topology.js.map +1 -0
- package/dist-server/engine/index.d.ts +11 -0
- package/dist-server/engine/index.js +17 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/kpi-baseline.d.ts +78 -0
- package/dist-server/engine/kpi-baseline.js +123 -0
- package/dist-server/engine/kpi-baseline.js.map +1 -0
- package/dist-server/engine/kpi-fold.d.ts +137 -1
- package/dist-server/engine/kpi-fold.js +225 -0
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.d.ts +32 -1
- package/dist-server/engine/kpi-query.js +262 -20
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/kpi-target.d.ts +17 -0
- package/dist-server/engine/kpi-target.js +24 -2
- package/dist-server/engine/kpi-target.js.map +1 -1
- package/dist-server/engine/live-attentions.d.ts +1 -0
- package/dist-server/engine/live-attentions.js +7 -1
- package/dist-server/engine/live-attentions.js.map +1 -1
- package/dist-server/engine/live-feed-registry.d.ts +25 -0
- package/dist-server/engine/live-feed-registry.js +51 -0
- package/dist-server/engine/live-feed-registry.js.map +1 -0
- package/dist-server/engine/load-meter.d.ts +181 -0
- package/dist-server/engine/load-meter.js +267 -0
- package/dist-server/engine/load-meter.js.map +1 -0
- package/dist-server/engine/local-declarations.d.ts +262 -0
- package/dist-server/engine/local-declarations.js +528 -0
- package/dist-server/engine/local-declarations.js.map +1 -0
- package/dist-server/engine/model-basis.d.ts +39 -6
- package/dist-server/engine/model-basis.js +69 -9
- package/dist-server/engine/model-basis.js.map +1 -1
- package/dist-server/engine/model-vocabulary.d.ts +17 -0
- package/dist-server/engine/model-vocabulary.js +81 -0
- package/dist-server/engine/model-vocabulary.js.map +1 -0
- package/dist-server/engine/oee-accumulator.d.ts +28 -0
- package/dist-server/engine/oee-accumulator.js +26 -1
- package/dist-server/engine/oee-accumulator.js.map +1 -1
- package/dist-server/engine/operation-basis.d.ts +32 -0
- package/dist-server/engine/operation-basis.js +87 -0
- package/dist-server/engine/operation-basis.js.map +1 -0
- package/dist-server/engine/property-effects.d.ts +30 -0
- package/dist-server/engine/property-effects.js +192 -0
- package/dist-server/engine/property-effects.js.map +1 -0
- package/dist-server/engine/runtime-key.d.ts +15 -0
- package/dist-server/engine/runtime-key.js +64 -0
- package/dist-server/engine/runtime-key.js.map +1 -0
- package/dist-server/engine/spec-coverage.js +3 -3
- package/dist-server/engine/spec-coverage.js.map +1 -1
- package/dist-server/engine/state-axes.d.ts +21 -0
- package/dist-server/engine/state-axes.js +59 -0
- package/dist-server/engine/state-axes.js.map +1 -0
- package/dist-server/engine/structure-diff.js +1 -1
- package/dist-server/engine/structure-diff.js.map +1 -1
- package/dist-server/engine/travel-estimator.d.ts +9 -2
- package/dist-server/engine/travel-estimator.js +11 -6
- package/dist-server/engine/travel-estimator.js.map +1 -1
- package/dist-server/engine/twin-engine.d.ts +418 -57
- package/dist-server/engine/twin-engine.js +1599 -306
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/engine/warm-start.d.ts +93 -13
- package/dist-server/engine/warm-start.js +114 -14
- package/dist-server/engine/warm-start.js.map +1 -1
- package/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +17 -11
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.d.ts +5 -0
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js +48 -0
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +1 -0
- package/dist-server/migrations/index.d.ts +2 -0
- package/dist-server/migrations/index.js +10 -0
- package/dist-server/migrations/index.js.map +1 -0
- package/dist-server/service/index.d.ts +3 -2
- package/dist-server/service/index.js +25 -17
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/discovery-result.d.ts +34 -0
- package/dist-server/service/reference/discovery-result.js +84 -0
- package/dist-server/service/reference/discovery-result.js.map +1 -0
- package/dist-server/service/reference/ingest-space.d.ts +53 -0
- package/dist-server/service/reference/ingest-space.js +79 -0
- package/dist-server/service/reference/ingest-space.js.map +1 -0
- package/dist-server/service/reference/knob-defaults.d.ts +20 -0
- package/dist-server/service/reference/knob-defaults.js +59 -0
- package/dist-server/service/reference/knob-defaults.js.map +1 -0
- package/dist-server/service/reference/reference-live.d.ts +23 -0
- package/dist-server/service/reference/reference-live.js +123 -6
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +227 -11
- package/dist-server/service/reference/reference-master.js +206 -25
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.d.ts +33 -3
- package/dist-server/service/reference/reference-resolver.js +290 -23
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/reference/template-registry.d.ts +19 -3
- package/dist-server/service/reference/template-registry.js.map +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.d.ts +8 -1
- package/dist-server/service/twin-attention/twin-attention-query.js +39 -8
- package/dist-server/service/twin-attention/twin-attention-query.js.map +1 -1
- package/dist-server/service/twin-audit/command-audit.d.ts +37 -0
- package/dist-server/service/twin-audit/command-audit.js +53 -0
- package/dist-server/service/twin-audit/command-audit.js.map +1 -0
- package/dist-server/service/twin-audit/index.d.ts +4 -0
- package/dist-server/service/twin-audit/index.js +8 -0
- package/dist-server/service/twin-audit/index.js.map +1 -0
- package/dist-server/service/twin-audit/twin-audit-event.d.ts +24 -0
- package/dist-server/service/twin-audit/twin-audit-event.js +125 -0
- package/dist-server/service/twin-audit/twin-audit-event.js.map +1 -0
- package/dist-server/service/twin-audit/twin-audit-query.d.ts +4 -0
- package/dist-server/service/twin-audit/twin-audit-query.js +76 -0
- package/dist-server/service/twin-audit/twin-audit-query.js.map +1 -0
- package/dist-server/service/twin-control/twin-control-mutation.d.ts +2 -0
- package/dist-server/service/twin-control/twin-control-mutation.js +50 -11
- package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-keys.d.ts +1 -1
- package/dist-server/service/twin-event/twin-event-keys.js +1 -1
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +14 -5
- package/dist-server/service/twin-event/twin-event.js +46 -14
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-forecast/forecast-metrics.d.ts +13 -0
- package/dist-server/service/twin-forecast/forecast-metrics.js +57 -0
- package/dist-server/service/twin-forecast/forecast-metrics.js.map +1 -0
- package/dist-server/service/twin-forecast/forecast-tuning.d.ts +12 -0
- package/dist-server/service/twin-forecast/forecast-tuning.js +44 -0
- package/dist-server/service/twin-forecast/forecast-tuning.js.map +1 -0
- package/dist-server/service/twin-forecast/gap-analytics.d.ts +28 -2
- package/dist-server/service/twin-forecast/gap-analytics.js +43 -17
- package/dist-server/service/twin-forecast/gap-analytics.js.map +1 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js +219 -39
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
- package/dist-server/service/twin-instance/twin-instance.d.ts +38 -5
- package/dist-server/service/twin-instance/twin-instance.js +66 -18
- package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
- package/dist-server/service/twin-journal/twin-journal-query.d.ts +11 -4
- package/dist-server/service/twin-journal/twin-journal-query.js +95 -15
- package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +11 -5
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +46 -27
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.d.ts +1 -0
- package/dist-server/service/twin-metrics/twin-metrics-query.js +63 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
- package/dist-server/service/twin-model/epcis-coverage.d.ts +14 -0
- package/dist-server/service/twin-model/epcis-coverage.js +174 -0
- package/dist-server/service/twin-model/epcis-coverage.js.map +1 -0
- package/dist-server/service/twin-model/iec61850-coverage.d.ts +14 -0
- package/dist-server/service/twin-model/iec61850-coverage.js +98 -0
- package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -0
- package/dist-server/service/twin-model/index.d.ts +13 -0
- package/dist-server/service/twin-model/index.js +29 -0
- package/dist-server/service/twin-model/index.js.map +1 -0
- package/dist-server/service/twin-model/isa95-coverage.d.ts +48 -0
- package/dist-server/service/twin-model/isa95-coverage.js +155 -0
- package/dist-server/service/twin-model/isa95-coverage.js.map +1 -0
- package/dist-server/service/twin-model/project-structure.d.ts +16 -0
- package/dist-server/service/twin-model/project-structure.js +173 -0
- package/dist-server/service/twin-model/project-structure.js.map +1 -0
- package/dist-server/service/twin-model/standard-coverage.d.ts +9 -0
- package/dist-server/service/twin-model/standard-coverage.js +37 -0
- package/dist-server/service/twin-model/standard-coverage.js.map +1 -0
- package/dist-server/service/twin-model/twin-equipment.d.ts +64 -0
- package/dist-server/service/twin-model/twin-equipment.js +134 -0
- package/dist-server/service/twin-model/twin-equipment.js.map +1 -0
- package/dist-server/service/twin-model/twin-lineage-query.d.ts +3 -0
- package/dist-server/service/twin-model/twin-lineage-query.js +206 -0
- package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-location.d.ts +58 -0
- package/dist-server/service/twin-model/twin-location.js +130 -0
- package/dist-server/service/twin-model/twin-location.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-item-query.d.ts +141 -0
- package/dist-server/service/twin-model/twin-model-item-query.js +852 -0
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-mutation.d.ts +57 -0
- package/dist-server/service/twin-model/twin-model-mutation.js +490 -0
- package/dist-server/service/twin-model/twin-model-mutation.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-query.d.ts +43 -0
- package/dist-server/service/twin-model/twin-model-query.js +551 -0
- package/dist-server/service/twin-model/twin-model-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-tree-query.d.ts +3 -0
- package/dist-server/service/twin-model/twin-model-tree-query.js +158 -0
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-operation.d.ts +61 -0
- package/dist-server/service/twin-model/twin-operation.js +137 -0
- package/dist-server/service/twin-model/twin-operation.js.map +1 -0
- package/dist-server/service/twin-space/move-space.d.ts +65 -0
- package/dist-server/service/twin-space/move-space.js +166 -0
- package/dist-server/service/twin-space/move-space.js.map +1 -0
- package/dist-server/service/twin-space/space-integrity.d.ts +97 -0
- package/dist-server/service/twin-space/space-integrity.js +182 -0
- package/dist-server/service/twin-space/space-integrity.js.map +1 -0
- package/dist-server/service/twin-space/twin-space-area.js +4 -4
- package/dist-server/service/twin-space/twin-space-area.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-representation.js +6 -6
- package/dist-server/service/twin-space/twin-space-representation.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-resolver.d.ts +63 -1
- package/dist-server/service/twin-space/twin-space-resolver.js +365 -18
- package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
- package/dist-server/service/twin-space/twin-space.d.ts +17 -1
- package/dist-server/service/twin-space/twin-space.js +15 -5
- package/dist-server/service/twin-space/twin-space.js.map +1 -1
- package/dist-server/service/twin-state/twin-state-subscription.js +1 -1
- package/dist-server/service/twin-state/twin-state-subscription.js.map +1 -1
- package/dist-server/service/twin-structure/twin-structure.d.ts +1 -1
- package/dist-server/service/twin-structure/twin-structure.js +8 -7
- package/dist-server/service/twin-structure/twin-structure.js.map +1 -1
- package/dist-server/service/twin-target/twin-target-resolver.js +21 -4
- package/dist-server/service/twin-target/twin-target-resolver.js.map +1 -1
- package/dist-shared/axis-read.d.ts +12 -0
- package/dist-shared/axis-read.js +32 -0
- package/dist-shared/axis-read.js.map +1 -0
- package/dist-shared/entity-delta.d.ts +29 -0
- package/dist-shared/entity-delta.js +287 -0
- package/dist-shared/entity-delta.js.map +1 -0
- package/dist-shared/kpi-broadcast.d.ts +4 -0
- package/dist-shared/kpi-broadcast.js +16 -0
- package/dist-shared/kpi-broadcast.js.map +1 -0
- package/dist-shared/twin-level.d.ts +23 -0
- package/dist-shared/twin-level.js +52 -0
- package/dist-shared/twin-level.js.map +1 -0
- package/package.json +14 -12
- package/server/engine/attention-digest.ts +102 -0
- package/server/engine/canonical-ingest.ts +36 -4
- package/server/engine/command-routing.ts +67 -0
- package/server/engine/energy-topology.ts +189 -0
- package/server/engine/index.ts +17 -0
- package/server/engine/kpi-baseline.ts +202 -0
- package/server/engine/kpi-fold.ts +389 -1
- package/server/engine/kpi-query.ts +295 -22
- package/server/engine/kpi-target.ts +24 -2
- package/server/engine/live-attentions.ts +7 -2
- package/server/engine/live-feed-registry.ts +58 -0
- package/server/engine/load-meter.ts +384 -0
- package/server/engine/local-declarations.ts +700 -0
- package/server/engine/model-basis.ts +78 -10
- package/server/engine/model-vocabulary.ts +82 -0
- package/server/engine/oee-accumulator.ts +34 -1
- package/server/engine/operation-basis.ts +100 -0
- package/server/engine/property-effects.ts +199 -0
- package/server/engine/runtime-key.ts +58 -0
- package/server/engine/spec-coverage.ts +3 -3
- package/server/engine/state-axes.ts +60 -0
- package/server/engine/structure-diff.ts +1 -1
- package/server/engine/travel-estimator.ts +11 -6
- package/server/engine/twin-engine.ts +1710 -297
- package/server/engine/warm-start.ts +207 -22
- package/server/index.ts +13 -10
- package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +43 -0
- package/server/migrations/index.ts +7 -0
- package/server/service/index.ts +9 -1
- package/server/service/reference/discovery-result.ts +95 -0
- package/server/service/reference/ingest-space.ts +104 -0
- package/server/service/reference/knob-defaults.ts +59 -0
- package/server/service/reference/reference-live.ts +121 -6
- package/server/service/reference/reference-master.ts +362 -35
- package/server/service/reference/reference-resolver.ts +307 -23
- package/server/service/reference/template-registry.ts +20 -5
- package/server/service/twin-attention/twin-attention-query.ts +43 -6
- package/server/service/twin-audit/command-audit.ts +81 -0
- package/server/service/twin-audit/index.ts +5 -0
- package/server/service/twin-audit/twin-audit-event.ts +112 -0
- package/server/service/twin-audit/twin-audit-query.ts +72 -0
- package/server/service/twin-control/twin-control-mutation.ts +53 -13
- package/server/service/twin-event/twin-event-keys.ts +1 -1
- package/server/service/twin-event/twin-event.ts +52 -15
- package/server/service/twin-forecast/forecast-metrics.ts +60 -0
- package/server/service/twin-forecast/forecast-tuning.ts +40 -0
- package/server/service/twin-forecast/gap-analytics.ts +48 -9
- package/server/service/twin-forecast/twin-forecast-query.ts +211 -38
- package/server/service/twin-instance/twin-instance.ts +127 -22
- package/server/service/twin-journal/twin-journal-query.ts +108 -14
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +40 -23
- package/server/service/twin-metrics/twin-metrics-query.ts +60 -3
- package/server/service/twin-model/epcis-coverage.ts +195 -0
- package/server/service/twin-model/iec61850-coverage.ts +117 -0
- package/server/service/twin-model/index.ts +25 -0
- package/server/service/twin-model/isa95-coverage.ts +190 -0
- package/server/service/twin-model/project-structure.ts +199 -0
- package/server/service/twin-model/standard-coverage.ts +35 -0
- package/server/service/twin-model/twin-equipment.ts +150 -0
- package/server/service/twin-model/twin-lineage-query.ts +193 -0
- package/server/service/twin-model/twin-location.ts +140 -0
- package/server/service/twin-model/twin-model-item-query.ts +848 -0
- package/server/service/twin-model/twin-model-mutation.ts +503 -0
- package/server/service/twin-model/twin-model-query.ts +537 -0
- package/server/service/twin-model/twin-model-tree-query.ts +180 -0
- package/server/service/twin-model/twin-operation.ts +150 -0
- package/server/service/twin-space/move-space.ts +262 -0
- package/server/service/twin-space/space-integrity.ts +293 -0
- package/server/service/twin-space/twin-space-area.ts +4 -4
- package/server/service/twin-space/twin-space-representation.ts +6 -6
- package/server/service/twin-space/twin-space-resolver.ts +365 -22
- package/server/service/twin-space/twin-space.ts +40 -6
- package/server/service/twin-state/twin-state-subscription.ts +1 -1
- package/server/service/twin-structure/twin-structure.ts +10 -7
- package/server/service/twin-target/twin-target-resolver.ts +22 -4
- package/shared/axis-read.ts +28 -0
- package/shared/entity-delta.ts +286 -0
- package/shared/kpi-broadcast.ts +13 -0
- package/shared/twin-level.ts +48 -0
- package/test/adopt-structure-live.test.ts +133 -0
- package/test/attention-digest.test.ts +135 -0
- package/test/axis-read.test.ts +87 -0
- package/test/boot-resume.test.ts +205 -0
- package/test/canonical-ingest-vocabularies.test.ts +118 -0
- package/test/capability-mapping.test.ts +5 -5
- package/test/command-routing.test.ts +61 -0
- package/test/declaration-reaches-model.test.ts +178 -0
- package/test/discovery-result.test.ts +75 -0
- package/test/energy-topology.test.ts +113 -0
- package/test/entity-delta.test.ts +195 -25
- package/test/event-time-column.test.ts +67 -0
- package/test/forecast-metrics.test.ts +71 -0
- package/test/forecast-tuning.test.ts +42 -0
- package/test/gap-analytics.test.ts +34 -7
- package/test/ingest-bench.test.ts +9 -9
- package/test/ingest-running-guard.test.ts +136 -0
- package/test/ingest-space.test.ts +78 -0
- package/test/instance-cache-lifecycle.test.ts +110 -0
- package/test/kernel-kind-guard.test.ts +96 -0
- package/test/knob-defaults.test.ts +72 -0
- package/test/kpi-baseline-db.test.ts +216 -0
- package/test/kpi-baseline.test.ts +196 -0
- package/test/kpi-fold.test.ts +393 -2
- package/test/kpi-query-bench.test.ts +130 -0
- package/test/lineage-survives-restart.test.ts +203 -0
- package/test/live-feed-registry.test.ts +67 -0
- package/test/live-kernel-facts.test.ts +161 -0
- package/test/live-mirror-parity.test.ts +54 -14
- package/test/load-meter.test.ts +314 -0
- package/test/local-declarations.test.ts +554 -0
- package/test/master-to-twin.test.ts +128 -36
- package/test/model-basis.test.ts +56 -1
- package/test/model-vocabulary.test.ts +114 -0
- package/test/move-space.test.ts +149 -0
- package/test/mutation-gate.test.ts +122 -0
- package/test/oee-accumulator.test.ts +90 -7
- package/test/operation-basis.test.ts +100 -0
- package/test/operations-capability-db.test.ts +165 -0
- package/test/project-structure-db.test.ts +226 -0
- package/test/projection-reaches-screen.test.ts +272 -0
- package/test/property-effects.test.ts +96 -0
- package/test/registry-key-guard.test.ts +80 -0
- package/test/resync-origin-site.test.ts +77 -0
- package/test/runtime-key.test.ts +66 -0
- package/test/scale-twin-bench.test.ts +7 -7
- package/test/snapshot-freshness.test.ts +60 -0
- package/test/space-integrity.test.ts +223 -0
- package/test/standard-coverage.test.ts +94 -0
- package/test/state-axes.test.ts +74 -0
- package/test/streamline-e2e.test.ts +16 -16
- package/test/structure-revision-db.test.ts +16 -15
- package/test/tenant-registry-db.test.ts +149 -0
- package/test/twin-audit.test.ts +83 -0
- package/test/twin-model-item-db.test.ts +275 -0
- package/test/twin-model-tree-db.test.ts +176 -0
- package/test/twin-origin-resync.test.ts +114 -0
- package/test/warm-start-seam.test.ts +140 -0
- package/test/warm-start.test.ts +223 -4
- package/tsconfig.json +6 -1
- package/tsconfig.shared.json +23 -0
- package/tsconfig.shared.tsbuildinfo +1 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/dist-server/engine/entity-delta.d.ts +0 -19
- package/dist-server/engine/entity-delta.js +0 -161
- package/dist-server/engine/entity-delta.js.map +0 -1
- package/dist-server/service/twin-event/backfill-keys.d.ts +0 -11
- package/dist-server/service/twin-event/backfill-keys.js +0 -63
- package/dist-server/service/twin-event/backfill-keys.js.map +0 -1
- package/dist-server/tsconfig.tsbuildinfo +0 -1
- package/server/engine/entity-delta.ts +0 -169
- package/server/service/twin-event/backfill-keys.ts +0 -72
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TwinAuditEvent = 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
|
+
/*
|
|
9
|
+
* TwinAuditEvent โ **์ฌ๋์ด ๋ฌด์์ ํ๋ฝํ๋๊ฐ.**
|
|
10
|
+
*
|
|
11
|
+
* โโ ์ ์ ๋(TwinEvent)์ด ์๋๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
12
|
+
* ์ฒ์์๋ ์ ๋์ ํจ๊ป ๋ฃ์๋ค. "๊ฐ์ฌ๋ ์์ฅ์์ ํ๋๊น" ๋ผ๋ ์ด์ ์๋๋ฐ, ๊ทธ๊ฑด **ํ๋ฉด์ ํธ์**์๊ณ
|
|
13
|
+
* ์ ์ฅ ๊ตฌ์กฐ๋ฅผ ์ ํ ๊ทผ๊ฑฐ๊ฐ ๋ชป ๋๋ค. ๋ฃ์๋ง์ ์์ธ๊ฐ ๋ท ์๊ฒผ๋ค โ ๋ฆฌํ๋ ์ด์์ ๋นผ๊ณ , ๋ฐฑํ์์ ๋นผ๊ณ ,
|
|
14
|
+
* ์์ฅ ๊ฑฐ๋ ๋ถ๋ฅ์์ ๋นผ๊ณ , ์์ฅ ๋ ๋์์ ๊ฐ๋๋ค. **์์ธ๊ฐ ๋ท์ด๋ฉด ์ค๊ณ๊ฐ "์ฌ๊ธฐ ์๋๋ค" ๋ผ๊ณ ๋งํ๋ ๊ฒ์ด๋ค.**
|
|
15
|
+
*
|
|
16
|
+
* ๊ฐ๋ผ ๋๋ฉด ์์ธ๊ฐ 0 ์ด๊ณ , ์คํ๋ ค ์ป๋๋ค:
|
|
17
|
+
* ยท ํ์์๊ฐ **์ปฌ๋ผ**์ด ๋๋ค โ "๋๊ฐ ์น์ธํ ๊ฒ ์ ๋ถ" ๋ ๊ฐ์ฌ์ ๊ธฐ๋ณธ ์ง๋ฌธ์ธ๋ฐ payload ์์์๋ ๋ชป ์ฐพ์๋ค
|
|
18
|
+
* ยท revision ์ด ์๋ค. ์ ๋์์๋ ๊ทธ ์นธ์ ๋น์ "์ํ๊ฐ ์๋" ์ ๋ปํ๊ฒ ์ผ๋๋ฐ, ์์์ ์ข
๋ฅ ํ์๋ก
|
|
19
|
+
* ์ฐ๋ ๊ฒ์ด ์ฌ๋ฌ ๋ฒ ๋ฌธ์ ๋ฅผ ๋๋ค(๋ฐฑํ์ `bizStep IS NULL = ์ ํ` ์ ์ ๊ฐ ์ด๊ฒ ๋๋ฌธ์ ๊นจ์ก๋ค)
|
|
20
|
+
* ยท bizStep ์ค์ผ์ด ์๋ค โ ์ ๋์ ํค ์ถ์ถ๊ธฐ๋ ๊ฐ์ด ์์ผ๋ฉด ์ด๋ฒคํธ ํ์
์ผ๋ก ๋์ฒดํ๋ฏ๋ก,
|
|
21
|
+
* ๊ฐ์ฌ ํ์ ํ์ฐ๋ฉด CBV ํ์ค ์ดํ ์ปฌ๋ผ์ `governance.command` ๊ฐ ๋ฐํ๋ค
|
|
22
|
+
*
|
|
23
|
+
* โโ ๋ฌด์์ ๋ฏฟ๋๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
24
|
+
* **์ ์ยท์๊ฐ์ ์๋ฒ๊ฐ ๊ฐ์ธํ๋ค.** ํด๋ผ์ด์ธํธ๊ฐ ๋งํ ์ ์์ ๊ทธ๋๋ก ์ ์ผ๋ฉด ์์กฐ๊ฐ ์์ ๋ก์ ๊ทธ ๊ธฐ๋ก์
|
|
25
|
+
* ์๋ฌด๊ฒ๋ ์ฆ๋ช
ํ์ง ๋ชปํ๋ค. ์ธ์
์ด ์๋ ์ฌ์ฉ์์ ์๋ฒ ์๊ฐ๋ง ์ ๋ขฐํ๋ค.
|
|
26
|
+
* ํด๋ผ์ด์ธํธ์์ ๋ฐ๋ ๊ฒ์ **์๋**๋ฟ์ด๋ค โ ์ด๋์ ์์๋๋(origin), ์ ํ๋(reason).
|
|
27
|
+
*/
|
|
28
|
+
let TwinAuditEvent = class TwinAuditEvent {
|
|
29
|
+
};
|
|
30
|
+
exports.TwinAuditEvent = TwinAuditEvent;
|
|
31
|
+
tslib_1.__decorate([
|
|
32
|
+
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
|
|
33
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.ID, { description: 'Unique identifier of the audit record.' }),
|
|
34
|
+
tslib_1.__metadata("design:type", String)
|
|
35
|
+
], TwinAuditEvent.prototype, "id", void 0);
|
|
36
|
+
tslib_1.__decorate([
|
|
37
|
+
(0, typeorm_1.ManyToOne)(type => shell_1.Domain),
|
|
38
|
+
(0, type_graphql_1.Field)(type => shell_1.Domain, { nullable: true, description: 'Owning tenant domain.' }),
|
|
39
|
+
tslib_1.__metadata("design:type", shell_1.Domain)
|
|
40
|
+
], TwinAuditEvent.prototype, "domain", void 0);
|
|
41
|
+
tslib_1.__decorate([
|
|
42
|
+
(0, typeorm_1.RelationId)((e) => e.domain),
|
|
43
|
+
tslib_1.__metadata("design:type", String)
|
|
44
|
+
], TwinAuditEvent.prototype, "domainId", void 0);
|
|
45
|
+
tslib_1.__decorate([
|
|
46
|
+
(0, typeorm_1.Column)(),
|
|
47
|
+
(0, type_graphql_1.Field)({ description: 'Twin runtime instance the command was aimed at.' }),
|
|
48
|
+
tslib_1.__metadata("design:type", String)
|
|
49
|
+
], TwinAuditEvent.prototype, "instanceId", void 0);
|
|
50
|
+
tslib_1.__decorate([
|
|
51
|
+
(0, typeorm_1.Column)({ type: 'datetime' }),
|
|
52
|
+
(0, type_graphql_1.Field)({ description: 'Server time when the command was dispatched.' }),
|
|
53
|
+
tslib_1.__metadata("design:type", Date)
|
|
54
|
+
], TwinAuditEvent.prototype, "eventTime", void 0);
|
|
55
|
+
tslib_1.__decorate([
|
|
56
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
57
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Client-supplied command id, for correlating with kernel logs.' }),
|
|
58
|
+
tslib_1.__metadata("design:type", String)
|
|
59
|
+
], TwinAuditEvent.prototype, "commandId", void 0);
|
|
60
|
+
tslib_1.__decorate([
|
|
61
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
62
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Command type (e.g. order.hold, equipment.repair).' }),
|
|
63
|
+
tslib_1.__metadata("design:type", String)
|
|
64
|
+
], TwinAuditEvent.prototype, "commandType", void 0);
|
|
65
|
+
tslib_1.__decorate([
|
|
66
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
67
|
+
(0, type_graphql_1.Field)({ nullable: true, description: "Where the command originated: 'user' | 'ai' | 'automation' | 'unknown'." }),
|
|
68
|
+
tslib_1.__metadata("design:type", String)
|
|
69
|
+
], TwinAuditEvent.prototype, "origin", void 0);
|
|
70
|
+
tslib_1.__decorate([
|
|
71
|
+
(0, typeorm_1.Column)({ type: 'text', nullable: true }),
|
|
72
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Why this action โ the rationale shown on the approval card.' }),
|
|
73
|
+
tslib_1.__metadata("design:type", String)
|
|
74
|
+
], TwinAuditEvent.prototype, "reason", void 0);
|
|
75
|
+
tslib_1.__decorate([
|
|
76
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
77
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Approving user id, stamped by the server from the session.' }),
|
|
78
|
+
tslib_1.__metadata("design:type", String)
|
|
79
|
+
], TwinAuditEvent.prototype, "actorId", void 0);
|
|
80
|
+
tslib_1.__decorate([
|
|
81
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
82
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Approving user email, stamped by the server from the session.' }),
|
|
83
|
+
tslib_1.__metadata("design:type", String)
|
|
84
|
+
], TwinAuditEvent.prototype, "actorEmail", void 0);
|
|
85
|
+
tslib_1.__decorate([
|
|
86
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
87
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Approving user name, stamped by the server from the session.' }),
|
|
88
|
+
tslib_1.__metadata("design:type", String)
|
|
89
|
+
], TwinAuditEvent.prototype, "actorName", void 0);
|
|
90
|
+
tslib_1.__decorate([
|
|
91
|
+
(0, typeorm_1.Column)({ default: false }),
|
|
92
|
+
(0, type_graphql_1.Field)({ description: 'Whether the kernel accepted the command.' }),
|
|
93
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
94
|
+
], TwinAuditEvent.prototype, "accepted", void 0);
|
|
95
|
+
tslib_1.__decorate([
|
|
96
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
97
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Language-neutral rejection code when the kernel refused.' }),
|
|
98
|
+
tslib_1.__metadata("design:type", String)
|
|
99
|
+
], TwinAuditEvent.prototype, "errorCode", void 0);
|
|
100
|
+
tslib_1.__decorate([
|
|
101
|
+
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
102
|
+
(0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'Command arguments as given.' }),
|
|
103
|
+
tslib_1.__metadata("design:type", Object)
|
|
104
|
+
], TwinAuditEvent.prototype, "args", void 0);
|
|
105
|
+
tslib_1.__decorate([
|
|
106
|
+
(0, typeorm_1.Column)({ default: false }),
|
|
107
|
+
(0, type_graphql_1.Field)({ description: 'True when args were too large and stored truncated.' }),
|
|
108
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
109
|
+
], TwinAuditEvent.prototype, "argsTruncated", void 0);
|
|
110
|
+
tslib_1.__decorate([
|
|
111
|
+
(0, typeorm_1.CreateDateColumn)(),
|
|
112
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Timestamp when the audit row was written.' }),
|
|
113
|
+
tslib_1.__metadata("design:type", Date)
|
|
114
|
+
], TwinAuditEvent.prototype, "createdAt", void 0);
|
|
115
|
+
exports.TwinAuditEvent = TwinAuditEvent = tslib_1.__decorate([
|
|
116
|
+
(0, typeorm_1.Entity)()
|
|
117
|
+
/* ๋ชฉ๋ก ๊ธฐ๋ณธ ์ ๋ ฌ โ ์ต๊ทผ ๊ฒ๋ถํฐ. ๊ฐ์ฌ๋ "์์ฆ ๋ฌด์จ ์ผ์ด ์์๋" ๋ก ์์ํ๋ค. */
|
|
118
|
+
,
|
|
119
|
+
(0, typeorm_1.Index)('ix_twin_audit_0', (e) => [e.domain, e.instanceId, e.eventTime], { unique: false })
|
|
120
|
+
/* ํ์์๋ก ์ฐพ๊ธฐ โ ์ ๋์ ์์ ๋๋ ๋ถ๊ฐ๋ฅํ๋ ์ง๋ฌธ("๊นํ์ฅ์ด ์น์ธํ ๊ฒ ์ ๋ถ"). */
|
|
121
|
+
,
|
|
122
|
+
(0, typeorm_1.Index)('ix_twin_audit_1', (e) => [e.domain, e.actorEmail, e.eventTime], { unique: false }),
|
|
123
|
+
(0, type_graphql_1.ObjectType)({ description: 'Audit record of a twin command: who approved what, and what the kernel answered.' })
|
|
124
|
+
], TwinAuditEvent);
|
|
125
|
+
//# sourceMappingURL=twin-audit-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twin-audit-event.js","sourceRoot":"","sources":["../../../server/service/twin-audit/twin-audit-event.ts"],"names":[],"mappings":"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","sourcesContent":["import { CreateDateColumn, Entity, Index, Column, RelationId, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'\nimport { ObjectType, Field, ID } from 'type-graphql'\n\nimport { Domain, ScalarObject } from '@things-factory/shell'\n\n/*\n * TwinAuditEvent โ **์ฌ๋์ด ๋ฌด์์ ํ๋ฝํ๋๊ฐ.**\n *\n * โโ ์ ์ ๋(TwinEvent)์ด ์๋๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฒ์์๋ ์ ๋์ ํจ๊ป ๋ฃ์๋ค. \"๊ฐ์ฌ๋ ์์ฅ์์ ํ๋๊น\" ๋ผ๋ ์ด์ ์๋๋ฐ, ๊ทธ๊ฑด **ํ๋ฉด์ ํธ์**์๊ณ \n * ์ ์ฅ ๊ตฌ์กฐ๋ฅผ ์ ํ ๊ทผ๊ฑฐ๊ฐ ๋ชป ๋๋ค. ๋ฃ์๋ง์ ์์ธ๊ฐ ๋ท ์๊ฒผ๋ค โ ๋ฆฌํ๋ ์ด์์ ๋นผ๊ณ , ๋ฐฑํ์์ ๋นผ๊ณ ,\n * ์์ฅ ๊ฑฐ๋ ๋ถ๋ฅ์์ ๋นผ๊ณ , ์์ฅ ๋ ๋์์ ๊ฐ๋๋ค. **์์ธ๊ฐ ๋ท์ด๋ฉด ์ค๊ณ๊ฐ \"์ฌ๊ธฐ ์๋๋ค\" ๋ผ๊ณ ๋งํ๋ ๊ฒ์ด๋ค.**\n *\n * ๊ฐ๋ผ ๋๋ฉด ์์ธ๊ฐ 0 ์ด๊ณ , ์คํ๋ ค ์ป๋๋ค:\n * ยท ํ์์๊ฐ **์ปฌ๋ผ**์ด ๋๋ค โ \"๋๊ฐ ์น์ธํ ๊ฒ ์ ๋ถ\" ๋ ๊ฐ์ฌ์ ๊ธฐ๋ณธ ์ง๋ฌธ์ธ๋ฐ payload ์์์๋ ๋ชป ์ฐพ์๋ค\n * ยท revision ์ด ์๋ค. ์ ๋์์๋ ๊ทธ ์นธ์ ๋น์ \"์ํ๊ฐ ์๋\" ์ ๋ปํ๊ฒ ์ผ๋๋ฐ, ์์์ ์ข
๋ฅ ํ์๋ก\n * ์ฐ๋ ๊ฒ์ด ์ฌ๋ฌ ๋ฒ ๋ฌธ์ ๋ฅผ ๋๋ค(๋ฐฑํ์ `bizStep IS NULL = ์ ํ` ์ ์ ๊ฐ ์ด๊ฒ ๋๋ฌธ์ ๊นจ์ก๋ค)\n * ยท bizStep ์ค์ผ์ด ์๋ค โ ์ ๋์ ํค ์ถ์ถ๊ธฐ๋ ๊ฐ์ด ์์ผ๋ฉด ์ด๋ฒคํธ ํ์
์ผ๋ก ๋์ฒดํ๋ฏ๋ก,\n * ๊ฐ์ฌ ํ์ ํ์ฐ๋ฉด CBV ํ์ค ์ดํ ์ปฌ๋ผ์ `governance.command` ๊ฐ ๋ฐํ๋ค\n *\n * โโ ๋ฌด์์ ๋ฏฟ๋๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * **์ ์ยท์๊ฐ์ ์๋ฒ๊ฐ ๊ฐ์ธํ๋ค.** ํด๋ผ์ด์ธํธ๊ฐ ๋งํ ์ ์์ ๊ทธ๋๋ก ์ ์ผ๋ฉด ์์กฐ๊ฐ ์์ ๋ก์ ๊ทธ ๊ธฐ๋ก์\n * ์๋ฌด๊ฒ๋ ์ฆ๋ช
ํ์ง ๋ชปํ๋ค. ์ธ์
์ด ์๋ ์ฌ์ฉ์์ ์๋ฒ ์๊ฐ๋ง ์ ๋ขฐํ๋ค.\n * ํด๋ผ์ด์ธํธ์์ ๋ฐ๋ ๊ฒ์ **์๋**๋ฟ์ด๋ค โ ์ด๋์ ์์๋๋(origin), ์ ํ๋(reason).\n */\n@Entity()\n/* ๋ชฉ๋ก ๊ธฐ๋ณธ ์ ๋ ฌ โ ์ต๊ทผ ๊ฒ๋ถํฐ. ๊ฐ์ฌ๋ \"์์ฆ ๋ฌด์จ ์ผ์ด ์์๋\" ๋ก ์์ํ๋ค. */\n@Index('ix_twin_audit_0', (e: TwinAuditEvent) => [e.domain, e.instanceId, e.eventTime], { unique: false })\n/* ํ์์๋ก ์ฐพ๊ธฐ โ ์ ๋์ ์์ ๋๋ ๋ถ๊ฐ๋ฅํ๋ ์ง๋ฌธ(\"๊นํ์ฅ์ด ์น์ธํ ๊ฒ ์ ๋ถ\"). */\n@Index('ix_twin_audit_1', (e: TwinAuditEvent) => [e.domain, e.actorEmail, e.eventTime], { unique: false })\n@ObjectType({ description: 'Audit record of a twin command: who approved what, and what the kernel answered.' })\nexport class TwinAuditEvent {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier of the audit record.' })\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'Owning tenant domain.' })\n domain?: Domain\n\n @RelationId((e: TwinAuditEvent) => e.domain)\n domainId?: string\n\n @Column()\n @Field({ description: 'Twin runtime instance the command was aimed at.' })\n instanceId: string\n\n /*\n * ์๋ฒ ์๊ฐ. ํด๋ผ์ด์ธํธ ์๊ณ๋ฅผ ๋ฏฟ์ง ์๋๋ค โ ๊ธฐ๋ก์ ์๊ฐ์ถ์ด ๋จ๋ง ์ค์ ์ ์ข์ฐ๋๋ฉด ์ ๋๋ค.\n *\n * `datetime` ์ ์ด๋ค. `timestamp` ๋ **sqlite ๊ฐ ์ง์ํ์ง ์์** 5๊ฐ ๋๋ผ์ด๋ฒ ๊ณตํต์ด ์๋๋ค\n * (์ค์ ๋ก ๊ทธ๋ ๊ฒ ์ผ๋ค๊ฐ DB ๋ฅผ ์ฐ๋ ๊ฒ์ฌ 33๊ฐ๊ฐ ํ๊บผ๋ฒ์ ํฐ์ก๋ค).\n */\n @Column({ type: 'datetime' })\n @Field({ description: 'Server time when the command was dispatched.' })\n eventTime: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Client-supplied command id, for correlating with kernel logs.' })\n commandId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Command type (e.g. order.hold, equipment.repair).' })\n commandType?: string\n\n /* 'user' | 'ai' | 'automation' | 'unknown'. ๋ชจ๋ฅด๋ฉด unknown ์ด์ง ์ฌ๋์ด ํ ๊ฒ์ผ๋ก ์น์ง ์๋๋ค. */\n @Column({ nullable: true })\n @Field({ nullable: true, description: \"Where the command originated: 'user' | 'ai' | 'automation' | 'unknown'.\" })\n origin?: string\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'Why this action โ the rationale shown on the approval card.' })\n reason?: string\n\n /* โโ ์ ์: ์ธ์
์์๋ง ์จ๋ค โโ */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Approving user id, stamped by the server from the session.' })\n actorId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Approving user email, stamped by the server from the session.' })\n actorEmail?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Approving user name, stamped by the server from the session.' })\n actorName?: string\n\n /* โโ ๊ฒฐ๊ณผ: ๊ฑฐ์ ๋ ๋จ๊ธด๋ค โโ */\n @Column({ default: false })\n @Field({ description: 'Whether the kernel accepted the command.' })\n accepted: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Language-neutral rejection code when the kernel refused.' })\n errorCode?: string\n\n /**\n * ๋ช
๋ น ์ธ์ โ **์ํ ๊ทธ๋๋ก.** ๋ฌด์์ ๋ํ ๋ช
๋ น์ด์๋์ง๊ฐ ๊ฐ์ฌ์ ํต์ฌ์ด๋ผ ์์ฝํ์ง ์๋๋ค.\n * ์ง๋์น๊ฒ ํฌ๋ฉด ์๋ฅด๋ `argsTruncated` ๋ก ์๋๋ค๋ ์ฌ์ค์ ๋จ๊ธด๋ค(์กฐ์ฉํ ๋ฒ๋ฆฌ์ง ์๋๋ค).\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Command arguments as given.' })\n args?: any\n\n @Column({ default: false })\n @Field({ description: 'True when args were too large and stored truncated.' })\n argsTruncated: boolean\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when the audit row was written.' })\n createdAt?: Date\n}\n"]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TwinAuditQuery = 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 twin_audit_event_js_1 = require("./twin-audit-event.js");
|
|
8
|
+
/*
|
|
9
|
+
* ์น์ธ ๊ธฐ๋ก ์กฐํ โ **๊ฐ์ฌ์ ๊ธฐ๋ณธ ์ง๋ฌธ์ ๋ตํ๋ค.**
|
|
10
|
+
*
|
|
11
|
+
* "์์ฆ ๋ฌด์จ ์กฐ์น๊ฐ ๋๊ฐ๋" โ ์ต๊ทผ์ ๋ชฉ๋ก
|
|
12
|
+
* "๊นํ์ฅ์ด ์น์ธํ ๊ฒ ์ ๋ถ" โ ํ์์ ๊ฒ์(์ธ๋ฑ์ค ์์)
|
|
13
|
+
* "AI ๊ฐ ์ ์ํ ๊ฒ๋ง" โ origin ํํฐ
|
|
14
|
+
* "๊ฑฐ์ ๋ ์๋" โ accepted ํํฐ
|
|
15
|
+
*
|
|
16
|
+
* ์ ๋์ ์์ฌ ์์ ๋๋ ์ด ์ค ์ด๋ ๊ฒ๋ ๋ชป ํ๋ค โ ํ์์๊ฐ payload JSON ์์ด๋ผ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ ์ ์์๋ค.
|
|
17
|
+
*/
|
|
18
|
+
/** ์๊ฐ ํํฐ ๊ฐ์ ๋ ์ง๋ก โ ๋ชป ์ฝ๋ ๊ฐ์ ๊ทธ๋๋ก ๋๋ค(์ง์ด๋ด์ง ์๋๋ค). */
|
|
19
|
+
function toDateValue(v) {
|
|
20
|
+
const one = (x) => {
|
|
21
|
+
if (x instanceof Date)
|
|
22
|
+
return x;
|
|
23
|
+
const t = typeof x === 'string' ? Date.parse(x) : NaN;
|
|
24
|
+
return Number.isNaN(t) ? x : new Date(t);
|
|
25
|
+
};
|
|
26
|
+
return Array.isArray(v) ? v.map(one) : one(v);
|
|
27
|
+
}
|
|
28
|
+
let TwinAuditQuery = class TwinAuditQuery {
|
|
29
|
+
/* ์กฐํ ๊ฒ์ดํธ๋ ๋ฌ์ง ์๋๋ค โ ์ด ์ ์ฅ์์ ๊ท์ฝ์ด๊ณ (mutation-gate ๊ฒ์ฌ๊ฐ ์ ๋ณธ์ ์งํจ๋ค),
|
|
30
|
+
๋๋ฉ์ธ ํํฐ๊ฐ ํ
๋ํธ ๊ฒฝ๊ณ๋ฅผ ์ด๋ฏธ ์งํจ๋ค. ํ
๋ํธ๋ฅผ ๋์ด ์ฝ๋ ๊ณ๊ธฐํ๋ง OPS_GATE ๋ฅผ ์ด๋ค. */
|
|
31
|
+
async twinAuditList(params, context) {
|
|
32
|
+
const domainId = context.state.domain?.id;
|
|
33
|
+
if (!domainId)
|
|
34
|
+
return { items: [], total: 0 };
|
|
35
|
+
const effective = {
|
|
36
|
+
...(params ?? {}),
|
|
37
|
+
/* ๊ธฐ๋ณธ ์ ๋ ฌ โ ์ต๊ทผ ๊ฒ๋ถํฐ. ๊ฐ์ฌ๋ "์์ฆ" ์์ ์์ํ๋ค. */
|
|
38
|
+
sortings: params?.sortings?.length ? params.sortings : [{ name: 'eventTime', desc: true }],
|
|
39
|
+
/* ์๊ฐ ํํฐ๋ ๋ ์ง๋ก ์ฎ๊ฒจ์ ๋๊ธด๋ค โ ๋ฌธ์์ด ๊ทธ๋๋ก๋ฉด ์กฐ์ฉํ 0๊ฑด์ด ๋๋ค(์ ๋๊ณผ ๊ฐ์ ์ด์ ). */
|
|
40
|
+
filters: (params?.filters ?? []).map(f => (f.name === 'eventTime' ? { ...f, value: toDateValue(f.value) } : f))
|
|
41
|
+
};
|
|
42
|
+
const qb = (0, shell_1.getQueryBuilderFromListParams)({
|
|
43
|
+
repository: (0, shell_1.getRepository)(twin_audit_event_js_1.TwinAuditEvent),
|
|
44
|
+
params: effective,
|
|
45
|
+
domain: context.state.domain,
|
|
46
|
+
alias: 'a',
|
|
47
|
+
/*
|
|
48
|
+
* `searchables` ๋ ์ ๋ถ **์ค์ปฌ๋ผ**์ด๋ค โ ํ๋ ์์ํฌ ์ง์ ๋น๋๋ ์ฌ๊ธฐ ์๋ ์ปฌ๋ผ์ LIKE ๋ฅผ
|
|
49
|
+
* ๊ฒฝ๊ณ ํ ๋ฌด์ํ๋ค(์ธ๋ฑ์ค ์๋ ์ ์ฒด ์ค์บ ๋ฐฉ์ง). ํ์์๋ก ์ฐพ๋ ๊ฒ์ด ์ด ํ
์ด๋ธ์ ๊ตฌ๋ถํ ์ด์ ๋ค.
|
|
50
|
+
*/
|
|
51
|
+
searchables: ['actorEmail', 'actorName', 'commandType', 'origin', 'errorCode', 'reason'],
|
|
52
|
+
sortables: ['eventTime', 'commandType', 'actorEmail', 'origin', 'accepted'],
|
|
53
|
+
/* ๊ฐ์ฌ ๋ชฉ๋ก์ ์ฌ๋์ด ์ฝ๋ ์๋๋ก ๋ณธ๋ค โ ํฌ๊ฒ ํผ ์ค๋ ๊ฒ์ด ์ด๋์ด ์๋๋ค. */
|
|
54
|
+
defaultLimit: 50,
|
|
55
|
+
maxLimit: 200
|
|
56
|
+
});
|
|
57
|
+
const [items, total] = await qb.getManyAndCount();
|
|
58
|
+
return { items, total };
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
exports.TwinAuditQuery = TwinAuditQuery;
|
|
62
|
+
tslib_1.__decorate([
|
|
63
|
+
(0, type_graphql_1.Query)(returns => shell_1.ScalarObject, {
|
|
64
|
+
nullable: true,
|
|
65
|
+
description: 'List twin command audit records (who approved what, and what the kernel answered) with the standard list contract, plus the total match count.'
|
|
66
|
+
}),
|
|
67
|
+
tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
|
|
68
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
69
|
+
tslib_1.__metadata("design:type", Function),
|
|
70
|
+
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
|
|
71
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
72
|
+
], TwinAuditQuery.prototype, "twinAuditList", null);
|
|
73
|
+
exports.TwinAuditQuery = TwinAuditQuery = tslib_1.__decorate([
|
|
74
|
+
(0, type_graphql_1.Resolver)()
|
|
75
|
+
], TwinAuditQuery);
|
|
76
|
+
//# sourceMappingURL=twin-audit-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twin-audit-query.js","sourceRoot":"","sources":["../../../server/service/twin-audit/twin-audit-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAyD;AAEzD,iDAA6G;AAE7G,+DAAsD;AAEtD;;;;;;;;;GASG;AACH,+CAA+C;AAC/C,SAAS,WAAW,CAAC,CAAM;IACzB,MAAM,GAAG,GAAG,CAAC,CAAM,EAAE,EAAE;QACrB,IAAI,CAAC,YAAY,IAAI;YAAE,OAAO,CAAC,CAAA;QAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACrD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1C,CAAC,CAAA;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC;AAGM,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB;gEAC4D;IAMtD,AAAN,KAAK,CAAC,aAAa,CAGQ,MAAiB,EACnC,OAAwB;QAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAA;QACzC,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;QAE7C,MAAM,SAAS,GAAc;YAC3B,GAAG,CAAC,MAAM,IAAK,EAAgB,CAAC;YAChC,uCAAuC;YACvC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC1F,0DAA0D;YAC1D,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAChH,CAAA;QAED,MAAM,EAAE,GAAG,IAAA,qCAA6B,EAAC;YACvC,UAAU,EAAE,IAAA,qBAAa,EAAC,oCAAc,CAAC;YACzC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;YAC5B,KAAK,EAAE,GAAG;YACV;;;eAGG;YACH,WAAW,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC;YACxF,SAAS,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,CAAC;YAC3E,gDAAgD;YAChD,YAAY,EAAE,EAAE;YAChB,QAAQ,EAAE,GAAG;SACd,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,eAAe,EAAE,CAAA;QACjD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;CACF,CAAA;AA5CY,wCAAc;AAQnB;IALL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAY,EAAE;QAC9B,QAAQ,EAAE,IAAI;QACd,WAAW,EACT,gJAAgJ;KACnJ,CAAC;IAIC,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IACvB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAD2B,iBAAS;;mDAgC3C;yBA3CU,cAAc;IAD1B,IAAA,uBAAQ,GAAE;GACE,cAAc,CA4C1B","sourcesContent":["import { Args, Ctx, Query, Resolver } from 'type-graphql'\n\nimport { ListParam, getQueryBuilderFromListParams, getRepository, ScalarObject } from '@things-factory/shell'\n\nimport { TwinAuditEvent } from './twin-audit-event.js'\n\n/*\n * ์น์ธ ๊ธฐ๋ก ์กฐํ โ **๊ฐ์ฌ์ ๊ธฐ๋ณธ ์ง๋ฌธ์ ๋ตํ๋ค.**\n *\n * \"์์ฆ ๋ฌด์จ ์กฐ์น๊ฐ ๋๊ฐ๋\" โ ์ต๊ทผ์ ๋ชฉ๋ก\n * \"๊นํ์ฅ์ด ์น์ธํ ๊ฒ ์ ๋ถ\" โ ํ์์ ๊ฒ์(์ธ๋ฑ์ค ์์)\n * \"AI ๊ฐ ์ ์ํ ๊ฒ๋ง\" โ origin ํํฐ\n * \"๊ฑฐ์ ๋ ์๋\" โ accepted ํํฐ\n *\n * ์ ๋์ ์์ฌ ์์ ๋๋ ์ด ์ค ์ด๋ ๊ฒ๋ ๋ชป ํ๋ค โ ํ์์๊ฐ payload JSON ์์ด๋ผ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ ์ ์์๋ค.\n */\n/** ์๊ฐ ํํฐ ๊ฐ์ ๋ ์ง๋ก โ ๋ชป ์ฝ๋ ๊ฐ์ ๊ทธ๋๋ก ๋๋ค(์ง์ด๋ด์ง ์๋๋ค). */\nfunction toDateValue(v: any): any {\n const one = (x: any) => {\n if (x instanceof Date) return x\n const t = typeof x === 'string' ? Date.parse(x) : NaN\n return Number.isNaN(t) ? x : new Date(t)\n }\n return Array.isArray(v) ? v.map(one) : one(v)\n}\n\n@Resolver()\nexport class TwinAuditQuery {\n /* ์กฐํ ๊ฒ์ดํธ๋ ๋ฌ์ง ์๋๋ค โ ์ด ์ ์ฅ์์ ๊ท์ฝ์ด๊ณ (mutation-gate ๊ฒ์ฌ๊ฐ ์ ๋ณธ์ ์งํจ๋ค),\n ๋๋ฉ์ธ ํํฐ๊ฐ ํ
๋ํธ ๊ฒฝ๊ณ๋ฅผ ์ด๋ฏธ ์งํจ๋ค. ํ
๋ํธ๋ฅผ ๋์ด ์ฝ๋ ๊ณ๊ธฐํ๋ง OPS_GATE ๋ฅผ ์ด๋ค. */\n @Query(returns => ScalarObject, {\n nullable: true,\n description:\n 'List twin command audit records (who approved what, and what the kernel answered) with the standard list contract, plus the total match count.'\n })\n async twinAuditList(\n /* ํ์ค ๋ชฉ๋ก ๊ณ์ฝ์ `@Args` ๋ก ํผ์ณ ๋ฐ๋๋ค โ `@Arg` ๋ก ๋ฐ์ผ๋ฉด type-graphql ์ด ์
๋ ฅ ํ์
์\n ๊ฒฐ์ ํ์ง ๋ชปํด **์คํค๋ง ์กฐ๋ฆฝ ์์ฒด๊ฐ ์คํจ**ํ๋ค(์๋ฒ๊ฐ ์์ ์ ๋ฌ๋ค). */\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain?.id\n if (!domainId) return { items: [], total: 0 }\n\n const effective: ListParam = {\n ...(params ?? ({} as ListParam)),\n /* ๊ธฐ๋ณธ ์ ๋ ฌ โ ์ต๊ทผ ๊ฒ๋ถํฐ. ๊ฐ์ฌ๋ \"์์ฆ\" ์์ ์์ํ๋ค. */\n sortings: params?.sortings?.length ? params.sortings : [{ name: 'eventTime', desc: true }],\n /* ์๊ฐ ํํฐ๋ ๋ ์ง๋ก ์ฎ๊ฒจ์ ๋๊ธด๋ค โ ๋ฌธ์์ด ๊ทธ๋๋ก๋ฉด ์กฐ์ฉํ 0๊ฑด์ด ๋๋ค(์ ๋๊ณผ ๊ฐ์ ์ด์ ). */\n filters: (params?.filters ?? []).map(f => (f.name === 'eventTime' ? { ...f, value: toDateValue(f.value) } : f))\n }\n\n const qb = getQueryBuilderFromListParams({\n repository: getRepository(TwinAuditEvent),\n params: effective,\n domain: context.state.domain,\n alias: 'a',\n /*\n * `searchables` ๋ ์ ๋ถ **์ค์ปฌ๋ผ**์ด๋ค โ ํ๋ ์์ํฌ ์ง์ ๋น๋๋ ์ฌ๊ธฐ ์๋ ์ปฌ๋ผ์ LIKE ๋ฅผ\n * ๊ฒฝ๊ณ ํ ๋ฌด์ํ๋ค(์ธ๋ฑ์ค ์๋ ์ ์ฒด ์ค์บ ๋ฐฉ์ง). ํ์์๋ก ์ฐพ๋ ๊ฒ์ด ์ด ํ
์ด๋ธ์ ๊ตฌ๋ถํ ์ด์ ๋ค.\n */\n searchables: ['actorEmail', 'actorName', 'commandType', 'origin', 'errorCode', 'reason'],\n sortables: ['eventTime', 'commandType', 'actorEmail', 'origin', 'accepted'],\n /* ๊ฐ์ฌ ๋ชฉ๋ก์ ์ฌ๋์ด ์ฝ๋ ์๋๋ก ๋ณธ๋ค โ ํฌ๊ฒ ํผ ์ค๋ ๊ฒ์ด ์ด๋์ด ์๋๋ค. */\n defaultLimit: 50,\n maxLimit: 200\n })\n\n const [items, total] = await qb.getManyAndCount()\n return { items, total }\n }\n}\n"]}
|
|
@@ -3,6 +3,8 @@ export declare class TwinControlMutation {
|
|
|
3
3
|
dispatchTwinCommand(instanceId: string, command: any, context: ResolverContext): Promise<{
|
|
4
4
|
accepted: boolean;
|
|
5
5
|
error?: string;
|
|
6
|
+
errorCode?: string;
|
|
7
|
+
errorParams?: Record<string, string | number>;
|
|
6
8
|
}>;
|
|
7
9
|
/** Scenario ์ฑ๋ โ ์์ฑ๊ธฐ ์๋๋ฆฌ์ค ์ ์ด(load/start/pause/setSpeed). */
|
|
8
10
|
controlTwinScenario(instanceId: string, action: string, context: ResolverContext, scenario?: any): Promise<boolean>;
|
|
@@ -3,8 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.TwinControlMutation = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const type_graphql_1 = require("type-graphql");
|
|
6
|
+
const twin_kernel_1 = require("@operato/twin-kernel");
|
|
6
7
|
const shell_1 = require("@things-factory/shell");
|
|
8
|
+
const shell_2 = require("@things-factory/shell");
|
|
7
9
|
const index_js_1 = require("../../engine/index.js");
|
|
10
|
+
const twin_audit_event_js_1 = require("../twin-audit/twin-audit-event.js");
|
|
11
|
+
const command_audit_js_1 = require("../twin-audit/command-audit.js");
|
|
8
12
|
/*
|
|
9
13
|
* ํธ์ CommandยทScenario ์ฑ๋ โ ์ํฅ mutation.
|
|
10
14
|
* Command: runtime.dispatch(ํ์). Scenario: runtime.scenario.load/start/pause/setSpeed(์์ธก ์๊ทน).
|
|
@@ -17,31 +21,64 @@ let TwinControlMutation = class TwinControlMutation {
|
|
|
17
21
|
/** Command ์ฑ๋ โ ์ค๋ hold/resume/release ๋ฑ. ์ปค๋ dispatch ๋ก ์์, ack{accepted,error} ๋ฐํ. */
|
|
18
22
|
async dispatchTwinCommand(instanceId, command, context) {
|
|
19
23
|
const domainId = context.state.domain?.id;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
if (!domainId)
|
|
25
|
+
return { accepted: false, error: 'no-domain', errorCode: 'no-domain' };
|
|
26
|
+
/*
|
|
27
|
+
* ๋ผ์ฐํ
์ ์์ง์ด ํ๋ค โ ์์ ์๋ ์ฌ๊ธฐ์ `inst.runtime.dispatch` ๋ฅผ ๊ณง๋ฐ๋ก ๋ถ๋ ๊ณ , `runtime` ์ด
|
|
28
|
+
* ์๋ฎฌ์๋ง ์์ด์ ๋ฏธ๋ฌ ํธ์์์๋ ์ด ํ ์ค์ด TypeError ๋ก ํฐ์ก๋ค(๊น๋ํ ๊ฑฐ์ ์ด ์๋๋ผ ์คํจ).
|
|
29
|
+
* ๊ถ์(๋ชจ๋) ร ์ฑ๊ฒฉ(์ฃผ์/์ก์ถ์์ด์
) ํ์ ์ ํ ๊ณณ์๋ง ๋๋ค.
|
|
30
|
+
*/
|
|
31
|
+
/* ์๋ณธ์ ๊ทธ๋๋ก ๊ฐ์ฌ์ ๋๊ธด๋ค โ ๋ฌด์์ด ๋ค์ด์๋์ง๊ฐ ๊ธฐ๋ก์ ๋์์ด๋ค(์ ๊ทํ๋ ๊ฐ์ฌ ๋ชจ๋์ด ํ๋ค). */
|
|
32
|
+
const cmdWithOrigin = command;
|
|
33
|
+
const ack = await index_js_1.TwinEngine.dispatchCommand(domainId, instanceId, command);
|
|
34
|
+
/* ๋ผ์ด๋ธ ๊ตฌ์กฐ ๋ณ์ด(resource.add)๋ ์ ์ฅ model ์๋ ๋ฐ์ โ ํ๋ก๋น์ ๋ ํธ์ง๊ธฐยท์ฌ๊ธฐ๋์ด ์ถ๊ฐ๋ถ์ ์์ง ์๊ฒ. */
|
|
27
35
|
if (ack?.accepted && command?.type === 'resource.add') {
|
|
28
36
|
await index_js_1.TwinEngine.syncBoardEquipment(domainId, instanceId).catch(err => console.error('twin syncBoardEquipment fail', err));
|
|
29
37
|
}
|
|
30
|
-
|
|
38
|
+
/*
|
|
39
|
+
* ๊ฐ์ฌ ๊ธฐ๋ก โ ์น์ธ ๊ฒ์ดํธ๊ฐ ์์ ๋ง๊ณ , ์ด ์ค์ด ๋ค๋ฅผ ์ค๋ช
ํ๋ค. ๋ ๋ค ์์ด์ผ "์ฌ๋ ์์ ๊ฑฐ์ณค๋ค" ๋ฅผ
|
|
40
|
+
* ์ฆ๋ช
ํ ์ ์๋ค. ์ปค๋์ด ๊ฑฐ์ ํ ๊ฒ๋ ๋จ๊ธด๋ค โ ๋ฌด์์ ์๋ํ๋์ง๊ฐ ๊ฐ์ฌ์ ์ ๋ฐ์ด๋ค.
|
|
41
|
+
*
|
|
42
|
+
* ๊ธฐ๋ก์ด ์คํจํด๋ ์ปค๋งจ๋ ๊ฒฐ๊ณผ๋ ๊ทธ๋๋ก ๋๋ ค์ค๋ค. ๊ฐ์ฌ๊ฐ ๋ณธ์
์ ๋ง์ผ๋ฉด ์ ๋์ง๋ง, ์คํจ๋ฅผ ์ผํค์ง๋
|
|
43
|
+
* ์๋๋ค(๋ก๊ทธ์ ๋จ๊ธด๋ค) โ ์กฐ์ฉํ ์ ๋จ์ผ๋ฉด ๋์ค์ "๊ธฐ๋ก์ด ์๋ค" ์ "์ผ์ด ์์๋ค" ๋ฅผ ๊ตฌ๋ถ ๋ชป ํ๋ค.
|
|
44
|
+
*/
|
|
45
|
+
try {
|
|
46
|
+
const audit = (0, command_audit_js_1.buildCommandAudit)({ command: cmdWithOrigin, ack, actor: context.state.user, at: new Date() });
|
|
47
|
+
const repo = (0, shell_2.getRepository)(twin_audit_event_js_1.TwinAuditEvent);
|
|
48
|
+
await repo.save(repo.create({ domain: context.state.domain, instanceId, ...audit }));
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
console.error(`[twin-control] command audit not recorded for "${instanceId}"`, err);
|
|
52
|
+
}
|
|
53
|
+
/* ๊ฑฐ์ ์ฌ์ ๋ **์ธ์ด ์ค๋ฆฝ ์ฝ๋**๋ก ํจ๊ป ๋๋ ค์ค๋ค โ ํ๋ฉด์ด `twin.cmderr.<code>` ๋ก ์ฌ๋ ๋ง์ ๋ง๋ ๋ค. */
|
|
54
|
+
return { accepted: !!ack?.accepted, error: ack?.error, errorCode: ack?.errorCode, errorParams: ack?.errorParams };
|
|
31
55
|
}
|
|
32
56
|
/** Scenario ์ฑ๋ โ ์์ฑ๊ธฐ ์๋๋ฆฌ์ค ์ ์ด(load/start/pause/setSpeed). */
|
|
33
57
|
async controlTwinScenario(instanceId, action, context, scenario) {
|
|
34
58
|
const domainId = context.state.domain?.id;
|
|
35
|
-
|
|
36
|
-
if (!
|
|
59
|
+
/* ํ
๋ํธ ๊ฒฉ๋ฆฌ โ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ง์ ์์ธํ์ง ์๋๋ค(ํค์ ๋๋ฉ์ธ์ด ๋ค์ด ์๋ค). */
|
|
60
|
+
if (!index_js_1.TwinEngine.owns(domainId, instanceId))
|
|
37
61
|
return false;
|
|
38
|
-
const runtime =
|
|
62
|
+
const runtime = index_js_1.TwinEngine.runtime(domainId, instanceId);
|
|
39
63
|
/*
|
|
40
64
|
* ์๊ทน ์ฃผ์
๊ฐ๋ โ mirror ํธ์(์ธ๋ถ ์ค๋ฌผ์ด ์ง์ค)์ ์ปค๋ ์๋๋ฆฌ์ค ์์ง์ด ์๋ค(startLive=projector, runtime ์์).
|
|
41
65
|
* what-if ๋ฅผ ์ฌ๊ธฐ์ ์ฃผ์
ํ๋ฉด ํ์ค์ ์ค์ผ์ํค๋ฏ๋ก ๊ฑฐ๋ถํ๋ค(sim-experiment/sim-world ๋ง ์๊ทน ๊ฐ๋ฅ). silent throw ๋ฐฉ์ง.
|
|
42
66
|
*/
|
|
43
67
|
if (!runtime?.scenario)
|
|
44
68
|
return false;
|
|
69
|
+
/*
|
|
70
|
+
* **์๋ชป๋ ์ ์ธ์ ๋ฌธ ์์์ ๋ง๋๋ค.** ์์ ์๋ ๊ฒ์ฆ ์์ด ์ค์๊ณ , ๋ค์ tick ์์ `rate.meanPerHour`
|
|
71
|
+
* ๋ฅผ ์ฝ๋ค ํฐ์ ธ **์๋ฒ ํ๋ก์ธ์ค๊ฐ ๋ด๋ ค๊ฐ๋ค**(ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ๊ฐ ํ๋๋ก ์ฑ ์ ์ฒด๊ฐ ์ฃฝ์๋ค).
|
|
72
|
+
* ๊ท์น์ ์ปค๋์ด ๋ค๊ณ ์๋ค(๊ณ์ฝ์ ์ฃผ์ธ) โ ํธ์คํธ๊ฐ ๋ฐ๋ก ๋ง๋ค๋ฉด ๋ฐฉ์ธ์ด ์๊ธด๋ค.
|
|
73
|
+
*/
|
|
74
|
+
if (action === 'load') {
|
|
75
|
+
const v = (0, twin_kernel_1.validateScenario)(scenario);
|
|
76
|
+
if (v.ok === false) {
|
|
77
|
+
/* ์ฌ์ ๋ฅผ ๋ก๊ทธ๋ก ๋จ๊ธด๋ค โ ์ด ๋ฎคํ
์ด์
์ ๋ฐํ์ Boolean ๊ณ์ฝ์ด๋ผ ์ฌ์ ๋ฅผ ์ค์ด ๋ณด๋ผ ์๋ฆฌ๊ฐ ์๋ค. */
|
|
78
|
+
console.warn(`[twin] scenario rejected for "${instanceId}": ${v.errorCode} ${JSON.stringify(v.errorParams ?? {})}`);
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
45
82
|
if (action === 'load' && scenario)
|
|
46
83
|
runtime.scenario.load(scenario);
|
|
47
84
|
else if (action === 'start')
|
|
@@ -57,6 +94,7 @@ let TwinControlMutation = class TwinControlMutation {
|
|
|
57
94
|
};
|
|
58
95
|
exports.TwinControlMutation = TwinControlMutation;
|
|
59
96
|
tslib_1.__decorate([
|
|
97
|
+
(0, type_graphql_1.Directive)('@privilege(category: "twin", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
60
98
|
(0, type_graphql_1.Mutation)(returns => shell_1.ScalarObject, { description: 'dispatch a twin command (order.hold/resume/release โฆ). Returns {accepted, error?}.' }),
|
|
61
99
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('instanceId')),
|
|
62
100
|
tslib_1.__param(1, (0, type_graphql_1.Arg)('command', type => shell_1.ScalarObject)),
|
|
@@ -66,6 +104,7 @@ tslib_1.__decorate([
|
|
|
66
104
|
tslib_1.__metadata("design:returntype", Promise)
|
|
67
105
|
], TwinControlMutation.prototype, "dispatchTwinCommand", null);
|
|
68
106
|
tslib_1.__decorate([
|
|
107
|
+
(0, type_graphql_1.Directive)('@privilege(category: "twin", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
69
108
|
(0, type_graphql_1.Mutation)(returns => Boolean, { description: 'control twin scenario (load|start|pause|setSpeed)' }),
|
|
70
109
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('instanceId')),
|
|
71
110
|
tslib_1.__param(1, (0, type_graphql_1.Arg)('action')),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twin-control-mutation.js","sourceRoot":"","sources":["../../../server/service/twin-control/twin-control-mutation.ts"],"names":[],"mappings":";;;;AAAA,+
|
|
1
|
+
{"version":3,"file":"twin-control-mutation.js","sourceRoot":"","sources":["../../../server/service/twin-control/twin-control-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Mutation, Resolver, Directive} from 'type-graphql'\n\nimport { validateScenario } from '@operato/twin-kernel'\n\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { TwinEngine } from '../../engine/index.js'\nimport { TwinAuditEvent } from '../twin-audit/twin-audit-event.js'\nimport { buildCommandAudit } from '../twin-audit/command-audit.js'\n\n/*\n * ํธ์ CommandยทScenario ์ฑ๋ โ ์ํฅ mutation.\n * Command: runtime.dispatch(ํ์). Scenario: runtime.scenario.load/start/pause/setSpeed(์์ธก ์๊ทน).\n * (State ํํฅ์ twin-state subscription. tick ์ ์์ปค.)\n *\n * ์ธ๊ฐ: data ๊ตฌ๋
๋ฆฌ์กธ๋ฒ์ ๋์นญ์ผ๋ก, ๋์ ์ธ์คํด์ค๊ฐ **ํธ์ถ์ ๋๋ฉ์ธ ์์**์ธ์ง ๊ฒ์ฆํ๋ค(cross-tenant ์ปค๋งจ๋ ์ฃผ์
์ฐจ๋จ).\n * command ์ฑ๋์ sim ์ํ๋ฅผ ๋ณ์ดํ๋ฏ๋ก ๋๋ฉ์ธ ์ค์ฝํ๊ฐ ํ์.\n */\n@Resolver()\nexport class TwinControlMutation {\n /** Command ์ฑ๋ โ ์ค๋ hold/resume/release ๋ฑ. ์ปค๋ dispatch ๋ก ์์, ack{accepted,error} ๋ฐํ. */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, { description: 'dispatch a twin command (order.hold/resume/release โฆ). Returns {accepted, error?}.' })\n async dispatchTwinCommand(\n @Arg('instanceId') instanceId: string,\n @Arg('command', type => ScalarObject) command: any,\n @Ctx() context: ResolverContext\n ): Promise<{ accepted: boolean; error?: string; errorCode?: string; errorParams?: Record<string, string | number> }> {\n const domainId = context.state.domain?.id\n if (!domainId) return { accepted: false, error: 'no-domain', errorCode: 'no-domain' }\n /*\n * ๋ผ์ฐํ
์ ์์ง์ด ํ๋ค โ ์์ ์๋ ์ฌ๊ธฐ์ `inst.runtime.dispatch` ๋ฅผ ๊ณง๋ฐ๋ก ๋ถ๋ ๊ณ , `runtime` ์ด\n * ์๋ฎฌ์๋ง ์์ด์ ๋ฏธ๋ฌ ํธ์์์๋ ์ด ํ ์ค์ด TypeError ๋ก ํฐ์ก๋ค(๊น๋ํ ๊ฑฐ์ ์ด ์๋๋ผ ์คํจ).\n * ๊ถ์(๋ชจ๋) ร ์ฑ๊ฒฉ(์ฃผ์/์ก์ถ์์ด์
) ํ์ ์ ํ ๊ณณ์๋ง ๋๋ค.\n */\n /* ์๋ณธ์ ๊ทธ๋๋ก ๊ฐ์ฌ์ ๋๊ธด๋ค โ ๋ฌด์์ด ๋ค์ด์๋์ง๊ฐ ๊ธฐ๋ก์ ๋์์ด๋ค(์ ๊ทํ๋ ๊ฐ์ฌ ๋ชจ๋์ด ํ๋ค). */\n const cmdWithOrigin = command\n const ack = await TwinEngine.dispatchCommand(domainId, instanceId, command)\n /* ๋ผ์ด๋ธ ๊ตฌ์กฐ ๋ณ์ด(resource.add)๋ ์ ์ฅ model ์๋ ๋ฐ์ โ ํ๋ก๋น์ ๋ ํธ์ง๊ธฐยท์ฌ๊ธฐ๋์ด ์ถ๊ฐ๋ถ์ ์์ง ์๊ฒ. */\n if (ack?.accepted && command?.type === 'resource.add') {\n await TwinEngine.syncBoardEquipment(domainId, instanceId).catch(err => console.error('twin syncBoardEquipment fail', err))\n }\n /*\n * ๊ฐ์ฌ ๊ธฐ๋ก โ ์น์ธ ๊ฒ์ดํธ๊ฐ ์์ ๋ง๊ณ , ์ด ์ค์ด ๋ค๋ฅผ ์ค๋ช
ํ๋ค. ๋ ๋ค ์์ด์ผ \"์ฌ๋ ์์ ๊ฑฐ์ณค๋ค\" ๋ฅผ\n * ์ฆ๋ช
ํ ์ ์๋ค. ์ปค๋์ด ๊ฑฐ์ ํ ๊ฒ๋ ๋จ๊ธด๋ค โ ๋ฌด์์ ์๋ํ๋์ง๊ฐ ๊ฐ์ฌ์ ์ ๋ฐ์ด๋ค.\n *\n * ๊ธฐ๋ก์ด ์คํจํด๋ ์ปค๋งจ๋ ๊ฒฐ๊ณผ๋ ๊ทธ๋๋ก ๋๋ ค์ค๋ค. ๊ฐ์ฌ๊ฐ ๋ณธ์
์ ๋ง์ผ๋ฉด ์ ๋์ง๋ง, ์คํจ๋ฅผ ์ผํค์ง๋\n * ์๋๋ค(๋ก๊ทธ์ ๋จ๊ธด๋ค) โ ์กฐ์ฉํ ์ ๋จ์ผ๋ฉด ๋์ค์ \"๊ธฐ๋ก์ด ์๋ค\" ์ \"์ผ์ด ์์๋ค\" ๋ฅผ ๊ตฌ๋ถ ๋ชป ํ๋ค.\n */\n try {\n const audit = buildCommandAudit({ command: cmdWithOrigin, ack, actor: context.state.user, at: new Date() })\n const repo = getRepository(TwinAuditEvent)\n await repo.save(repo.create({ domain: context.state.domain, instanceId, ...audit }))\n } catch (err) {\n console.error(`[twin-control] command audit not recorded for \"${instanceId}\"`, err)\n }\n\n /* ๊ฑฐ์ ์ฌ์ ๋ **์ธ์ด ์ค๋ฆฝ ์ฝ๋**๋ก ํจ๊ป ๋๋ ค์ค๋ค โ ํ๋ฉด์ด `twin.cmderr.<code>` ๋ก ์ฌ๋ ๋ง์ ๋ง๋ ๋ค. */\n return { accepted: !!ack?.accepted, error: ack?.error, errorCode: ack?.errorCode, errorParams: ack?.errorParams }\n }\n\n /** Scenario ์ฑ๋ โ ์์ฑ๊ธฐ ์๋๋ฆฌ์ค ์ ์ด(load/start/pause/setSpeed). */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'control twin scenario (load|start|pause|setSpeed)' })\n async controlTwinScenario(\n @Arg('instanceId') instanceId: string,\n @Arg('action') action: string,\n @Ctx() context: ResolverContext,\n @Arg('scenario', type => ScalarObject, { nullable: true }) scenario?: any\n ): Promise<boolean> {\n const domainId = context.state.domain?.id\n /* ํ
๋ํธ ๊ฒฉ๋ฆฌ โ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ง์ ์์ธํ์ง ์๋๋ค(ํค์ ๋๋ฉ์ธ์ด ๋ค์ด ์๋ค). */\n if (!TwinEngine.owns(domainId, instanceId)) return false\n const runtime = TwinEngine.runtime(domainId, instanceId)\n /*\n * ์๊ทน ์ฃผ์
๊ฐ๋ โ mirror ํธ์(์ธ๋ถ ์ค๋ฌผ์ด ์ง์ค)์ ์ปค๋ ์๋๋ฆฌ์ค ์์ง์ด ์๋ค(startLive=projector, runtime ์์).\n * what-if ๋ฅผ ์ฌ๊ธฐ์ ์ฃผ์
ํ๋ฉด ํ์ค์ ์ค์ผ์ํค๋ฏ๋ก ๊ฑฐ๋ถํ๋ค(sim-experiment/sim-world ๋ง ์๊ทน ๊ฐ๋ฅ). silent throw ๋ฐฉ์ง.\n */\n if (!runtime?.scenario) return false\n /*\n * **์๋ชป๋ ์ ์ธ์ ๋ฌธ ์์์ ๋ง๋๋ค.** ์์ ์๋ ๊ฒ์ฆ ์์ด ์ค์๊ณ , ๋ค์ tick ์์ `rate.meanPerHour`\n * ๋ฅผ ์ฝ๋ค ํฐ์ ธ **์๋ฒ ํ๋ก์ธ์ค๊ฐ ๋ด๋ ค๊ฐ๋ค**(ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ๊ฐ ํ๋๋ก ์ฑ ์ ์ฒด๊ฐ ์ฃฝ์๋ค).\n * ๊ท์น์ ์ปค๋์ด ๋ค๊ณ ์๋ค(๊ณ์ฝ์ ์ฃผ์ธ) โ ํธ์คํธ๊ฐ ๋ฐ๋ก ๋ง๋ค๋ฉด ๋ฐฉ์ธ์ด ์๊ธด๋ค.\n */\n if (action === 'load') {\n const v = validateScenario(scenario)\n if (v.ok === false) {\n /* ์ฌ์ ๋ฅผ ๋ก๊ทธ๋ก ๋จ๊ธด๋ค โ ์ด ๋ฎคํ
์ด์
์ ๋ฐํ์ Boolean ๊ณ์ฝ์ด๋ผ ์ฌ์ ๋ฅผ ์ค์ด ๋ณด๋ผ ์๋ฆฌ๊ฐ ์๋ค. */\n console.warn(`[twin] scenario rejected for \"${instanceId}\": ${v.errorCode} ${JSON.stringify(v.errorParams ?? {})}`)\n return false\n }\n }\n if (action === 'load' && scenario) runtime.scenario.load(scenario)\n else if (action === 'start') runtime.scenario.start()\n else if (action === 'pause') runtime.scenario.pause()\n else if (action === 'setSpeed' && scenario?.speed != null) runtime.scenario.setSpeed(Number(scenario.speed))\n else return false\n return true\n }\n}\n"]}
|
|
@@ -28,7 +28,7 @@ export declare function locationOf(envelope: any): string | undefined;
|
|
|
28
28
|
* ์ค๋นยท๋ฌด๋ฒ โ ์ด์ ๋ธํ(equipment.statusยทtask.status)๊ฐ ๋์์ ๊ฐ๋ฆฌํค๋ ์ถ.
|
|
29
29
|
*
|
|
30
30
|
* EPCIS ์ดํ๊ฐ ์๋๋ผ์ ๋ค๋ฅธ ์ถ ์ด๋์๋ ์ ์กํ๋ค. ์ด๊ฒ ์์ผ๋ฉด "์ด ์ง๊ฒ์ฐจ๊ฐ ์ค๋ ๋ฌด์์ ํ๋" ๋ฅผ
|
|
31
|
-
* ์๋ฒ์์ ๋ฌผ์ ๋ฐฉ๋ฒ์ด ์์ด, ํ๋ฉด์ด ์ ๋์ ํต์งธ๋ก ๋ฐ์
|
|
31
|
+
* ์๋ฒ์์ ๋ฌผ์ ๋ฐฉ๋ฒ์ด ์์ด, ํ๋ฉด์ด ์ ๋์ ํต์งธ๋ก ๋ฐ์ ์ ์ ์กฐํํ๋ ์๋ฐ์ ์๋ค.
|
|
32
32
|
*/
|
|
33
33
|
export declare function equipmentIdOf(envelope: any): string | undefined;
|
|
34
34
|
/** ํ ์ด๋ฒคํธ์์ ์น๊ฒฉ ํค ์ ๋ถ โ ๊ธฐ๋ก ๊ฒฝ๋ก๊ฐ ์ด ํจ์ ํ๋๋ง ๋ถ๋ฅธ๋ค. */
|
|
@@ -76,7 +76,7 @@ function locationOf(envelope) {
|
|
|
76
76
|
* ์ค๋นยท๋ฌด๋ฒ โ ์ด์ ๋ธํ(equipment.statusยทtask.status)๊ฐ ๋์์ ๊ฐ๋ฆฌํค๋ ์ถ.
|
|
77
77
|
*
|
|
78
78
|
* EPCIS ์ดํ๊ฐ ์๋๋ผ์ ๋ค๋ฅธ ์ถ ์ด๋์๋ ์ ์กํ๋ค. ์ด๊ฒ ์์ผ๋ฉด "์ด ์ง๊ฒ์ฐจ๊ฐ ์ค๋ ๋ฌด์์ ํ๋" ๋ฅผ
|
|
79
|
-
* ์๋ฒ์์ ๋ฌผ์ ๋ฐฉ๋ฒ์ด ์์ด, ํ๋ฉด์ด ์ ๋์ ํต์งธ๋ก ๋ฐ์
|
|
79
|
+
* ์๋ฒ์์ ๋ฌผ์ ๋ฐฉ๋ฒ์ด ์์ด, ํ๋ฉด์ด ์ ๋์ ํต์งธ๋ก ๋ฐ์ ์ ์ ์กฐํํ๋ ์๋ฐ์ ์๋ค.
|
|
80
80
|
*/
|
|
81
81
|
function equipmentIdOf(envelope) {
|
|
82
82
|
const d = envelope?.data ?? envelope ?? {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twin-event-keys.js","sourceRoot":"","sources":["../../../server/service/twin-event/twin-event-keys.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ์ ๋ ๊ฒ์ ํค ์ถ์ถ โ **์์**. ์ธ์ ์คํธ๊ฐ ๊ธฐ๋กํ ๋ ํ ๋ฒ ๋ฝ์ ์ธ๋ฑ์ค ๊ฐ๋ฅํ ์ค์ปฌ๋ผ์ผ๋ก ์น๊ฒฉํ๋ค.\n *\n * โโ ์ ์น๊ฒฉํ๋๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฌ์ฉ์๊ฐ ์ ๋์์ ์ค์ ๋ก ์ฐพ๋ ๊ฒ์ \"์ด ํ๋ ํธ์ ์ด๋ ฅ\", \"์ด ์ค๋๊ฐ ์ด๋๊น์ง ๊ฐ๋\", \"์ด ๋ํฌ์์\n * ๋ฌด์จ ์ผ์ด ์์๋\" ๋ค. ๊ทธ๋ฐ๋ฐ ๊ทธ ๊ฐ๋ค์ ์ ๋ถ `payload`(simple-json = TEXT) **์**์ ์์๋ค.\n * things-factory ๋ 5๊ฐ DB ๋๋ผ์ด๋ฒ๋ฅผ ์ง์ํด์ผ ํด์ DB๋ณ JSON ์ฐ์ฐ์๋ฅผ ์ธ ์ ์๋ค โ\n * ์ฆ ์น๊ฒฉ ์์ด๋ **์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก๋ ์๋ฒ์์ ๊ทธ ์กฐ๊ฑด์ผ๋ก ๊ฑฐ๋ฅผ ์ ์์๋ค**. ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์์จ\n * ๋ช ์ฒ ๊ฑด ์์์๋ง ์ฐพ๋ ์๋์ด ์ต์ ์ด์๊ณ , ์ ๋์ด ์ปค์ง์๋ก ๊ทธ ์๋์ ๊ฑฐ์ง๋ง์ ๊ฐ๊น์์ง๋ค.\n *\n * ๊ทธ๋์ ๊ฒ์ ์ถ์ด ๋๋ ๊ฐ๋ง ๊ณจ๋ผ ์ปฌ๋ผ์ผ๋ก ๊บผ๋ธ๋ค. payload ๋ ๊ทธ๋๋ก ๋๋ค(์ ๋ณธ์ ์ฌ์ ํ payload โ\n * ์ด๊ฑด ํ์ ์์ธ์ด์ง ์๋ก์ด ์ง์ค์ด ์๋๋ค).\n *\n * โโ ์ ์ฌ๊ธฐ(์์ ๋ชจ๋)์ธ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๊ธฐ๋ก ๊ฒฝ๋ก๊ฐ ๋์ด๋ค(`persistBatch` ๋ผ์ด๋ธ ๋ฒํฌ ยท `persist` ์ฌ ๋จ๊ฑด). ๋ ๊ณณ์ ๊ฐ์ ์ ์ผ๋ฉด\n * ๋ฐ๋์ ์ด๊ธ๋๊ณ , ์ด๊ธ๋ ์์ธ์ \"์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ด๋ฒคํธ\" ๋ฅผ ๋ง๋ ๋ค โ ์ ๋์์ ๊ฐ์ฅ ๋์ ๊ฒฐํจ์ด๋ค.\n */\n\n/** ์น๊ฒฉ๋ ๊ฒ์ ํค โ ์ ๋ถ ์ ํ์ . ๋ฝํ์ง ์์ผ๋ฉด **๋น ๋ฌธ์์ด์ด ์๋๋ผ undefined**(๊ฒฐ์ธกโ ๋น๊ฐ). */\nexport interface TwinEventKeys {\n bizStep?: string\n epc?: string\n orderId?: string\n locationId?: string\n moverId?: string\n}\n\n/*\n * ์ปฌ๋ผ ๊ธธ์ด ์ํ. GS1 ์๋ณ์(EPC URNยทGDTIยทSGLN)๋ ๊ท๊ฒฉ์ ์ด๋ณด๋ค ํจ์ฌ ์งง๋ค.\n * ๋์น๋ ๊ฐ์ด ์ค๋ฉด **์กฐ์ฉํ ์๋ฅด์ง ์๊ณ ** ๊ฒฝ๊ณ ๋ฅผ ๋จ๊ธด๋ค โ ์์ธ์ด ์๋ณธ๊ณผ ๋ค๋ฅด๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๊ฑฐ์ง์ด ๋๋๋ฐ,\n * ๊ทธ ์ฌ์ค์ด ์ด๋์๋ ์ ๋จ์ผ๋ฉด ์๋ฌด๋ ๋ชจ๋ฅธ๋ค.\n */\nconst MAX_KEY = 255\n\nfunction clip(v: unknown, field: string): string | undefined {\n if (v === undefined || v === null) return undefined\n const s = String(v)\n if (!s) return undefined\n if (s.length <= MAX_KEY) return s\n console.warn(\n `[twin-event-keys] ${field} exceeds ${MAX_KEY} chars and was clipped for indexing โ ` +\n `search on this value may be incomplete. payload keeps the full value. (${s.slice(0, 60)}โฆ)`\n )\n return s.slice(0, MAX_KEY)\n}\n\n/** CBV bizStep URN ์ ๋๋ง๋. ์์ผ๋ฉด ์ด๋ฒคํธ ํ์
์์ ์ ์ถ(`epcis.` ์ ๋ ์ ๊ฑฐ). */\nexport function bizStepOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n const tail = String(d.bizStep ?? '').split(':').pop()\n return tail || String(envelope?.eventType ?? '').replace('epcis.', '') || undefined\n}\n\n/**\n * ํ๋ชฉ ์๋ณ์ โ **์ ์ฒด ๊ฐ**์ ์ ์ฅํ๋ค(๋๋ง๋๋ง ์ ์ฅํ์ง ์๋๋ค).\n *\n * ํ์์ฉ ์ถ์ฝ์ ํ๋ฉด์ด ํ๊ณ , ์์ธ์ ์๋ณธ์ ๊ฐ๋๋ค. `search` ๋ ๋ถ๋ถ์ผ์น(contains)๋ผ\n * ์ ์ฒด๋ฅผ ์ ์ฅํด ๋๋ฉด ๋๋ง๋(\"402.2\")๋ก๋ URN ์ ์ฒด๋ก๋ ์ฐพํ๋ค. ๋ฐ๋๋ก ๋๋ง๋๋ง ์ ์ฅํ๋ฉด\n * URN ์ผ๋ก ์ฐพ๋ ๊ฒฝ๋ก๊ฐ ์ฌ๋ผ์ง๋ค.\n */\nexport function epcOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return d.epcList?.[0] ?? d.parentID ?? d.quantityList?.[0]?.epcClass ?? undefined\n}\n\n/** ๊ฑฐ๋ ์๋ณ์(PO/SO) โ EPCIS bizTransactionList ์ฐ์ , ์ด์ ๋ธํ๋ `order`. */\nexport function orderOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return d.bizTransactionList?.[0]?.bizTransaction ?? d.order ?? undefined\n}\n\n/**\n * ์์น โ EPCIS ๋ ์ฝ์ ์ง์ (readPoint) ์ฐ์ , ์์ผ๋ฉด ์
๋ฌด ์์น(bizLocation).\n * ์ด์ ๋ธํ(๋ฌด๋ฒ ์ด๋ ๋ฑ)๋ ๊ทธ ๋์ด ์๊ณ ํ๋ฒํ `location` ์ ์ด๋ค โ ๋น ๋จ๋ฆฌ๋ฉด ์ค๋น๊ฐ ์ด๋์\n * ๋ฌด์์ ํ๋์ง๊ฐ ์์น ์ถ์์ ํต์งธ๋ก ์ฌ๋ผ์ง๋ค.\n */\nexport function locationOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return d.readPoint?.id ?? d.bizLocation?.id ?? d.location ?? undefined\n}\n\n/**\n * ์ค๋นยท๋ฌด๋ฒ โ ์ด์ ๋ธํ(equipment.statusยทtask.status)๊ฐ ๋์์ ๊ฐ๋ฆฌํค๋ ์ถ.\n *\n * EPCIS ์ดํ๊ฐ ์๋๋ผ์ ๋ค๋ฅธ ์ถ ์ด๋์๋ ์ ์กํ๋ค. ์ด๊ฒ ์์ผ๋ฉด \"์ด ์ง๊ฒ์ฐจ๊ฐ ์ค๋ ๋ฌด์์ ํ๋\" ๋ฅผ\n * ์๋ฒ์์ ๋ฌผ์ ๋ฐฉ๋ฒ์ด ์์ด, ํ๋ฉด์ด ์ ๋์ ํต์งธ๋ก ๋ฐ์
|
|
1
|
+
{"version":3,"file":"twin-event-keys.js","sourceRoot":"","sources":["../../../server/service/twin-event/twin-event-keys.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ์ ๋ ๊ฒ์ ํค ์ถ์ถ โ **์์**. ์ธ์ ์คํธ๊ฐ ๊ธฐ๋กํ ๋ ํ ๋ฒ ๋ฝ์ ์ธ๋ฑ์ค ๊ฐ๋ฅํ ์ค์ปฌ๋ผ์ผ๋ก ์น๊ฒฉํ๋ค.\n *\n * โโ ์ ์น๊ฒฉํ๋๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฌ์ฉ์๊ฐ ์ ๋์์ ์ค์ ๋ก ์ฐพ๋ ๊ฒ์ \"์ด ํ๋ ํธ์ ์ด๋ ฅ\", \"์ด ์ค๋๊ฐ ์ด๋๊น์ง ๊ฐ๋\", \"์ด ๋ํฌ์์\n * ๋ฌด์จ ์ผ์ด ์์๋\" ๋ค. ๊ทธ๋ฐ๋ฐ ๊ทธ ๊ฐ๋ค์ ์ ๋ถ `payload`(simple-json = TEXT) **์**์ ์์๋ค.\n * things-factory ๋ 5๊ฐ DB ๋๋ผ์ด๋ฒ๋ฅผ ์ง์ํด์ผ ํด์ DB๋ณ JSON ์ฐ์ฐ์๋ฅผ ์ธ ์ ์๋ค โ\n * ์ฆ ์น๊ฒฉ ์์ด๋ **์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก๋ ์๋ฒ์์ ๊ทธ ์กฐ๊ฑด์ผ๋ก ๊ฑฐ๋ฅผ ์ ์์๋ค**. ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์์จ\n * ๋ช ์ฒ ๊ฑด ์์์๋ง ์ฐพ๋ ์๋์ด ์ต์ ์ด์๊ณ , ์ ๋์ด ์ปค์ง์๋ก ๊ทธ ์๋์ ๊ฑฐ์ง๋ง์ ๊ฐ๊น์์ง๋ค.\n *\n * ๊ทธ๋์ ๊ฒ์ ์ถ์ด ๋๋ ๊ฐ๋ง ๊ณจ๋ผ ์ปฌ๋ผ์ผ๋ก ๊บผ๋ธ๋ค. payload ๋ ๊ทธ๋๋ก ๋๋ค(์ ๋ณธ์ ์ฌ์ ํ payload โ\n * ์ด๊ฑด ํ์ ์์ธ์ด์ง ์๋ก์ด ์ง์ค์ด ์๋๋ค).\n *\n * โโ ์ ์ฌ๊ธฐ(์์ ๋ชจ๋)์ธ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๊ธฐ๋ก ๊ฒฝ๋ก๊ฐ ๋์ด๋ค(`persistBatch` ๋ผ์ด๋ธ ๋ฒํฌ ยท `persist` ์ฌ ๋จ๊ฑด). ๋ ๊ณณ์ ๊ฐ์ ์ ์ผ๋ฉด\n * ๋ฐ๋์ ์ด๊ธ๋๊ณ , ์ด๊ธ๋ ์์ธ์ \"์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ด๋ฒคํธ\" ๋ฅผ ๋ง๋ ๋ค โ ์ ๋์์ ๊ฐ์ฅ ๋์ ๊ฒฐํจ์ด๋ค.\n */\n\n/** ์น๊ฒฉ๋ ๊ฒ์ ํค โ ์ ๋ถ ์ ํ์ . ๋ฝํ์ง ์์ผ๋ฉด **๋น ๋ฌธ์์ด์ด ์๋๋ผ undefined**(๊ฒฐ์ธกโ ๋น๊ฐ). */\nexport interface TwinEventKeys {\n bizStep?: string\n epc?: string\n orderId?: string\n locationId?: string\n moverId?: string\n}\n\n/*\n * ์ปฌ๋ผ ๊ธธ์ด ์ํ. GS1 ์๋ณ์(EPC URNยทGDTIยทSGLN)๋ ๊ท๊ฒฉ์ ์ด๋ณด๋ค ํจ์ฌ ์งง๋ค.\n * ๋์น๋ ๊ฐ์ด ์ค๋ฉด **์กฐ์ฉํ ์๋ฅด์ง ์๊ณ ** ๊ฒฝ๊ณ ๋ฅผ ๋จ๊ธด๋ค โ ์์ธ์ด ์๋ณธ๊ณผ ๋ค๋ฅด๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๊ฑฐ์ง์ด ๋๋๋ฐ,\n * ๊ทธ ์ฌ์ค์ด ์ด๋์๋ ์ ๋จ์ผ๋ฉด ์๋ฌด๋ ๋ชจ๋ฅธ๋ค.\n */\nconst MAX_KEY = 255\n\nfunction clip(v: unknown, field: string): string | undefined {\n if (v === undefined || v === null) return undefined\n const s = String(v)\n if (!s) return undefined\n if (s.length <= MAX_KEY) return s\n console.warn(\n `[twin-event-keys] ${field} exceeds ${MAX_KEY} chars and was clipped for indexing โ ` +\n `search on this value may be incomplete. payload keeps the full value. (${s.slice(0, 60)}โฆ)`\n )\n return s.slice(0, MAX_KEY)\n}\n\n/** CBV bizStep URN ์ ๋๋ง๋. ์์ผ๋ฉด ์ด๋ฒคํธ ํ์
์์ ์ ์ถ(`epcis.` ์ ๋ ์ ๊ฑฐ). */\nexport function bizStepOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n const tail = String(d.bizStep ?? '').split(':').pop()\n return tail || String(envelope?.eventType ?? '').replace('epcis.', '') || undefined\n}\n\n/**\n * ํ๋ชฉ ์๋ณ์ โ **์ ์ฒด ๊ฐ**์ ์ ์ฅํ๋ค(๋๋ง๋๋ง ์ ์ฅํ์ง ์๋๋ค).\n *\n * ํ์์ฉ ์ถ์ฝ์ ํ๋ฉด์ด ํ๊ณ , ์์ธ์ ์๋ณธ์ ๊ฐ๋๋ค. `search` ๋ ๋ถ๋ถ์ผ์น(contains)๋ผ\n * ์ ์ฒด๋ฅผ ์ ์ฅํด ๋๋ฉด ๋๋ง๋(\"402.2\")๋ก๋ URN ์ ์ฒด๋ก๋ ์ฐพํ๋ค. ๋ฐ๋๋ก ๋๋ง๋๋ง ์ ์ฅํ๋ฉด\n * URN ์ผ๋ก ์ฐพ๋ ๊ฒฝ๋ก๊ฐ ์ฌ๋ผ์ง๋ค.\n */\nexport function epcOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return d.epcList?.[0] ?? d.parentID ?? d.quantityList?.[0]?.epcClass ?? undefined\n}\n\n/** ๊ฑฐ๋ ์๋ณ์(PO/SO) โ EPCIS bizTransactionList ์ฐ์ , ์ด์ ๋ธํ๋ `order`. */\nexport function orderOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return d.bizTransactionList?.[0]?.bizTransaction ?? d.order ?? undefined\n}\n\n/**\n * ์์น โ EPCIS ๋ ์ฝ์ ์ง์ (readPoint) ์ฐ์ , ์์ผ๋ฉด ์
๋ฌด ์์น(bizLocation).\n * ์ด์ ๋ธํ(๋ฌด๋ฒ ์ด๋ ๋ฑ)๋ ๊ทธ ๋์ด ์๊ณ ํ๋ฒํ `location` ์ ์ด๋ค โ ๋น ๋จ๋ฆฌ๋ฉด ์ค๋น๊ฐ ์ด๋์\n * ๋ฌด์์ ํ๋์ง๊ฐ ์์น ์ถ์์ ํต์งธ๋ก ์ฌ๋ผ์ง๋ค.\n */\nexport function locationOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return d.readPoint?.id ?? d.bizLocation?.id ?? d.location ?? undefined\n}\n\n/**\n * ์ค๋นยท๋ฌด๋ฒ โ ์ด์ ๋ธํ(equipment.statusยทtask.status)๊ฐ ๋์์ ๊ฐ๋ฆฌํค๋ ์ถ.\n *\n * EPCIS ์ดํ๊ฐ ์๋๋ผ์ ๋ค๋ฅธ ์ถ ์ด๋์๋ ์ ์กํ๋ค. ์ด๊ฒ ์์ผ๋ฉด \"์ด ์ง๊ฒ์ฐจ๊ฐ ์ค๋ ๋ฌด์์ ํ๋\" ๋ฅผ\n * ์๋ฒ์์ ๋ฌผ์ ๋ฐฉ๋ฒ์ด ์์ด, ํ๋ฉด์ด ์ ๋์ ํต์งธ๋ก ๋ฐ์ ์ ์ ์กฐํํ๋ ์๋ฐ์ ์๋ค.\n */\nexport function equipmentIdOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return d.moverId ?? undefined\n}\n\n/** ํ ์ด๋ฒคํธ์์ ์น๊ฒฉ ํค ์ ๋ถ โ ๊ธฐ๋ก ๊ฒฝ๋ก๊ฐ ์ด ํจ์ ํ๋๋ง ๋ถ๋ฅธ๋ค. */\nexport function twinEventKeys(envelope: any): TwinEventKeys {\n return {\n bizStep: clip(bizStepOf(envelope), 'bizStep'),\n epc: clip(epcOf(envelope), 'epc'),\n orderId: clip(orderOf(envelope), 'orderId'),\n locationId: clip(locationOf(envelope), 'locationId'),\n moverId: clip(equipmentIdOf(envelope), 'moverId')\n }\n}\n"]}
|
|
@@ -3,22 +3,31 @@ export declare class TwinEvent {
|
|
|
3
3
|
readonly id: string;
|
|
4
4
|
domain?: Domain;
|
|
5
5
|
domainId?: string;
|
|
6
|
-
instanceId
|
|
7
|
-
|
|
8
|
-
eventType?: string;
|
|
6
|
+
instanceId: string;
|
|
7
|
+
eventType: string;
|
|
9
8
|
revision?: number;
|
|
10
9
|
/**
|
|
11
10
|
* ์ด ์ฌ์ค์ด **์ด๋ ๊ณต์ฅ์์** ์ผ์ด๋ฌ๋ โ `TwinStructure.rev`.
|
|
12
11
|
*
|
|
13
12
|
* ์ด๊ฒ์ด ์๋ ์์ ์๋ ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ฉด ์ ๋์ ํต์งธ๋ก ์ง์ฐ๋ ๊ฒ์ด ์ ์ผํ ๊ธธ์ด์๋ค(์ ์ง์ฐ๋ฉด ์
|
|
14
13
|
* ์ด๋ฒคํธ๋ฅผ ์ ๊ณต์ฅ์ ๋๊ณ ์ ์ด ์ด๋ ฅ์ด ๊ฑฐ์ง๋ง์ ํ๋ค). ์ด ํ ์นธ์ด ์
์งธ ๊ธธ์ ์ฐ๋ค โ ์ฌ์์ด
|
|
15
|
-
* ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ ์ง์ ์์
|
|
14
|
+
* ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ ์ง์ ์์ ์ ํํ ๋ค ์ด์ด ์ ๋๋ค.
|
|
16
15
|
*
|
|
17
16
|
* **๋น์ด ์์ ์ ์๋ค**: ์ปฌ๋ผ์ด ์๊ธฐ๊ธฐ ์ ์ ์ฐ์ธ ํ์ด๋ค. ๊ทธ ํ๋ค์ **๊ฐ์ฅ ์ค๋๋ ๋ฆฌ๋น์ **์
|
|
18
17
|
* ์ํ๋ค(0 ์ ์ฑ์ ๋ฃ์ง ์๋๋ค โ 0 ์ "๋ชจ๋ฆ" ์ด ์๋๋ผ ์ ํจํ ๋ฒํธ์ฒ๋ผ ๋ณด์ธ๋ค).
|
|
19
18
|
*/
|
|
20
19
|
structureRev?: number;
|
|
21
|
-
eventTime?:
|
|
20
|
+
eventTime?: Date;
|
|
21
|
+
/**
|
|
22
|
+
* ์ด ์ฌ์ค์ ์ผ์ผํจ **์ง์** โ ์ปค๋์ด ์ปค๋งจ๋์์ ์ด์ด ์ค ์๊ด๊ฐ(๊ธฐ๋ณธ์ commandId).
|
|
23
|
+
*
|
|
24
|
+
* ์ด๊ฒ์ด ๊ฐ์ฌ ๊ธฐ๋ก(TwinAuditEvent.commandId)๊ณผ ์ ๋์ ์๋ ์ ์ผํ ๋ค๋ฆฌ๋ค. ์์ผ๋ฉด ์น์ธ ๊ธฐ๋ก์
|
|
25
|
+
* "์ฌ๋์ด ํ๋ฝํ๋ค" ๊น์ง์ด๊ณ , ๊ทธ ๋ค ๊ณต์ฅ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์์ง์๋์ง์ ์ด์ด์ง์ง ์๋๋ค.
|
|
26
|
+
*
|
|
27
|
+
* **๋๋ถ๋ถ์ ํ์ ๋น์ด ์๋ค** โ ์ปค๋งจ๋๊ฐ ์๋๋ผ ์๋ฎฌ ์๊ฐ์ด ๋ณ์ ์ฌ์ค์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๊ฒ์ด ์ ์์ด๊ณ ,
|
|
28
|
+
* ๋น์ด ์๋ค๊ณ "๋ ์ฑ์์ง ์ ํ" ์ผ๋ก ๋ณด๋ฉด ์ ๋๋ค(๊ฐ์ ์คํด๋ฅผ bizStep ์์ ์ด๋ฏธ ํ ๋ฒ ํ๋ค).
|
|
29
|
+
*/
|
|
30
|
+
correlationId?: string;
|
|
22
31
|
bizStep?: string;
|
|
23
32
|
epc?: string;
|
|
24
33
|
orderId?: string;
|
|
@@ -25,7 +25,7 @@ const shell_1 = require("@things-factory/shell");
|
|
|
25
25
|
*
|
|
26
26
|
* bizStepยทlocationIdยทmoverId ๋ ์ปฌ๋ผ๋ง ๋๊ณ ์ธ๋ฑ์ค๋ ๋์ง ์๋๋ค โ ํ ํธ์ ์์์ ์นด๋๋๋ฆฌํฐ๊ฐ
|
|
27
27
|
* ๋ฎ์(์
๋ฌด๋จ๊ณ ๋ช ๊ฐ, ์์น ์๋ฐฑ, ์ค๋น ์์ญ) (domain,instanceId) ๋ก ์ด๋ฏธ ์ขํ์ง ๋ค์ ์์ฌ ํํฐ๋ก
|
|
28
|
-
* ์ถฉ๋ถํ๊ณ , ๋จ๊ฑฐ์ด ํ์ ์ธ๋ฑ์ค๋ฅผ ๋ ์น์
|
|
28
|
+
* ์ถฉ๋ถํ๊ณ , ๋จ๊ฑฐ์ด ํ์ ์ธ๋ฑ์ค๋ฅผ ๋ ์น์ ๊ฐ์น๊ฐ ์๋ค. ์ ๋ ํ๋๊ฐ ์์ฃผ ์ปค์ ธ์ ์ด ์ถ๋ค์ ์กฐํ๊ฐ
|
|
29
29
|
* ๋๋ ค์ง๋ฉด ๊ทธ๋ ์ธก์ ์ ๊ทผ๊ฑฐ๋ก ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ ์ผ์ด์ง, ์ง๋ ์น์ด ์ฐ๊ธฐ๋ฅผ ๋ฌด๊ฒ๊ฒ ํ ์ผ์ ์๋๋ค.
|
|
30
30
|
*/
|
|
31
31
|
let TwinEvent = class TwinEvent {
|
|
@@ -46,18 +46,13 @@ tslib_1.__decorate([
|
|
|
46
46
|
tslib_1.__metadata("design:type", String)
|
|
47
47
|
], TwinEvent.prototype, "domainId", void 0);
|
|
48
48
|
tslib_1.__decorate([
|
|
49
|
-
(0, typeorm_1.Column)(
|
|
50
|
-
(0, type_graphql_1.Field)({
|
|
49
|
+
(0, typeorm_1.Column)(),
|
|
50
|
+
(0, type_graphql_1.Field)({ description: 'Twin runtime instance id that emitted the event.' }),
|
|
51
51
|
tslib_1.__metadata("design:type", String)
|
|
52
52
|
], TwinEvent.prototype, "instanceId", void 0);
|
|
53
53
|
tslib_1.__decorate([
|
|
54
|
-
(0, typeorm_1.Column)(
|
|
55
|
-
(0, type_graphql_1.Field)({
|
|
56
|
-
tslib_1.__metadata("design:type", String)
|
|
57
|
-
], TwinEvent.prototype, "tenantId", void 0);
|
|
58
|
-
tslib_1.__decorate([
|
|
59
|
-
(0, typeorm_1.Column)({ nullable: true }),
|
|
60
|
-
(0, type_graphql_1.Field)({ nullable: true, description: 'Event type: epcis.* | task.status | equipment.status | order.status.' }),
|
|
54
|
+
(0, typeorm_1.Column)(),
|
|
55
|
+
(0, type_graphql_1.Field)({ description: 'Event type: epcis.* | task.status | equipment.status | order.status.' }),
|
|
61
56
|
tslib_1.__metadata("design:type", String)
|
|
62
57
|
], TwinEvent.prototype, "eventType", void 0);
|
|
63
58
|
tslib_1.__decorate([
|
|
@@ -71,10 +66,44 @@ tslib_1.__decorate([
|
|
|
71
66
|
tslib_1.__metadata("design:type", Number)
|
|
72
67
|
], TwinEvent.prototype, "structureRev", void 0);
|
|
73
68
|
tslib_1.__decorate([
|
|
74
|
-
(0, typeorm_1.Column)({ nullable: true }),
|
|
75
|
-
(0, type_graphql_1.Field)({ nullable: true, description: '
|
|
76
|
-
tslib_1.__metadata("design:type",
|
|
69
|
+
(0, typeorm_1.Column)({ type: 'datetime', nullable: true }),
|
|
70
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Time at which the fact happened on the twin clock.' }),
|
|
71
|
+
tslib_1.__metadata("design:type", Date
|
|
72
|
+
/*
|
|
73
|
+
* โโ ์น๊ฒฉ๋ ๊ฒ์ ์ถ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
74
|
+
* payload ์์ ์๋ ๊ฐ์ ์ธ์ ์คํธ ์์ ์ ๊บผ๋ด ์ค์ปฌ๋ผ์ผ๋ก ๋๋ค(`twin-event-keys.ts` ๊ฐ ๋จ๋
์์ ).
|
|
75
|
+
* payload ๊ฐ ์ฌ์ ํ ์ ๋ณธ์ด๊ณ ์ด๊ฒ๋ค์ **ํ์ ์์ธ**์ด๋ค โ ์๋ก์ด ์ง์ค์ด ์๋๋ผ ์ฐพ์ ์ ์๊ฒ ํ๋ ์ฅ์น.
|
|
76
|
+
* simple-json(TEXT) ์์ ๊ฐ์ 5๊ฐ DB ๋๋ผ์ด๋ฒ ๊ณตํต์ผ๋ก ๊ฑฐ๋ฅผ ๋ฐฉ๋ฒ์ด ์์ด์(๋ฉํฐDB ํธํ ๊ท์น์
|
|
77
|
+
* DB๋ณ JSON ์ฐ์ฐ์ ๊ธ์ง) ์น๊ฒฉ ์ธ์ ์ ํ์ง๊ฐ ์๋ค.
|
|
78
|
+
* ๊ธธ์ด ์ํ 255 ๋ GS1 ์๋ณ์ ๊ท๊ฒฉ ๋๋น ์ถฉ๋ถํ๋ฉฐ, ๋์น๋ ๊ฐ์ ์กฐ์ฉํ ์๋ฆฌ์ง ์๊ณ ๊ฒฝ๊ณ ๋ฅผ ๋จ๊ธด๋ค.
|
|
79
|
+
*
|
|
80
|
+
* โโ ์ถ์ ์๋ก ์ถ๊ฐํ ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
81
|
+
* ์ ์น๊ฒฉ ์ปฌ๋ผ์ ๋ง๋ค๋ฉด **์ด๋ฏธ ์์ธ ํ์ ๋น์ด ์๋ค.** ๊ทธ ํ๋ค์ ์ ์ถ์ผ๋ก ๊ฒ์๋์ง ์๊ณ ,
|
|
82
|
+
* ์ฌ์ฉ์์๊ฒ๋ "๊ณผ๊ฑฐ๊ฐ ์๋ ๊ฒ" ์ผ๋ก ๋ณด์ธ๋ค(์กฐ์ฉํ ๋น ์ง ๋ฐ์ดํฐ).
|
|
83
|
+
*
|
|
84
|
+
* ์์ ์๋ ๊ธฐ๋ ํ
์ด ๋งค๋ฒ ํ
์ด๋ธ์ ์ดํด ์ฑ์ ๋ค. ๊ทธ๊ฑด ๋ ๊ฐ์ง๋ก ํ๋ ธ๋ค โ ์ ๋์ด ์ปค์ง์๋ก ๋ถํ
์ด
|
|
85
|
+
* ๋๋ ค์ง๊ณ , "bizStep ์ด ๋น์์ผ๋ฉด ์ ํ" ์ด๋ผ๋ ์ ์ ๋ฅผ ์ฝ๋์ ๊ณ ์ ํด ๊ทธ ์ ์ ๊ฐ ๊นจ์ง๋ ์๊ฐ
|
|
86
|
+
* (๊ฐ์ฌ ํ์ฒ๋ผ ์
๋ฌด ๋จ๊ณ๊ฐ ์๋ ํ) ๋งค ๋ถํ
๋ง๋ค ํ๋์๋ค. ๊ทธ๋์ ๊ฑท์ด๋๋ค(git: backfill-keys.ts).
|
|
87
|
+
*
|
|
88
|
+
* ์ฑ์ฐ๋ ์ผ์ **๋ง์ด๊ทธ๋ ์ด์
ํ ๋ฒ**์ด ๋ง๋ค(`yarn migration`). ๊ทธ ์ปฌ๋ผ์ ๋ง๋ ๊ฒ์ ๊ทธ๋ ์ด๋ค โ
|
|
89
|
+
* ๋ฒ์ฉ ์ค์บ๋๋ฅผ ๋์ด๋ฆฌ์ง ๋ง ๊ฒ. ๊ฐ๋ฐ ๋ฐ์ดํ๋ผ๋ฉด ๊ทธ๋ฅ ๋ฒ๋ฆฌ๋ ๊ฒ๋ ๋ต์ด๋ค.
|
|
90
|
+
*/
|
|
91
|
+
/**
|
|
92
|
+
* ์ด ์ฌ์ค์ ์ผ์ผํจ **์ง์** โ ์ปค๋์ด ์ปค๋งจ๋์์ ์ด์ด ์ค ์๊ด๊ฐ(๊ธฐ๋ณธ์ commandId).
|
|
93
|
+
*
|
|
94
|
+
* ์ด๊ฒ์ด ๊ฐ์ฌ ๊ธฐ๋ก(TwinAuditEvent.commandId)๊ณผ ์ ๋์ ์๋ ์ ์ผํ ๋ค๋ฆฌ๋ค. ์์ผ๋ฉด ์น์ธ ๊ธฐ๋ก์
|
|
95
|
+
* "์ฌ๋์ด ํ๋ฝํ๋ค" ๊น์ง์ด๊ณ , ๊ทธ ๋ค ๊ณต์ฅ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์์ง์๋์ง์ ์ด์ด์ง์ง ์๋๋ค.
|
|
96
|
+
*
|
|
97
|
+
* **๋๋ถ๋ถ์ ํ์ ๋น์ด ์๋ค** โ ์ปค๋งจ๋๊ฐ ์๋๋ผ ์๋ฎฌ ์๊ฐ์ด ๋ณ์ ์ฌ์ค์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๊ฒ์ด ์ ์์ด๊ณ ,
|
|
98
|
+
* ๋น์ด ์๋ค๊ณ "๋ ์ฑ์์ง ์ ํ" ์ผ๋ก ๋ณด๋ฉด ์ ๋๋ค(๊ฐ์ ์คํด๋ฅผ bizStep ์์ ์ด๋ฏธ ํ ๋ฒ ํ๋ค).
|
|
99
|
+
*/
|
|
100
|
+
)
|
|
77
101
|
], TwinEvent.prototype, "eventTime", void 0);
|
|
102
|
+
tslib_1.__decorate([
|
|
103
|
+
(0, typeorm_1.Column)({ length: 255, nullable: true }),
|
|
104
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Id of the command that caused this fact (kernel correlation id; defaults to the commandId). Empty for facts that simulation time produced rather than a command.' }),
|
|
105
|
+
tslib_1.__metadata("design:type", String)
|
|
106
|
+
], TwinEvent.prototype, "correlationId", void 0);
|
|
78
107
|
tslib_1.__decorate([
|
|
79
108
|
(0, typeorm_1.Column)({ length: 255, nullable: true }),
|
|
80
109
|
(0, type_graphql_1.Field)({ nullable: true, description: 'Business step (CBV bizStep tail), promoted from the payload for indexed filtering.' }),
|
|
@@ -116,7 +145,10 @@ exports.TwinEvent = TwinEvent = tslib_1.__decorate([
|
|
|
116
145
|
(0, typeorm_1.Index)('ix_twin_event_1', (e) => [e.domain, e.instanceId, e.eventTime], { unique: false }),
|
|
117
146
|
(0, typeorm_1.Index)('ix_twin_event_2', (e) => [e.domain, e.instanceId, e.eventType, e.revision], { unique: false }),
|
|
118
147
|
(0, typeorm_1.Index)('ix_twin_event_3', (e) => [e.domain, e.instanceId, e.epc], { unique: false }),
|
|
119
|
-
(0, typeorm_1.Index)('ix_twin_event_4', (e) => [e.domain, e.instanceId, e.orderId], { unique: false })
|
|
148
|
+
(0, typeorm_1.Index)('ix_twin_event_4', (e) => [e.domain, e.instanceId, e.orderId], { unique: false })
|
|
149
|
+
/* ix_5 โ "์ด ์ง์๊ฐ ๋ฌด์์ ์ผ์ผ์ผฐ๋". ๊ฐ์ฌ ๊ธฐ๋ก์ commandId ๋ก ์ ๋์ ๋ค์ ๊ณ์ฐํ๋ ์ถ. */
|
|
150
|
+
,
|
|
151
|
+
(0, typeorm_1.Index)('ix_twin_event_5', (e) => [e.domain, e.correlationId], { unique: false }),
|
|
120
152
|
(0, type_graphql_1.ObjectType)({ description: 'Append-only twin event journal record (EPCIS event or operational delta).' })
|
|
121
153
|
], TwinEvent);
|
|
122
154
|
//# sourceMappingURL=twin-event.js.map
|