@things-factory/integration-base 10.0.0-beta.92 → 10.0.0-y.0
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/connection-manager.d.ts +19 -0
- package/dist-server/engine/connection-manager.js +148 -16
- package/dist-server/engine/connection-manager.js.map +1 -1
- package/dist-server/engine/connector/headless-connector.d.ts +12 -0
- package/dist-server/engine/connector/headless-connector.js +74 -31
- package/dist-server/engine/connector/headless-connector.js.map +1 -1
- package/dist-server/engine/evaluate-template.d.ts +22 -3
- package/dist-server/engine/evaluate-template.js +43 -4
- package/dist-server/engine/evaluate-template.js.map +1 -1
- package/dist-server/engine/task/script.js +25 -17
- package/dist-server/engine/task/script.js.map +1 -1
- package/dist-server/engine/types.d.ts +32 -0
- package/dist-server/engine/types.js.map +1 -1
- package/dist-server/service/connection/connection-mutation.d.ts +3 -0
- package/dist-server/service/connection/connection-subscription.js +4 -4
- package/dist-server/service/connection/connection-subscription.js.map +1 -1
- package/dist-server/service/connection/connection-type.d.ts +4 -1
- package/dist-server/service/connection/connection-type.js +21 -0
- package/dist-server/service/connection/connection-type.js.map +1 -1
- package/dist-server/service/connection/connection.d.ts +80 -2
- package/dist-server/service/connection/connection.js +59 -15
- package/dist-server/service/connection/connection.js.map +1 -1
- package/dist-server/service/domain-attribute/domain-attribute-query.d.ts +17 -0
- package/dist-server/service/domain-attribute/domain-attribute-query.js +76 -0
- package/dist-server/service/domain-attribute/domain-attribute-query.js.map +1 -0
- package/dist-server/service/domain-attribute/domain-attribute-type.d.ts +15 -0
- package/dist-server/service/domain-attribute/domain-attribute-type.js +46 -0
- package/dist-server/service/domain-attribute/domain-attribute-type.js.map +1 -0
- package/dist-server/service/domain-attribute/index.d.ts +3 -0
- package/dist-server/service/domain-attribute/index.js +8 -0
- package/dist-server/service/domain-attribute/index.js.map +1 -0
- package/dist-server/service/index.d.ts +1 -1
- package/dist-server/service/index.js +3 -1
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/scenario/scenario-mutation.js +10 -0
- package/dist-server/service/scenario/scenario-mutation.js.map +1 -1
- package/dist-server/service/scenario/scenario-query.d.ts +3 -3
- package/dist-server/service/scenario/scenario-query.js +9 -9
- package/dist-server/service/scenario/scenario-query.js.map +1 -1
- package/dist-server/service/scenario-instance/scenario-instance-subscription.js +4 -4
- package/dist-server/service/scenario-instance/scenario-instance-subscription.js.map +1 -1
- package/dist-server/service/scenario-instance/scenario-instance-type.js +79 -0
- package/dist-server/service/scenario-instance/scenario-instance-type.js.map +1 -1
- package/dist-server/service/scenario-queue/scenario-queue-subscription.js +2 -2
- package/dist-server/service/scenario-queue/scenario-queue-subscription.js.map +1 -1
- package/dist-server/service/state-register/data-resolver.js +4 -3
- package/dist-server/service/state-register/data-resolver.js.map +1 -1
- package/dist-server/service/step/step-mutation.js +15 -0
- package/dist-server/service/step/step-mutation.js.map +1 -1
- package/dist-server/service/step/step-query.js +11 -2
- package/dist-server/service/step/step-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/domain-inheritance.d.ts +27 -0
- package/dist-server/utils/domain-inheritance.js +67 -0
- package/dist-server/utils/domain-inheritance.js.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-instance-type.js","sourceRoot":"","sources":["../../../server/service/scenario-instance/scenario-instance-type.ts"],"names":[],"mappings":"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","sourcesContent":["import 'winston-daily-rotate-file'\n\nimport orderBy from 'lodash/orderBy'\nimport moment from 'moment-timezone'\nimport { Field, Int, ObjectType, registerEnumType } from 'type-graphql'\nimport util from 'util'\nimport { createLogger, format, transports } from 'winston'\n\nimport { Domain, pubsub, PubSubLogTransport, ScalarObject } from '@things-factory/shell'\nimport { cacheService } from '@things-factory/cache-service'\nimport { User } from '@things-factory/auth-base'\nimport { sleep } from '@things-factory/utils'\n\nimport { publishData } from '../../controllers/publish-data'\nimport { ConnectionManager } from '../../engine/connection-manager'\nimport { TaskRegistry } from '../../engine'\nimport { Context } from '../../engine/types'\nimport { Step } from '../step/step-type'\nimport { handler as edgeHandler } from '../../engine/edge-client'\n\nconst debug = require('debug')('things-factory:integration-base:scenario-instance')\nconst { combine, errors, splat, printf } = format\n\nconst LOGFORMAT = printf(({ level, message, timestamp, stack }) => {\n return `${timestamp} ${level}: ${stack || message}`\n})\n\nfunction getSystemTimeZone() {\n try {\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone\n if (!timeZone) {\n throw new Error('Unable to resolve timeZone')\n }\n return timeZone\n } catch (e) {\n console.warn('Failed to get system timeZone, falling back to UTC.', e)\n return 'UTC'\n }\n}\n\nconst SYSTEM_TZ = getSystemTimeZone()\nconst systemTimestamp = format((info, opts: { tz?: string }) => {\n if (opts.tz) info.timestamp = moment().tz(opts.tz).format()\n return info\n})\n\nexport enum ScenarioInstanceStatus {\n READY = 'READY',\n STARTED = 'STARTED',\n STOPPED = 'STOPPED',\n HALTED = 'HALTED',\n UNLOADED = 'UNLOADED'\n}\n\nregisterEnumType(ScenarioInstanceStatus, {\n name: 'ScenarioInstanceStatus',\n description: 'Enumeration of possible states for a scenario instance.'\n})\n\n@ObjectType({ description: 'Provides progress information for a running scenario instance.' })\nexport class ScenarioInstanceProgress {\n @Field(type => Int, { description: 'The number of rounds the scenario has completed.' })\n rounds: number\n\n @Field(type => Int, { description: 'The completion rate of the scenario as a percentage.' })\n rate: number\n\n @Field(type => Int, { description: 'The total number of steps in the scenario.' })\n steps: number\n\n @Field(type => Int, { description: 'The current step number being executed.' })\n step: number\n}\n\n@ObjectType({ description: 'Represents the complete state of a scenario instance at a point in time.' })\nexport class ScenarioInstanceState {\n @Field({ nullable: true, description: 'The domain in which the instance is running.' })\n public domain: Domain\n\n @Field({ nullable: true, description: 'The unique name of this specific instance.' })\n public instanceName: string\n\n @Field({ nullable: true, description: 'The name of the scenario being executed.' })\n public scenarioName: string\n\n @Field(type => ScenarioInstanceStatus, {\n nullable: true,\n description: 'The current execution state of the instance.'\n })\n public state: ScenarioInstanceStatus\n\n @Field(type => ScalarObject, { nullable: true, description: 'A key-value map of variables used in the instance.' })\n public variables: any\n\n @Field(type => ScalarObject, {\n nullable: true,\n description: 'A key-value map of data generated and used by the instance.'\n })\n public data: any\n\n @Field(type => ScenarioInstanceProgress, { nullable: true, description: 'The progress of the running instance.' })\n public progress: ScenarioInstanceProgress\n\n @Field({ nullable: true, description: 'A message associated with the current state (e.g., an error message).' })\n public message: string\n\n @Field({ nullable: true, description: 'The timestamp when this state was recorded.' })\n public timestamp: Date\n}\n\n@ObjectType({ description: 'Contains the final result of a completed scenario instance run.' })\nexport class ScenarioInstanceRunResult {\n @Field({ nullable: true, description: 'The name of the scenario that was executed.' })\n public scenarioName: string\n\n @Field({ nullable: true, description: 'The unique name of the instance that was run.' })\n public instanceName: string\n\n @Field(type => ScalarObject, { nullable: true, description: 'The final set of variables after the run.' })\n public variables: any\n\n @Field(type => ScalarObject, { nullable: true, description: 'The final set of data after the run.' })\n public data: any\n\n @Field(type => ScalarObject, { nullable: true, description: 'The final result returned by the scenario.' })\n public result: any\n\n @Field({ nullable: true, description: 'The timestamp when the run completed.' })\n public timestamp: Date\n\n @Field({ nullable: true, description: 'A final message from the run (e.g., success or failure reason).' })\n public message: string\n\n @Field({ nullable: true, description: 'The final state of the instance after the run.' })\n public state: ScenarioInstanceStatus\n}\n\n@ObjectType({ description: 'Contains the final result of a completed scenario instance start.' })\nexport class ScenarioInstanceStartResult {\n @Field({ nullable: true, description: 'The timestamp when the instance started.' })\n public timestamp: Date\n\n @Field({ nullable: true, description: 'A final message from the run (e.g., success or failure reason).' })\n public message: string\n\n @Field({ nullable: true, description: 'The final state of the instance after the run.' })\n public state: ScenarioInstanceStatus\n}\n\n@ObjectType({ description: 'Represents a running or completed instance of a scenario.' })\nexport class ScenarioInstance {\n private subScenarioInstances: ScenarioInstance[] = [] // TODO Imple by WeakSet\n\n public context: Context\n\n @Field({ nullable: true, description: 'The domain in which the instance is running.' })\n public domain: Domain\n\n @Field({ nullable: true, description: 'The user who initiated the instance.' })\n public user: User\n\n @Field({ nullable: true, description: 'The name of the scenario being executed.' })\n public scenarioName: string\n\n @Field({ nullable: true, description: 'The unique name for this specific instance of the scenario.' })\n public instanceName: string\n\n @Field({ nullable: true, description: 'The root scenario instance if this is a sub-scenario.' })\n get root(): ScenarioInstance {\n return this.context?.root\n }\n\n @Field({ nullable: true, description: 'The current execution state of the instance.' })\n get state(): ScenarioInstanceStatus {\n return this.context?.state\n }\n\n @Field(type => ScenarioInstanceProgress, { nullable: true, description: 'The current progress of the instance.' })\n get progress(): ScenarioInstanceProgress {\n return this.calcProgress()\n }\n\n @Field(type => ScalarObject, { nullable: true, description: 'A key-value map of variables used in the instance.' })\n get variables(): any {\n return this.context?.variables\n }\n\n @Field(type => ScalarObject, {\n nullable: true,\n description: 'A key-value map of data generated and used by the instance.'\n })\n get data(): any {\n return this.context?.data\n }\n\n @Field(type => ScalarObject, { nullable: true, description: 'The final result of the scenario run.' })\n result: any\n\n @Field({ nullable: true, description: 'The timestamp of the last update.' })\n get timestamp(): Date {\n return new Date()\n }\n\n @Field({ nullable: true, description: 'A message associated with the current state (e.g., an error message).' })\n public message: string\n\n private scenarioId: string\n private scenarioTtl: number\n private steps: Step[]\n private rounds: number = 0\n\n private lastStep: number = -1\n private nextStep: number = -1\n private disposer: any\n public addSubScenarioInstance(instance: ScenarioInstance): ScenarioInstance[] {\n this.subScenarioInstances.push(instance)\n return this.subScenarioInstances\n }\n\n public getSubScenarioInstances(): ScenarioInstance[] {\n return this.subScenarioInstances\n }\n\n public async stopSubScenarios() {\n var subScenarioInstances = this.getSubScenarioInstances()\n\n var subInstance = subScenarioInstances.pop()\n while (subInstance) {\n await subInstance.dispose()\n subInstance = subScenarioInstances.pop()\n }\n }\n\n constructor(\n instanceName,\n {\n id: scenarioId,\n ttl: scenarioTtl,\n name: scenarioName,\n steps,\n domain: scenarioDomain\n }: { id: string; ttl?: number; name: string; steps: Step[]; domain: Domain },\n context?\n ) {\n var { domain, user, lng, unsafeIP, prohibitedPrivileges } = context || {}\n domain ||= scenarioDomain\n\n this.scenarioId = scenarioId\n this.scenarioTtl = scenarioTtl\n this.instanceName = instanceName\n this.scenarioName = scenarioName\n this.steps = orderBy(steps || [], step => step.sequence)\n this.domain = domain\n this.user = user\n this.disposer = context?.disposer\n\n this.context = {\n domain,\n user,\n lng,\n unsafeIP,\n prohibitedPrivileges,\n logger:\n context?.logger ||\n createLogger({\n format: combine(errors({ stack: true }), systemTimestamp({ tz: SYSTEM_TZ }), splat(), LOGFORMAT),\n transports: [\n new (transports as any).DailyRotateFile({\n filename: `logs/${domain.subdomain}/scenario-${scenarioName}-%DATE%.log`,\n datePattern: 'YYYY-MM-DD-HH',\n zippedArchive: false,\n maxSize: '5m',\n maxFiles: '14d',\n level: 'info'\n }),\n new PubSubLogTransport({\n topic: 'scenario-instance-log',\n source: { domain, scenarioName, instanceName }\n })\n ]\n }),\n publish: context?.publish || this.publishData.bind(this),\n load: context?.load || this.loadSubscenario.bind(this),\n data: context?.data || {},\n variables: context?.variables || {},\n client: context?.client,\n state: ScenarioInstanceStatus.STOPPED,\n root: context?.root || this,\n closures: [],\n checkState(state = ScenarioInstanceStatus.STARTED) {\n return this.state == state\n }\n }\n\n this.setState(ScenarioInstanceStatus.READY)\n }\n\n async run() {\n var state = this.getState()\n if (state == ScenarioInstanceStatus.STARTED || this.steps.length == 0) {\n return\n }\n\n this.setState(ScenarioInstanceStatus.STARTED)\n var context = this.context\n\n try {\n while (this.getState() == ScenarioInstanceStatus.STARTED) {\n if (this.nextStep == -1) {\n this.setNextStep(0)\n }\n\n if (this.nextStep == 0) {\n this.rounds++\n this.context.logger.info(`Start ${this.rounds} Rounds #######`)\n }\n\n var step = this.steps[this.nextStep]\n var next, data\n\n if (!step.skip) {\n // @ts-ignore: Initializer provides no value for this binding element and the binding element has no default value.\n var { next, state: stepState, data } = (await this.process(step, context)) || {}\n context.data[step.name] = data\n } else {\n next = ''\n stepState = undefined\n }\n\n this.publishState()\n\n await sleep(1)\n\n if (next) {\n this.setNextStep(\n this.steps.findIndex(step => {\n return step.name == next\n })\n )\n if (this.nextStep == -1) {\n throw 'Not Found Next Step'\n }\n } else if (this.nextStep == this.steps.length - 1) {\n this.setState(ScenarioInstanceStatus.STOPPED)\n } else {\n this.setNextStep(this.nextStep + 1)\n }\n\n /* last step 에 의해서 시나리오 state를 변경할 수 있도록 함. */\n if (stepState !== undefined) {\n this.setState(stepState)\n }\n }\n } catch (ex) {\n const message = ex.stack ? ex.stack : ex\n const { scenarioName, domain } = this\n\n this.context.logger.error(ex)\n\n debug('failed to run ', `[ Domain: ${domain.name}, Scenario: ${scenarioName} ]\\n`, ex)\n this.setState(\n ScenarioInstanceStatus.HALTED,\n typeof message == 'object' ? JSON.stringify(message, null, 2) : message\n )\n\n throw ex\n }\n\n this.result = this.steps\n .filter(step => !!step.result)\n .reduce((sum, step) => {\n sum[step.name] = this.context.data[step.name]\n return sum\n }, {})\n\n const { scenarioId, scenarioTtl, variables, message, scenarioName, instanceName, result, domain } = this\n const obj = {\n scenarioName,\n instanceName,\n variables,\n data: this.data,\n result,\n timestamp: new Date(),\n message,\n state: ScenarioInstanceStatus.STOPPED /* redundent, no meaning */\n }\n\n if (this.scenarioTtl && this.scenarioId) {\n setTimeout(() => {\n cacheService.setInCache(scenarioId, { domain: domain.id, variables: variables || {} }, obj, scenarioTtl)\n })\n }\n\n return obj\n }\n\n async loadSubscenario(step, scenarioConfig, context) {\n var { name: stepName, params } = step\n var { preventErrorPropagation } = params || {}\n\n debug('load-subscenario', this.instanceName, stepName, scenarioConfig.name)\n\n context.data[stepName] = {}\n\n let subContext = {\n ...context,\n data: context.data[stepName],\n closures: [],\n state: ScenarioInstanceStatus.READY\n }\n\n if (!scenarioConfig.domain) {\n scenarioConfig.domain = context.domain\n }\n\n var subScenarioInstance = new ScenarioInstance(`${this.instanceName}$${stepName}`, scenarioConfig, subContext)\n this.addSubScenarioInstance(subScenarioInstance)\n await subScenarioInstance.run()\n\n if (!preventErrorPropagation && subScenarioInstance.getState() == ScenarioInstanceStatus.HALTED) {\n throw new Error(`Sub-scenario[${this.instanceName}$${stepName}] is halted.`)\n }\n\n return subContext\n }\n\n publishData(tag, data) {\n publishData(tag, data, this.context)\n }\n\n publishState() {\n const {\n instanceName,\n scenarioName,\n steps,\n domain,\n message,\n context: { data, variables, state }\n } = this\n\n pubsub.publish('scenario-instance-state', {\n scenarioInstanceState: {\n domain,\n instanceName,\n scenarioName,\n state,\n variables,\n progress: this.calcProgress(),\n data,\n message,\n timestamp: new Date()\n }\n })\n\n this.context.logger.info(this.message)\n }\n\n calcProgress(): ScenarioInstanceProgress {\n var steps = this.steps.length\n var step = Math.max(this.lastStep, 0)\n\n return {\n rounds: this.rounds,\n rate: steps ? Math.round(100 * (step / steps)) : 0,\n steps,\n step\n }\n }\n\n setNextStep(step) {\n this.lastStep = this.nextStep + 1\n this.nextStep = step\n }\n\n getState(): ScenarioInstanceStatus {\n return this.context.state\n }\n\n setState(state, message?) {\n if (this.context.state == state) {\n return\n }\n\n this.message = `${this.instanceName}:[state changed] ${ScenarioInstanceStatus[this.getState()]} => ${ScenarioInstanceStatus[state]}${\n message ? ' caused by ' + util.inspect(message, false, 2, true) : ''\n }`\n\n this.context.state = state\n\n if (state == ScenarioInstanceStatus.STOPPED || state == ScenarioInstanceStatus.HALTED) {\n this.setNextStep(-1)\n this.setState(ScenarioInstanceStatus.UNLOADED)\n } else if (state == ScenarioInstanceStatus.UNLOADED) {\n this.setNextStep(-1)\n this.dispose()\n }\n\n this.publishState()\n }\n\n async start() {\n await this.run()\n }\n\n stop() {\n if (this.getState() !== ScenarioInstanceStatus.HALTED) {\n this.setState(ScenarioInstanceStatus.STOPPED)\n }\n }\n\n unload() {\n this.setState(ScenarioInstanceStatus.UNLOADED)\n }\n\n async dispose() {\n await this.stopSubScenarios()\n\n this.unload()\n\n var closure = this.context?.closures?.pop()\n while (closure) {\n closure.call(this)\n closure = this.context?.closures?.pop()\n }\n\n if (this.disposer) {\n await this.disposer.call(this)\n }\n\n // {{ CHECKPOINT 본 인스턴스를 위해서 생성된 logger를 닫는다. 사용을 완료하고 닫기위해서 지연해서 수행한다.\n if (this.context?.logger) {\n setTimeout(() => {\n this.context.logger.close()\n }, 300)\n }\n // }}\n }\n\n async process(step, context): Promise<{ next: string; state: ScenarioInstanceStatus; data: object }> {\n this.context.logger.info(`Step '${step.name}'(${step.id}) started.`)\n\n step = {\n ...step,\n params: step.params || {}\n }\n\n const connection =\n step.connection && ConnectionManager.getConnectionInstanceEntityByName(this.domain, step.connection)\n\n if (!connection || !connection.edgeId) {\n var handler = TaskRegistry.getTaskHandler(step.task)\n if (!handler) {\n throw new Error(`no task handler for step '${step.name}'(${step.id})`)\n }\n\n var retval: any = await handler(step, context)\n } else {\n var retval: any = await edgeHandler(step, context)\n }\n\n if (step.log) {\n var { data } = retval || {}\n this.context.logger.info(`returns ${typeof data == 'string' ? data : JSON.stringify(data, null, 2)}`)\n }\n\n this.context.logger.info(`Step done.`)\n return retval\n }\n}\n\n@ObjectType({ description: 'A paginated list of scenario instances.' })\nexport class ScenarioInstanceList {\n @Field(type => [ScenarioInstance], { description: 'The list of scenario instance items.' })\n items: ScenarioInstance[]\n\n @Field(type => Int, { description: 'The total number of scenario instances.' })\n total: number\n}\n"]}
|
|
1
|
+
{"version":3,"file":"scenario-instance-type.js","sourceRoot":"","sources":["../../../server/service/scenario-instance/scenario-instance-type.ts"],"names":[],"mappings":"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","sourcesContent":["import 'winston-daily-rotate-file'\n\nimport orderBy from 'lodash/orderBy'\nimport moment from 'moment-timezone'\nimport { Field, Int, ObjectType, registerEnumType } from 'type-graphql'\nimport util from 'util'\nimport { createLogger, format, transports } from 'winston'\n\nimport { Domain, EnvVar, getRepository, pubsub, PubSubLogTransport, ScalarObject } from '@things-factory/shell'\nimport { logger as envLogger } from '@things-factory/env'\nimport { cacheService } from '@things-factory/cache-service'\nimport { User } from '@things-factory/auth-base'\nimport { sleep } from '@things-factory/utils'\n\nimport { publishData } from '../../controllers/publish-data'\nimport { ConnectionManager } from '../../engine/connection-manager'\nimport { TaskRegistry } from '../../engine'\nimport { Context } from '../../engine/types'\nimport { Step } from '../step/step-type'\nimport { handler as edgeHandler } from '../../engine/edge-client'\nimport { getDomainIdsWithAncestors, lookupDomainEnvVar } from '../../utils/domain-inheritance'\n\nconst debug = require('debug')('things-factory:integration-base:scenario-instance')\nconst { combine, errors, splat, printf } = format\n\nconst LOGFORMAT = printf(({ level, message, timestamp, stack }) => {\n return `${timestamp} ${level}: ${stack || message}`\n})\n\nfunction getSystemTimeZone() {\n try {\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone\n if (!timeZone) {\n throw new Error('Unable to resolve timeZone')\n }\n return timeZone\n } catch (e) {\n console.warn('Failed to get system timeZone, falling back to UTC.', e)\n return 'UTC'\n }\n}\n\nconst SYSTEM_TZ = getSystemTimeZone()\nconst systemTimestamp = format((info, opts: { tz?: string }) => {\n if (opts.tz) info.timestamp = moment().tz(opts.tz).format()\n return info\n})\n\nexport enum ScenarioInstanceStatus {\n READY = 'READY',\n STARTED = 'STARTED',\n STOPPED = 'STOPPED',\n HALTED = 'HALTED',\n UNLOADED = 'UNLOADED'\n}\n\nregisterEnumType(ScenarioInstanceStatus, {\n name: 'ScenarioInstanceStatus',\n description: 'Enumeration of possible states for a scenario instance.'\n})\n\n@ObjectType({ description: 'Provides progress information for a running scenario instance.' })\nexport class ScenarioInstanceProgress {\n @Field(type => Int, { description: 'The number of rounds the scenario has completed.' })\n rounds: number\n\n @Field(type => Int, { description: 'The completion rate of the scenario as a percentage.' })\n rate: number\n\n @Field(type => Int, { description: 'The total number of steps in the scenario.' })\n steps: number\n\n @Field(type => Int, { description: 'The current step number being executed.' })\n step: number\n}\n\n@ObjectType({ description: 'Represents the complete state of a scenario instance at a point in time.' })\nexport class ScenarioInstanceState {\n @Field({ nullable: true, description: 'The domain in which the instance is running.' })\n public domain: Domain\n\n @Field({ nullable: true, description: 'The unique name of this specific instance.' })\n public instanceName: string\n\n @Field({ nullable: true, description: 'The name of the scenario being executed.' })\n public scenarioName: string\n\n @Field(type => ScenarioInstanceStatus, {\n nullable: true,\n description: 'The current execution state of the instance.'\n })\n public state: ScenarioInstanceStatus\n\n @Field(type => ScalarObject, { nullable: true, description: 'A key-value map of variables used in the instance.' })\n public variables: any\n\n @Field(type => ScalarObject, {\n nullable: true,\n description: 'A key-value map of data generated and used by the instance.'\n })\n public data: any\n\n @Field(type => ScenarioInstanceProgress, { nullable: true, description: 'The progress of the running instance.' })\n public progress: ScenarioInstanceProgress\n\n @Field({ nullable: true, description: 'A message associated with the current state (e.g., an error message).' })\n public message: string\n\n @Field({ nullable: true, description: 'The timestamp when this state was recorded.' })\n public timestamp: Date\n}\n\n@ObjectType({ description: 'Contains the final result of a completed scenario instance run.' })\nexport class ScenarioInstanceRunResult {\n @Field({ nullable: true, description: 'The name of the scenario that was executed.' })\n public scenarioName: string\n\n @Field({ nullable: true, description: 'The unique name of the instance that was run.' })\n public instanceName: string\n\n @Field(type => ScalarObject, { nullable: true, description: 'The final set of variables after the run.' })\n public variables: any\n\n @Field(type => ScalarObject, { nullable: true, description: 'The final set of data after the run.' })\n public data: any\n\n @Field(type => ScalarObject, { nullable: true, description: 'The final result returned by the scenario.' })\n public result: any\n\n @Field({ nullable: true, description: 'The timestamp when the run completed.' })\n public timestamp: Date\n\n @Field({ nullable: true, description: 'A final message from the run (e.g., success or failure reason).' })\n public message: string\n\n @Field({ nullable: true, description: 'The final state of the instance after the run.' })\n public state: ScenarioInstanceStatus\n}\n\n@ObjectType({ description: 'Contains the final result of a completed scenario instance start.' })\nexport class ScenarioInstanceStartResult {\n @Field({ nullable: true, description: 'The timestamp when the instance started.' })\n public timestamp: Date\n\n @Field({ nullable: true, description: 'A final message from the run (e.g., success or failure reason).' })\n public message: string\n\n @Field({ nullable: true, description: 'The final state of the instance after the run.' })\n public state: ScenarioInstanceStatus\n}\n\n@ObjectType({ description: 'Represents a running or completed instance of a scenario.' })\nexport class ScenarioInstance {\n private subScenarioInstances: ScenarioInstance[] = [] // TODO Imple by WeakSet\n\n public context: Context\n\n @Field({ nullable: true, description: 'The domain in which the instance is running.' })\n public domain: Domain\n\n @Field({ nullable: true, description: 'The user who initiated the instance.' })\n public user: User\n\n @Field({ nullable: true, description: 'The name of the scenario being executed.' })\n public scenarioName: string\n\n @Field({ nullable: true, description: 'The unique name for this specific instance of the scenario.' })\n public instanceName: string\n\n @Field({ nullable: true, description: 'The root scenario instance if this is a sub-scenario.' })\n get root(): ScenarioInstance {\n return this.context?.root\n }\n\n @Field({ nullable: true, description: 'The current execution state of the instance.' })\n get state(): ScenarioInstanceStatus {\n return this.context?.state\n }\n\n @Field(type => ScenarioInstanceProgress, { nullable: true, description: 'The current progress of the instance.' })\n get progress(): ScenarioInstanceProgress {\n return this.calcProgress()\n }\n\n @Field(type => ScalarObject, { nullable: true, description: 'A key-value map of variables used in the instance.' })\n get variables(): any {\n return this.context?.variables\n }\n\n @Field(type => ScalarObject, {\n nullable: true,\n description: 'A key-value map of data generated and used by the instance.'\n })\n get data(): any {\n return this.context?.data\n }\n\n @Field(type => ScalarObject, { nullable: true, description: 'The final result of the scenario run.' })\n result: any\n\n @Field({ nullable: true, description: 'The timestamp of the last update.' })\n get timestamp(): Date {\n return new Date()\n }\n\n @Field({ nullable: true, description: 'A message associated with the current state (e.g., an error message).' })\n public message: string\n\n private scenarioId: string\n private scenarioTtl: number\n private steps: Step[]\n private rounds: number = 0\n\n private lastStep: number = -1\n private nextStep: number = -1\n private disposer: any\n public addSubScenarioInstance(instance: ScenarioInstance): ScenarioInstance[] {\n this.subScenarioInstances.push(instance)\n return this.subScenarioInstances\n }\n\n public getSubScenarioInstances(): ScenarioInstance[] {\n return this.subScenarioInstances\n }\n\n public async stopSubScenarios() {\n var subScenarioInstances = this.getSubScenarioInstances()\n\n var subInstance = subScenarioInstances.pop()\n while (subInstance) {\n await subInstance.dispose()\n subInstance = subScenarioInstances.pop()\n }\n }\n\n constructor(\n instanceName,\n {\n id: scenarioId,\n ttl: scenarioTtl,\n name: scenarioName,\n steps,\n domain: scenarioDomain\n }: { id: string; ttl?: number; name: string; steps: Step[]; domain: Domain },\n context?\n ) {\n var { domain, user, lng, unsafeIP, prohibitedPrivileges } = context || {}\n domain ||= scenarioDomain\n\n this.scenarioId = scenarioId\n this.scenarioTtl = scenarioTtl\n this.instanceName = instanceName\n this.scenarioName = scenarioName\n this.steps = orderBy(steps || [], step => step.sequence)\n this.domain = domain\n this.user = user\n this.disposer = context?.disposer\n\n this.context = {\n domain,\n user,\n lng,\n unsafeIP,\n prohibitedPrivileges,\n logger:\n context?.logger ||\n createLogger({\n format: combine(errors({ stack: true }), systemTimestamp({ tz: SYSTEM_TZ }), splat(), LOGFORMAT),\n transports: [\n new (transports as any).DailyRotateFile({\n filename: `logs/${domain.subdomain}/scenario-${scenarioName}-%DATE%.log`,\n datePattern: 'YYYY-MM-DD-HH',\n zippedArchive: false,\n maxSize: '5m',\n maxFiles: '14d',\n level: 'info'\n }),\n new PubSubLogTransport({\n topic: 'scenario-instance-log',\n source: { domain, scenarioName, instanceName }\n })\n ]\n }),\n publish: context?.publish || this.publishData.bind(this),\n load: context?.load || this.loadSubscenario.bind(this),\n data: context?.data || {},\n variables: context?.variables || {},\n client: context?.client,\n state: ScenarioInstanceStatus.STOPPED,\n root: context?.root || this,\n closures: [],\n checkState(state = ScenarioInstanceStatus.STARTED) {\n return this.state == state\n }\n }\n\n this.setState(ScenarioInstanceStatus.READY)\n }\n\n async run() {\n var state = this.getState()\n if (state == ScenarioInstanceStatus.STARTED || this.steps.length == 0) {\n return\n }\n\n this.setState(ScenarioInstanceStatus.STARTED)\n var context = this.context\n\n try {\n while (this.getState() == ScenarioInstanceStatus.STARTED) {\n if (this.nextStep == -1) {\n this.setNextStep(0)\n }\n\n if (this.nextStep == 0) {\n this.rounds++\n this.context.logger.info(`Start ${this.rounds} Rounds #######`)\n }\n\n var step = this.steps[this.nextStep]\n var next, data\n\n if (!step.skip) {\n // @ts-ignore: Initializer provides no value for this binding element and the binding element has no default value.\n var { next, state: stepState, data } = (await this.process(step, context)) || {}\n context.data[step.name] = data\n } else {\n next = ''\n stepState = undefined\n }\n\n this.publishState()\n\n await sleep(1)\n\n if (next) {\n this.setNextStep(\n this.steps.findIndex(step => {\n return step.name == next\n })\n )\n if (this.nextStep == -1) {\n throw 'Not Found Next Step'\n }\n } else if (this.nextStep == this.steps.length - 1) {\n this.setState(ScenarioInstanceStatus.STOPPED)\n } else {\n this.setNextStep(this.nextStep + 1)\n }\n\n /* last step 에 의해서 시나리오 state를 변경할 수 있도록 함. */\n if (stepState !== undefined) {\n this.setState(stepState)\n }\n }\n } catch (ex) {\n const message = ex.stack ? ex.stack : ex\n const { scenarioName, domain } = this\n\n this.context.logger.error(ex)\n\n debug('failed to run ', `[ Domain: ${domain.name}, Scenario: ${scenarioName} ]\\n`, ex)\n this.setState(\n ScenarioInstanceStatus.HALTED,\n typeof message == 'object' ? JSON.stringify(message, null, 2) : message\n )\n\n throw ex\n }\n\n this.result = this.steps\n .filter(step => !!step.result)\n .reduce((sum, step) => {\n sum[step.name] = this.context.data[step.name]\n return sum\n }, {})\n\n const { scenarioId, scenarioTtl, variables, message, scenarioName, instanceName, result, domain } = this\n const obj = {\n scenarioName,\n instanceName,\n variables,\n data: this.data,\n result,\n timestamp: new Date(),\n message,\n state: ScenarioInstanceStatus.STOPPED /* redundent, no meaning */\n }\n\n if (this.scenarioTtl && this.scenarioId) {\n setTimeout(() => {\n cacheService.setInCache(scenarioId, { domain: domain.id, variables: variables || {} }, obj, scenarioTtl)\n })\n }\n\n return obj\n }\n\n async loadSubscenario(step, scenarioConfig, context) {\n var { name: stepName, params } = step\n var { preventErrorPropagation } = params || {}\n\n debug('load-subscenario', this.instanceName, stepName, scenarioConfig.name)\n\n context.data[stepName] = {}\n\n let subContext = {\n ...context,\n data: context.data[stepName],\n closures: [],\n state: ScenarioInstanceStatus.READY\n }\n\n if (!scenarioConfig.domain) {\n scenarioConfig.domain = context.domain\n }\n\n var subScenarioInstance = new ScenarioInstance(`${this.instanceName}$${stepName}`, scenarioConfig, subContext)\n this.addSubScenarioInstance(subScenarioInstance)\n await subScenarioInstance.run()\n\n if (!preventErrorPropagation && subScenarioInstance.getState() == ScenarioInstanceStatus.HALTED) {\n throw new Error(`Sub-scenario[${this.instanceName}$${stepName}] is halted.`)\n }\n\n return subContext\n }\n\n publishData(tag, data) {\n publishData(tag, data, this.context)\n }\n\n publishState() {\n const {\n instanceName,\n scenarioName,\n steps,\n domain,\n message,\n context: { data, variables, state }\n } = this\n\n pubsub.publish('scenario-instance-state', {\n scenarioInstanceState: {\n domain,\n instanceName,\n scenarioName,\n state,\n variables,\n progress: this.calcProgress(),\n data,\n message,\n timestamp: new Date()\n }\n })\n\n this.context.logger.info(this.message)\n }\n\n calcProgress(): ScenarioInstanceProgress {\n var steps = this.steps.length\n var step = Math.max(this.lastStep, 0)\n\n return {\n rounds: this.rounds,\n rate: steps ? Math.round(100 * (step / steps)) : 0,\n steps,\n step\n }\n }\n\n setNextStep(step) {\n this.lastStep = this.nextStep + 1\n this.nextStep = step\n }\n\n getState(): ScenarioInstanceStatus {\n return this.context.state\n }\n\n setState(state, message?) {\n if (this.context.state == state) {\n return\n }\n\n this.message = `${this.instanceName}:[state changed] ${ScenarioInstanceStatus[this.getState()]} => ${ScenarioInstanceStatus[state]}${\n message ? ' caused by ' + util.inspect(message, false, 2, true) : ''\n }`\n\n this.context.state = state\n\n if (state == ScenarioInstanceStatus.STOPPED || state == ScenarioInstanceStatus.HALTED) {\n this.setNextStep(-1)\n this.setState(ScenarioInstanceStatus.UNLOADED)\n } else if (state == ScenarioInstanceStatus.UNLOADED) {\n this.setNextStep(-1)\n this.dispose()\n }\n\n this.publishState()\n }\n\n async start() {\n await this.run()\n }\n\n stop() {\n if (this.getState() !== ScenarioInstanceStatus.HALTED) {\n this.setState(ScenarioInstanceStatus.STOPPED)\n }\n }\n\n unload() {\n this.setState(ScenarioInstanceStatus.UNLOADED)\n }\n\n async dispose() {\n await this.stopSubScenarios()\n\n this.unload()\n\n var closure = this.context?.closures?.pop()\n while (closure) {\n closure.call(this)\n closure = this.context?.closures?.pop()\n }\n\n if (this.disposer) {\n await this.disposer.call(this)\n }\n\n // {{ CHECKPOINT 본 인스턴스를 위해서 생성된 logger를 닫는다. 사용을 완료하고 닫기위해서 지연해서 수행한다.\n if (this.context?.logger) {\n setTimeout(() => {\n this.context.logger.close()\n }, 300)\n }\n // }}\n }\n\n async process(step, context): Promise<{ next: string; state: ScenarioInstanceStatus; data: object }> {\n this.context.logger.info(`Step '${step.name}'(${step.id}) started.`)\n\n step = {\n ...step,\n params: step.params || {}\n }\n\n const connection =\n step.connection && ConnectionManager.getConnectionInstanceEntityByName(this.domain, step.connection)\n\n if (!connection || !connection.edgeId) {\n var handler = TaskRegistry.getTaskHandler(step.task)\n if (!handler) {\n throw new Error(`no task handler for step '${step.name}'(${step.id})`)\n }\n\n // Task step.params 의 useDomainAttribute 해석:\n // parameterSpec 에 useDomainAttribute=true 로 표시된 param 이 비어있으면\n // EnvVar `Step::<scenarioName>::<stepName>::<paramName>` 을 현재 도메인\n // (+ancestor closest-wins) 에서 조회해 채운다. 같은 task 라도 시나리오/step\n // 마다 별개 값을 가질 수 있도록 step 단위로 식별한다.\n step.params = await resolveDomainAttributeParams(\n this.scenarioName,\n step,\n handler,\n this.domain,\n this.context.logger\n )\n\n var retval: any = await handler(step, context)\n } else {\n var retval: any = await edgeHandler(step, context)\n }\n\n if (step.log) {\n var { data } = retval || {}\n this.context.logger.info(`returns ${typeof data == 'string' ? data : JSON.stringify(data, null, 2)}`)\n }\n\n this.context.logger.info(`Step done.`)\n return retval\n }\n}\n\n/**\n * Step.params 의 useDomainAttribute 해석.\n *\n * Step 은 Task 의 인스턴스이므로 (Connection ↔ ConnectionType 관계와 동일),\n * 같은 task 라도 시나리오 안 step 마다 다른 도메인 속성을 가질 수 있어야 한다.\n * 따라서 식별자는 `Step::<scenarioName>::<stepName>::<paramName>`.\n *\n * 핸들러에 정적 부착된 `parameterSpec` 을 읽어 `useDomainAttribute: true` 로\n * 표시된 param 이 비어있으면 위 키로 현재 도메인(+ancestor closest-wins)\n * 의 EnvVar 를 조회해 채운다. Connection.getParameter 와 동일한 규칙.\n */\nasync function resolveDomainAttributeParams(\n scenarioName: string,\n step: any,\n handler: any,\n domain: Domain,\n logger?: { info?: (m: string) => void; warn?: (m: string) => void }\n): Promise<any> {\n const spec = handler?.parameterSpec\n if (!Array.isArray(spec) || spec.length === 0) return step.params\n const result = { ...(step.params || {}) }\n const dn = domain?.subdomain || domain?.name\n\n for (const s of spec) {\n if (!s?.useDomainAttribute || !s.name) continue\n\n const envVarKey = `Step::${scenarioName}::${step.name}::${s.name}`\n const value = await lookupDomainEnvVar(domain, envVarKey)\n\n // 우선순위 (useDomainAttribute=true 필드):\n // 1. EnvVar (ancestor closest-wins) — 자식 override 가능 — 본 소스\n // 2. step.params 명시값 — default 역할\n //\n // 의미론: useDomainAttribute 플래그는 \"이 필드는 도메인별 override 가능\" 선언.\n // 부모 시나리오의 step.params 명시값은 자손 도메인에 적용되는 default. 자식이\n // EnvVar 로 자기 값 register 하면 그 자식 트리에만 우선 적용.\n if (value !== undefined) {\n const prior = result[s.name]\n result[s.name] = value\n if (prior !== null && prior !== undefined && prior !== '') {\n const priorRepr = typeof prior === 'string' ? JSON.stringify(prior) : String(prior)\n const msg = `[domain-attr] step '${step.name}'.${s.name}: step.params default ${priorRepr} overridden by EnvVar '${envVarKey}' (domain='${dn}')`\n logger?.info?.(msg)\n envLogger.info(msg)\n console.info(msg)\n } else {\n const msg = `[domain-attr] step '${step.name}'.${s.name} ← EnvVar '${envVarKey}' (domain='${dn}')`\n logger?.info?.(msg)\n envLogger.info(msg)\n console.info(msg)\n }\n continue\n }\n\n // EnvVar 없음 — step.params 의 명시값이 있으면 그대로 사용 (default 역할)\n const cur = result[s.name]\n if (cur !== null && cur !== undefined && cur !== '') {\n const curRepr = typeof cur === 'string' ? JSON.stringify(cur) : String(cur)\n const msg = `[domain-attr] step '${step.name}'.${s.name} ← step.params default ${curRepr} (EnvVar 미등록)`\n logger?.info?.(msg)\n envLogger.info(msg)\n console.info(msg)\n continue\n }\n\n // EnvVar 도 없고 params 도 없음 — 광범위 진단 + 미해소\n const allMatches = await getRepository(EnvVar).find({ where: { name: envVarKey }, relations: ['domain'] })\n const others = allMatches.map((e: any) => `${e.domain?.subdomain || e.domain?.name}${e.active ? '' : '(inactive)'}`)\n const ancestorIds = await getDomainIdsWithAncestors(domain)\n const msg =\n `[domain-attr] step '${step.name}'.${s.name} 미해소 — EnvVar '${envVarKey}' 를 도메인 '${dn}' + ${ancestorIds.length}-개 ancestor 에서 찾지 못함. ` +\n (others.length > 0\n ? `다른 도메인에는 존재함: [${others.join(', ')}] — 도메인 컨텍스트 확인 필요`\n : `어디에도 등록되지 않음`)\n logger?.warn?.(msg)\n envLogger.warn(msg)\n console.warn(msg)\n }\n return result\n}\n\n@ObjectType({ description: 'A paginated list of scenario instances.' })\nexport class ScenarioInstanceList {\n @Field(type => [ScenarioInstance], { description: 'The list of scenario instance items.' })\n items: ScenarioInstance[]\n\n @Field(type => Int, { description: 'The total number of scenario instances.' })\n total: number\n}\n"]}
|
|
@@ -17,14 +17,14 @@ exports.ScenarioQueueSubscription = ScenarioQueueSubscription;
|
|
|
17
17
|
tslib_1.__decorate([
|
|
18
18
|
(0, type_graphql_1.Subscription)({
|
|
19
19
|
description: 'Subscribes to changes in the scenario queue.',
|
|
20
|
-
subscribe: ({ args, context, info }) => {
|
|
20
|
+
subscribe: async ({ args, context, info }) => {
|
|
21
21
|
const { domain, user } = context.state;
|
|
22
22
|
const subdomain = domain?.subdomain;
|
|
23
23
|
debug('subscribe', subdomain);
|
|
24
24
|
if (!domain) {
|
|
25
25
|
throw new Error('domain required.');
|
|
26
26
|
}
|
|
27
|
-
if (!user.domains?.find(d => d.subdomain === subdomain) && !process.superUserGranted(domain, user)) {
|
|
27
|
+
if (!user.domains?.find(d => d.subdomain === subdomain) && !(await process.superUserGranted(domain, user))) {
|
|
28
28
|
throw new Error(`domain(${subdomain}) is not working for user(${user.email}).`);
|
|
29
29
|
}
|
|
30
30
|
process.nextTick(async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-queue-subscription.js","sourceRoot":"","sources":["../../../server/service/scenario-queue/scenario-queue-subscription.ts"],"names":[],"mappings":";;;;AAAA,+CAAgE;AAChE,+DAA0D;AAC1D,iDAA8C;AAC9C,+CAA2C;AAC3C,yCAA6C;AAE7C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,oDAAoD,CAAC,CAAA;AAG7E,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IA2CpC,kBAAkB,CAAS,OAAmD;QAC5E,OAAO,OAAO,CAAC,kBAAkB,CAAA;IACnC,CAAC;CACF,CAAA;AA9CY,8DAAyB;AA2CpC;IA1CC,IAAA,2BAAY,EAAC;QACZ,WAAW,EAAE,8CAA8C;QAC3D,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"scenario-queue-subscription.js","sourceRoot":"","sources":["../../../server/service/scenario-queue/scenario-queue-subscription.ts"],"names":[],"mappings":";;;;AAAA,+CAAgE;AAChE,+DAA0D;AAC1D,iDAA8C;AAC9C,+CAA2C;AAC3C,yCAA6C;AAE7C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,oDAAoD,CAAC,CAAA;AAG7E,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IA2CpC,kBAAkB,CAAS,OAAmD;QAC5E,OAAO,OAAO,CAAC,kBAAkB,CAAA;IACnC,CAAC;CACF,CAAA;AA9CY,8DAAyB;AA2CpC;IA1CC,IAAA,2BAAY,EAAC;QACZ,WAAW,EAAE,8CAA8C;QAC3D,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;YAC3C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;YACtC,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,CAAA;YAEnC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;YAE7B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;YACrC,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC3G,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,6BAA6B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;YACjF,CAAC;YAED,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;gBAC1B,IAAI,KAAK,GAAG,uBAAc,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;gBAClD,IAAI,KAAK,EAAE,CAAC;oBACV,cAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE;wBACrC,kBAAkB,EAAE;4BAClB,MAAM;4BACN,KAAK,EAAE,KAAK,CAAC,KAAK;yBACnB;qBACF,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC,CAAC,CAAA;YAEF,OAAO,IAAA,mBAAI,EACT,cAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,EACxC,IAAA,qBAAM,EAAC,CAAC,OAAmD,EAAE,EAAE;gBAC7D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAA;gBAEtD,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;oBACrC,OAAO,KAAK,CAAA;gBACd,CAAC;gBAED,OAAO,IAAI,CAAA;YACb,CAAC,CAAC,CACH,CAAA;QACH,CAAC;KACF,CAAC;IACkB,mBAAA,IAAA,mBAAI,GAAE,CAAA;;;4CAAuD,wCAAkB;mEAElG;oCA7CU,yBAAyB;IADrC,IAAA,uBAAQ,GAAE;GACE,yBAAyB,CA8CrC","sourcesContent":["import { Resolver, Subscription, Root, Arg } from 'type-graphql'\nimport { ScenarioQueueState } from './scenario-queue-type'\nimport { pubsub } from '@things-factory/shell'\nimport { filter, pipe } from 'graphql-yoga'\nimport { ScenarioEngine } from '../../engine'\n\nconst debug = require('debug')('things-factory:integration:connection-subscription')\n\n@Resolver()\nexport class ScenarioQueueSubscription {\n @Subscription({\n description: 'Subscribes to changes in the scenario queue.',\n subscribe: async ({ args, context, info }) => {\n const { domain, user } = context.state\n const subdomain = domain?.subdomain\n\n debug('subscribe', subdomain)\n\n if (!domain) {\n throw new Error('domain required.')\n }\n\n if (!user.domains?.find(d => d.subdomain === subdomain) && !(await process.superUserGranted(domain, user))) {\n throw new Error(`domain(${subdomain}) is not working for user(${user.email}).`)\n }\n\n process.nextTick(async () => {\n var queue = ScenarioEngine.getPendingQueue(domain)\n if (queue) {\n pubsub.publish('scenario-queue-state', {\n scenarioQueueState: {\n domain,\n queue: queue.queue\n }\n })\n }\n })\n\n return pipe(\n pubsub.subscribe('scenario-queue-state'),\n filter((payload: { scenarioQueueState: ScenarioQueueState }) => {\n const { domain: pdomain } = payload.scenarioQueueState\n\n if (pdomain?.subdomain !== subdomain) {\n return false\n }\n\n return true\n })\n )\n }\n })\n scenarioQueueState(@Root() payload: { scenarioQueueState: ScenarioQueueState }): ScenarioQueueState {\n return payload.scenarioQueueState\n }\n}\n"]}
|
|
@@ -9,13 +9,14 @@ const state_register_1 = require("./state-register");
|
|
|
9
9
|
/* 이 Resolver는 @things-factory/shell에서 등록한 DataResolver를 Overide 한 것이다. */
|
|
10
10
|
let DataResolver = class DataResolver {
|
|
11
11
|
data(payload, tag) {
|
|
12
|
-
|
|
12
|
+
// 전달 시점에 발행 타임스탬프(ts)를 무조건 스탬프 (클라이언트 데이터 지연 모니터링용).
|
|
13
|
+
return { ...payload.data, ts: Date.now() };
|
|
13
14
|
}
|
|
14
15
|
};
|
|
15
16
|
exports.DataResolver = DataResolver;
|
|
16
17
|
tslib_1.__decorate([
|
|
17
18
|
(0, type_graphql_1.Subscription)({
|
|
18
|
-
subscribe: ({ args, context, info }) => {
|
|
19
|
+
subscribe: async ({ args, context, info }) => {
|
|
19
20
|
const { domain, user } = context.state;
|
|
20
21
|
const { tag } = args;
|
|
21
22
|
const subdomain = domain?.subdomain;
|
|
@@ -23,7 +24,7 @@ tslib_1.__decorate([
|
|
|
23
24
|
throw new Error('domain and tag required');
|
|
24
25
|
}
|
|
25
26
|
//@ts-ignore
|
|
26
|
-
if (!user.domains?.find(d => d.subdomain === subdomain) && !process.superUserGranted(domain, user)) {
|
|
27
|
+
if (!user.domains?.find(d => d.subdomain === subdomain) && !(await process.superUserGranted(domain, user))) {
|
|
27
28
|
throw new Error(`domain(${subdomain}) is not working for user(${user.email}).`);
|
|
28
29
|
}
|
|
29
30
|
process.nextTick(async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-resolver.js","sourceRoot":"","sources":["../../../server/service/state-register/data-resolver.ts"],"names":[],"mappings":";;;;AAAA,+CAA2C;AAC3C,+CAAgE;AAEhE,iDAAmE;AACnE,qDAAgD;AAEhD,0EAA0E;AAEnE,IAAM,YAAY,GAAlB,MAAM,YAAY;IA4CvB,IAAI,CAAS,OAAuB,EAAc,GAAW;QAC3D,OAAO,OAAO,CAAC,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"data-resolver.js","sourceRoot":"","sources":["../../../server/service/state-register/data-resolver.ts"],"names":[],"mappings":";;;;AAAA,+CAA2C;AAC3C,+CAAgE;AAEhE,iDAAmE;AACnE,qDAAgD;AAEhD,0EAA0E;AAEnE,IAAM,YAAY,GAAlB,MAAM,YAAY;IA4CvB,IAAI,CAAS,OAAuB,EAAc,GAAW;QAC3D,qDAAqD;QACrD,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;IAC5C,CAAC;CACF,CAAA;AAhDY,oCAAY;AA4CvB;IA3CC,IAAA,2BAAY,EAAC;QACZ,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;YAC3C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;YACtC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;YACpB,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,CAAA;YAEnC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;YAC5C,CAAC;YAED,YAAY;YACZ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC3G,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,6BAA6B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;YACjF,CAAC;YAED,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;gBAC1B,mDAAmD;gBACnD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;gBAEhC,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAa,EAAC,8BAAa,CAAC,CAAC,OAAO,CAAC;oBACvD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;iBAChD,CAAC,CAAA;gBAEF,IAAI,KAAK,EAAE,CAAC;oBACV,cAAM,CAAC,OAAO,CAAC,MAAM,EAAE;wBACrB,IAAI,EAAE;4BACJ,MAAM;4BACN,GAAG;4BACH,IAAI,EAAE,KAAK,CAAC,KAAK;yBAClB;qBACF,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC,CAAC,CAAA;YAEF,OAAO,IAAA,mBAAI,EACT,cAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EACxB,IAAA,qBAAM,EAAC,CAAC,OAAuB,EAAE,EAAE;gBACjC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAA;gBACzD,OAAO,GAAG,KAAK,IAAI,IAAI,SAAS,KAAK,OAAO,EAAE,SAAS,CAAA;YACzD,CAAC,CAAC,CACH,CAAA;QACH,CAAC;KACF,CAAC;IACI,mBAAA,IAAA,mBAAI,GAAE,CAAA;IAA2B,mBAAA,IAAA,kBAAG,EAAC,KAAK,CAAC,CAAA;;;4CAAe,YAAI;wCAGnE;uBA/CU,YAAY;IADxB,IAAA,uBAAQ,GAAE;GACE,YAAY,CAgDxB","sourcesContent":["import { filter, pipe } from 'graphql-yoga'\nimport { Arg, Resolver, Root, Subscription } from 'type-graphql'\n\nimport { pubsub, Data, getRepository } from '@things-factory/shell'\nimport { StateRegister } from './state-register'\n\n/* 이 Resolver는 @things-factory/shell에서 등록한 DataResolver를 Overide 한 것이다. */\n@Resolver()\nexport class DataResolver {\n @Subscription({\n subscribe: async ({ args, context, info }) => {\n const { domain, user } = context.state\n const { tag } = args\n const subdomain = domain?.subdomain\n\n if (!domain || !tag) {\n throw new Error('domain and tag required')\n }\n\n //@ts-ignore\n if (!user.domains?.find(d => d.subdomain === subdomain) && !(await process.superUserGranted(domain, user))) {\n throw new Error(`domain(${subdomain}) is not working for user(${user.email}).`)\n }\n\n process.nextTick(async () => {\n /* state-register에 등록된 태그라면, 현재 상태값을 publish 한다. */\n const { domain } = context.state\n\n const state = await getRepository(StateRegister).findOne({\n where: { domain: { id: domain.id }, name: tag }\n })\n\n if (state) {\n pubsub.publish('data', {\n data: {\n domain,\n tag,\n data: state.state\n }\n })\n }\n })\n\n return pipe(\n pubsub.subscribe('data'),\n filter((payload: { data: Data }) => {\n const { domain: pdomain, tag: ptag, data } = payload.data\n return tag === ptag && subdomain === pdomain?.subdomain\n })\n )\n }\n })\n data(@Root() payload: { data: Data }, @Arg('tag') tag: string): Data {\n // 전달 시점에 발행 타임스탬프(ts)를 무조건 스탬프 (클라이언트 데이터 지연 모니터링용).\n return { ...payload.data, ts: Date.now() }\n }\n}\n"]}
|
|
@@ -12,6 +12,19 @@ let StepMutation = class StepMutation {
|
|
|
12
12
|
let results = [];
|
|
13
13
|
const stepRepo = tx.getRepository(step_type_1.Step);
|
|
14
14
|
const scenario = await tx.getRepository(scenario_1.Scenario).findOneBy({ id: scenarioId });
|
|
15
|
+
if (!scenario) {
|
|
16
|
+
throw new Error(`Scenario '${scenarioId}' not found`);
|
|
17
|
+
}
|
|
18
|
+
// Inheritance read-only 가드 — inherited scenario (다른 도메인 소유) 의 step 직접 수정 차단.
|
|
19
|
+
// 자식 도메인이 patch.id 를 그대로 보내 save 하면 TypeORM upsert 가 부모의 step row 의
|
|
20
|
+
// domain 을 자식으로 변경해 부모·형제 도메인이 step 을 잃는 사고 발생.
|
|
21
|
+
// 자식별 값 변경은 useDomainAttribute params 의 EnvVar override 로, 전체 수정은
|
|
22
|
+
// copyScenarios 로 자식 도메인 사본을 만든 뒤 그것을 수정.
|
|
23
|
+
if (scenario.domainId !== domain.id) {
|
|
24
|
+
throw new Error(`Cannot modify steps of inherited scenario '${scenario.name}' (owned by another domain). ` +
|
|
25
|
+
`Per-tenant value override 는 useDomainAttribute params + EnvVar 로 가능. ` +
|
|
26
|
+
`구조 자체를 customize 하려면 copyScenarios 로 이 시나리오를 현재 도메인에 복사한 뒤 수정.`);
|
|
27
|
+
}
|
|
15
28
|
await stepRepo.delete({ domain: { id: domain.id }, scenario: { id: scenarioId } });
|
|
16
29
|
for (let i = 0; i < patches.length; i++) {
|
|
17
30
|
const result = await stepRepo.save({
|
|
@@ -28,6 +41,8 @@ let StepMutation = class StepMutation {
|
|
|
28
41
|
}
|
|
29
42
|
async deleteSteps(ids, context) {
|
|
30
43
|
const { domain, tx } = context.state;
|
|
44
|
+
// Inheritance read-only 가드 — 다른 도메인 소유 step 은 자식이 삭제 불가.
|
|
45
|
+
// domain 필터를 명시 — current domain 의 step 만 삭제. 부모 step 은 영향 없음.
|
|
31
46
|
await tx.getRepository(step_type_1.Step).delete({
|
|
32
47
|
domain: { id: domain.id },
|
|
33
48
|
id: (0, typeorm_1.In)(ids.filter(Boolean))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-mutation.js","sourceRoot":"","sources":["../../../server/service/step/step-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AACtE,qCAA4B;AAE5B,mDAA+C;AAC/C,2CAA6C;AAGtC,IAAM,YAAY,GAAlB,MAAM,YAAY;IAMjB,AAAN,KAAK,CAAC,kBAAkB,CACH,UAAkB,EACA,OAAoB,EAClD,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,MAAM,QAAQ,GAAG,EAAE,CAAC,aAAa,CAAC,gBAAI,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,mBAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;QAE/E,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;QAElF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;gBACjC,GAAG,OAAO,CAAC,CAAC,CAAC;gBACb,QAAQ,EAAE,CAAC;gBACX,QAAQ;gBACR,MAAM;gBACN,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;aACd,CAAC,CAAA;YAEF,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC1C,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAIK,AAAN,KAAK,CAAC,WAAW,CAA+B,GAAa,EAAS,OAAwB;QAC5F,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEpC,MAAM,EAAE,CAAC,aAAa,CAAC,gBAAI,CAAC,CAAC,MAAM,CAAC;YAClC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzB,EAAE,EAAE,IAAA,YAAE,EAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SAC5B,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"step-mutation.js","sourceRoot":"","sources":["../../../server/service/step/step-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { Scenario } from '../scenario/scenario'\nimport { Step, StepPatch } from './step-type'\n\n@Resolver(Step)\nexport class StepMutation {\n @Directive('@transaction')\n @Mutation(returns => [Step], {\n description:\n 'Updates multiple steps within a specific scenario. This operation replaces all existing steps for the scenario.'\n })\n async updateMultipleStep(\n @Arg('scenarioId') scenarioId: string,\n @Arg('patches', type => [StepPatch]) patches: StepPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Step[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const stepRepo = tx.getRepository(Step)\n const scenario = await tx.getRepository(Scenario).findOneBy({ id: scenarioId })\n\n if (!scenario) {\n throw new Error(`Scenario '${scenarioId}' not found`)\n }\n\n // Inheritance read-only 가드 — inherited scenario (다른 도메인 소유) 의 step 직접 수정 차단.\n // 자식 도메인이 patch.id 를 그대로 보내 save 하면 TypeORM upsert 가 부모의 step row 의\n // domain 을 자식으로 변경해 부모·형제 도메인이 step 을 잃는 사고 발생.\n // 자식별 값 변경은 useDomainAttribute params 의 EnvVar override 로, 전체 수정은\n // copyScenarios 로 자식 도메인 사본을 만든 뒤 그것을 수정.\n if (scenario.domainId !== domain.id) {\n throw new Error(\n `Cannot modify steps of inherited scenario '${scenario.name}' (owned by another domain). ` +\n `Per-tenant value override 는 useDomainAttribute params + EnvVar 로 가능. ` +\n `구조 자체를 customize 하려면 copyScenarios 로 이 시나리오를 현재 도메인에 복사한 뒤 수정.`\n )\n }\n\n await stepRepo.delete({ domain: { id: domain.id }, scenario: { id: scenarioId } })\n\n for (let i = 0; i < patches.length; i++) {\n const result = await stepRepo.save({\n ...patches[i],\n sequence: i,\n scenario,\n domain,\n creator: user,\n updater: user\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'Deletes multiple scenario steps by their IDs.' })\n async deleteSteps(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n // Inheritance read-only 가드 — 다른 도메인 소유 step 은 자식이 삭제 불가.\n // domain 필터를 명시 — current domain 의 step 만 삭제. 부모 step 은 영향 없음.\n await tx.getRepository(Step).delete({\n domain: { id: domain.id },\n id: In(ids.filter(Boolean))\n })\n\n return true\n }\n}\n"]}
|
|
@@ -3,28 +3,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.StepQuery = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const type_graphql_1 = require("type-graphql");
|
|
6
|
+
const typeorm_1 = require("typeorm");
|
|
6
7
|
const auth_base_1 = require("@things-factory/auth-base");
|
|
7
8
|
const shell_1 = require("@things-factory/shell");
|
|
8
9
|
const scenario_1 = require("../scenario/scenario");
|
|
9
10
|
const step_type_1 = require("./step-type");
|
|
11
|
+
const domain_inheritance_1 = require("../../utils/domain-inheritance");
|
|
10
12
|
/**
|
|
11
13
|
* @description Provides GraphQL resolvers for scenario steps.
|
|
12
14
|
*/
|
|
13
15
|
let StepQuery = class StepQuery {
|
|
14
16
|
async step(name, context) {
|
|
15
17
|
const { domain } = context.state;
|
|
18
|
+
// Scenario·Step 모두 자식 도메인이 부모 도메인 정의를 inherit 가능해야 함 (closest-wins).
|
|
19
|
+
const domainIds = await (0, domain_inheritance_1.getDomainIdsWithAncestors)(domain);
|
|
16
20
|
return await (0, shell_1.getRepository)(step_type_1.Step).findOne({
|
|
17
|
-
where: { domain: { id:
|
|
21
|
+
where: { domain: { id: (0, typeorm_1.In)(domainIds) }, name }
|
|
18
22
|
});
|
|
19
23
|
}
|
|
20
24
|
async steps(params, context) {
|
|
21
25
|
const { domain } = context.state;
|
|
26
|
+
const domainIds = await (0, domain_inheritance_1.getDomainIdsWithAncestors)(domain);
|
|
22
27
|
const queryBuilder = (0, shell_1.getQueryBuilderFromListParams)({
|
|
23
28
|
repository: (0, shell_1.getRepository)(step_type_1.Step),
|
|
24
29
|
params,
|
|
25
|
-
|
|
30
|
+
// 도메인 필터는 ancestor 기반으로 직접 적용
|
|
31
|
+
domain: undefined,
|
|
26
32
|
searchables: ['name', 'description']
|
|
27
33
|
});
|
|
34
|
+
queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {
|
|
35
|
+
ancestorDomainIds: domainIds
|
|
36
|
+
});
|
|
28
37
|
const [items, total] = await queryBuilder.getManyAndCount();
|
|
29
38
|
return { items, total };
|
|
30
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-query.js","sourceRoot":"","sources":["../../../server/service/step/step-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAmF;
|
|
1
|
+
{"version":3,"file":"step-query.js","sourceRoot":"","sources":["../../../server/service/step/step-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\n\nimport { Scenario } from '../scenario/scenario'\nimport { Step, StepList } from './step-type'\nimport { getDomainIdsWithAncestors } from '../../utils/domain-inheritance'\n\n/**\n * @description Provides GraphQL resolvers for scenario steps.\n */\n@Resolver(Step)\nexport class StepQuery {\n @Query(returns => Step, { description: 'Fetches a single scenario step by its name.' })\n async step(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<Step> {\n const { domain } = context.state\n // Scenario·Step 모두 자식 도메인이 부모 도메인 정의를 inherit 가능해야 함 (closest-wins).\n const domainIds = await getDomainIdsWithAncestors(domain)\n return await getRepository(Step).findOne({\n where: { domain: { id: In(domainIds) }, name }\n })\n }\n\n @Query(returns => StepList, { description: 'Fetches a paginated list of scenario steps.' })\n async steps(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<StepList> {\n const { domain } = context.state\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(Step),\n params,\n // 도메인 필터는 ancestor 기반으로 직접 적용\n domain: undefined,\n searchables: ['name', 'description']\n })\n\n queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {\n ancestorDomainIds: domainIds\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Scenario)\n async scenario(@Root() step: Step) {\n return await getRepository(Scenario).findOneBy({ id: step.scenarioId })\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() step: Step) {\n return await getRepository(Domain).findOneBy({ id: step.domainId })\n }\n\n @FieldResolver(type => User)\n async updater(@Root() step: Step): Promise<User> {\n return await getRepository(User).findOneBy({ id: step.updaterId })\n }\n\n @FieldResolver(type => User)\n async creator(@Root() step: Step): Promise<User> {\n return await getRepository(User).findOneBy({ id: step.creatorId })\n }\n}\n"]}
|