@things-factory/integration-base 10.1.234 → 10.1.236
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/controllers/scenario-controller.js +6 -4
- package/dist-server/controllers/scenario-controller.js.map +1 -1
- package/dist-server/engine/scenario-engine.d.ts +5 -1
- package/dist-server/engine/scenario-engine.js +4 -0
- package/dist-server/engine/scenario-engine.js.map +1 -1
- package/dist-server/engine/task/local-graphql-mutate.js +6 -1
- package/dist-server/engine/task/local-graphql-mutate.js.map +1 -1
- package/dist-server/engine/task/local-graphql-query.js +6 -1
- package/dist-server/engine/task/local-graphql-query.js.map +1 -1
- package/dist-server/index.js +4 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/role-tasks.d.ts +2 -0
- package/dist-server/role-tasks.js +16 -0
- package/dist-server/role-tasks.js.map +1 -0
- package/dist-server/service/connection/connection-mutation.js +18 -0
- package/dist-server/service/connection/connection-mutation.js.map +1 -1
- package/dist-server/service/scenario/scenario-mutation.js +11 -1
- package/dist-server/service/scenario/scenario-mutation.js.map +1 -1
- package/dist-server/service/scenario-instance/scenario-instance-mutation.js +2 -1
- package/dist-server/service/scenario-instance/scenario-instance-mutation.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/translations/en.json +9 -1
- package/translations/es.json +9 -1
- package/translations/ja.json +9 -1
- package/translations/ko.json +9 -1
- package/translations/ms.json +9 -1
- package/translations/zh.json +9 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-mutation.js","sourceRoot":"","sources":["../../../server/service/scenario/scenario-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Int, Mutation, Resolver } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport {\n Application,\n getCallbackBaseWithDomainContext,\n registerSchedule,\n unregisterSchedule\n} from '@things-factory/scheduler-client'\n\nimport { Scenario } from './scenario'\nimport { ScenarioHistory } from './scenario-history'\nimport { NewScenario, ScenarioPatch } from './scenario-type'\nimport { resolveScenarioSteps, getLatestReleasedHistory, syncLegacyStepTable } from './resolve-steps'\nimport { diffScenarioMeta, diffScenarioSteps, summarizeScenarioDiff } from './scenario-version-diff'\n\nconst crypto = require('crypto')\n\n@Resolver(Scenario)\nexport class ScenarioMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, { description: 'Creates a new scenario.' })\n async createScenario(\n @Arg('scenario', type => NewScenario) scenario: NewScenario,\n @Ctx() context: ResolverContext\n ): Promise<Scenario> {\n const { domain, user, tx } = context.state\n\n return await tx.getRepository(Scenario).save({\n ...scenario,\n domain,\n creator: user,\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, { description: 'Updates an existing scenario.' })\n async updateScenario(\n @Arg('name') name: string,\n @Arg('patch', type => ScenarioPatch) patch: ScenarioPatch,\n @Ctx() context: ResolverContext\n ): Promise<Scenario> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository(Scenario)\n const scenario = await repository.findOne({\n where: { domain: { id: domain.id }, name }\n })\n\n if (!scenario) {\n throw new Error(\n context.t('error.scenario not found', {\n scenario: name\n })\n )\n }\n\n return await repository.save({\n ...scenario,\n ...patch,\n // 콘텐츠 편집 → draft 로 표시(재릴리즈 필요). 스케줄 mutation 등은 이 경로를 타지 않음.\n publishState: 'draft',\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [Scenario], {\n description: 'Updates multiple scenarios at once. Can be used to create or update records.'\n })\n async updateMultipleScenario(\n @Arg('patches', type => [ScenarioPatch]) patches: ScenarioPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Scenario[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const scenarioRepo = tx.getRepository(Scenario)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await scenarioRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const newRecord = _updateRecords[i]\n const scenario = await scenarioRepo.findOneBy({ id: newRecord.id })\n\n if (!scenario) {\n throw new Error(`Scenario '${newRecord.id}' not found`)\n }\n\n // Inheritance read-only 가드 — 다른 도메인 소유 scenario 의 row 직접 update 차단.\n // 자식이 부모 scenario.id 로 patch 보내면 upsert 가 부모 row 변경할 위험.\n // 자식별 변경은 copyScenarios 로 자기 도메인 사본 생성 후 수정.\n if (scenario.domainId !== domain.id) {\n throw new Error(\n `Cannot modify inherited scenario '${scenario.name}' (owned by another domain). ` +\n `Use copyScenarios to clone into current domain first, or modify step params via EnvVar override on useDomainAttribute fields.`\n )\n }\n\n const result = await scenarioRepo.save({\n ...scenario,\n ...newRecord,\n publishState: 'draft',\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'Deletes a single scenario by its name.' })\n async deleteScenario(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Scenario).delete({ domain: { id: domain.id }, name })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'Deletes multiple scenarios by their IDs.' })\n async deleteScenarios(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Scenario).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, {\n description:\n 'Imports multiple scenarios, including their steps. This can overwrite existing scenarios if IDs match.'\n })\n async importScenarios(\n @Arg('scenarios', type => [ScenarioPatch]) scenarios: Scenario[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { tx, domain, user } = context.state\n\n const repository = tx.getRepository(Scenario)\n\n await Promise.all(\n scenarios.map(async (scenario: Scenario) => {\n const { id, name } = scenario\n var savedScenario\n\n if (id) {\n const sameId = await repository.findOneBy({ id })\n\n if (sameId) {\n if (sameId.domainId != domain.id) {\n throw `Scenario with id '${id}:${name}' is already taken by another domain`\n }\n\n const sameName = await repository.findOneBy({ domain: { id: domain.id }, name })\n if (sameName && sameName.id != id) {\n throw `Scenario Name '${name}' is already taken by another scenario`\n }\n\n savedScenario = await repository.save({\n ...sameId,\n ...scenario,\n domain,\n updater: user\n })\n } else {\n savedScenario = await repository.save({\n ...scenario,\n domain,\n updater: user,\n creator: user\n })\n }\n } else {\n savedScenario = await repository.save({\n ...scenario,\n domain,\n updater: user,\n creator: user\n })\n }\n\n // [버전관리 / Option A] steps 는 Scenario.steps(JSON) 컬럼에 기록(별도 Step 행 생성 없음).\n // 가져온 시나리오는 draft 작업본으로 취급한다.\n const importedSteps = (scenario.steps || []).map((step: any, i: number) => ({\n id: step.id || crypto.randomUUID(),\n name: step.name,\n description: step.description,\n sequence: step.sequence ?? i,\n task: step.task,\n skip: step.skip,\n log: step.log,\n connection: step.connection,\n params: step.params,\n result: step.result\n }))\n\n savedScenario.steps = importedSteps\n savedScenario.publishState = 'draft'\n await repository.save(savedScenario)\n\n // [전환기 dual-write] 구버전 롤백 대비 Step 테이블도 동기화.\n await syncLegacyStepTable(savedScenario, importedSteps, { domain, user }, tx)\n })\n )\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [Scenario], {\n description: 'Copies multiple existing scenarios within the same domain, creating new scenarios with new IDs.'\n })\n async copyScenarios(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<Scenario[]> {\n const { domain, user, tx } = context.state\n\n const originals = await tx.getRepository(Scenario).find({\n where: {\n id: In(ids),\n domain: { id: domain.id }\n },\n relations: ['domain']\n })\n\n if (originals.length == 0) {\n return []\n }\n\n // [버전관리 / Option A] steps 는 Scenario.steps(JSON) 컬럼으로 복사한다(별도 Step 행 생성 없음).\n // 사본은 항상 draft(version 0) 로 시작한다.\n const newCopys = []\n for (const scenario of originals) {\n const scenarioId = crypto.randomUUID()\n const srcSteps = await resolveScenarioSteps(scenario, tx)\n const steps = srcSteps.map(step => ({ ...step, id: crypto.randomUUID() }))\n\n newCopys.push({\n id: scenarioId,\n name: scenario.name + ' (' + scenarioId + ')',\n type: scenario.type,\n description: scenario.description,\n active: false,\n schedule: scenario.schedule,\n timezone: scenario.timezone,\n steps,\n publishState: 'draft',\n version: 0,\n\n domain,\n creator: user,\n updater: user\n })\n }\n\n const copied = await tx.getRepository(Scenario).save(newCopys)\n\n // [전환기 dual-write] 구버전 롤백 대비 각 사본의 Step 테이블도 동기화.\n for (const scenario of copied) {\n await syncLegacyStepTable(scenario, scenario.steps as any[], { domain, user }, tx)\n }\n\n return copied\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, { description: 'Starts the schedule for a specific scenario, if one is defined.' })\n async startScenarioSchedule(\n @Arg('scenarioId') scenarioId: string,\n @Ctx() context: ResolverContext\n ): Promise<Scenario> {\n const { domain, user, tx } = context.state\n\n var repository = tx.getRepository(Scenario)\n var scenario = await repository.findOne({\n where: { domain: { id: domain.id }, id: scenarioId }\n })\n\n if (!scenario) {\n throw new Error(\n context.t('error.scenario not found', {\n scenario: scenarioId\n })\n )\n }\n\n if (!scenario.schedule) {\n throw new Error(\n context.t('error.schedule is not set', {\n scenario: scenario.name\n })\n )\n }\n\n if (!scenario.timezone) {\n throw new Error(\n context.t('error.timezone is not set', {\n scenario: scenario.name\n })\n )\n }\n\n try {\n var handle = await registerSchedule({\n name: scenario.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'scenario',\n key: scenario.id,\n operation: 'start'\n },\n type: 'cron',\n schedule: scenario.schedule,\n timezone: scenario.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${getCallbackBaseWithDomainContext(domain)}/callback-schedule-for-scenario`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n userId: user.id,\n scenarioId\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: -1,\n retry_period: 60\n }\n })\n\n return await repository.save({\n ...scenario,\n scheduleId: handle\n })\n } catch (err) {\n console.error('startScenarioSchedule', err)\n }\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, { description: 'Stops the schedule for a specific scenario.' })\n async stopScenarioSchedule(\n @Arg('scenarioId') scenarioId: string,\n @Ctx() context: ResolverContext\n ): Promise<Scenario | undefined> {\n const { domain, tx } = context.state\n\n var repository = tx.getRepository(Scenario)\n var scenario = await repository.findOne({\n where: { domain: { id: domain.id }, id: scenarioId }\n })\n\n if (!scenario) {\n throw new Error(\n context.t('error.scenario not found', {\n scenario: scenarioId\n })\n )\n }\n\n try {\n await unregisterSchedule(scenario.scheduleId)\n\n return await repository.save({\n ...scenario,\n scheduleId: null\n })\n } catch (err) {\n console.error('stopScenarioSchedule', err)\n }\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, {\n description:\n 'Releases (publishes) a scenario, creating an immutable version snapshot. ' +\n 'Operational execution (schedule/auto-start) runs the latest released version.'\n })\n async releaseScenario(\n @Arg('id') id: string,\n @Ctx() context: ResolverContext,\n @Arg('comment', { nullable: true }) comment?: string\n ): Promise<Scenario> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository(Scenario)\n // relations 로드 — 스냅샷(ScenarioHistory)이 domain/creator/role 을 담아야 함.\n // 특히 domain 이 null 이면 scenarioVersions 의 domain 필터에 걸리지 않아 이력이 안 보인다.\n const scenario = await repository.findOne({\n where: { domain: { id: domain.id }, id },\n relations: ['domain', 'creator', 'role']\n })\n\n if (!scenario) {\n throw new Error(context.t('error.scenario not found', { scenario: id }))\n }\n\n // 이미 released 상태(편집 없음)면 새 버전을 만들 이유가 없음 — 보드와 동일 규율.\n if (scenario.publishState === 'released') {\n throw new Error(`Scenario '${scenario.name}' is already released. Edit the draft before releasing a new version.`)\n }\n\n // 스냅샷에 담을 steps 확보(하위호환: JSON 없으면 레거시 Step 테이블에서). 동시에 draft JSON 자연 이관.\n const steps = await resolveScenarioSteps(scenario, tx)\n\n // 다음 버전 번호 = 기존 히스토리 최대 + 1\n const maxHistory = await tx\n .getRepository(ScenarioHistory)\n .createQueryBuilder('history')\n .select('MAX(history.version)', 'max')\n .where('history.originalId = :id', { id })\n .getRawOne()\n const nextVersion = maxHistory?.max ? Number(maxHistory.max) + 1 : 1\n\n // 코멘트 미제공 시 diff 요약으로 자동 초기값 생성(직전 릴리즈 대비, 최초 릴리즈는 빈 기준).\n let releaseComment = comment\n if (releaseComment === undefined || releaseComment === null) {\n const prev = await getLatestReleasedHistory(scenario, tx)\n const fieldDiffs = diffScenarioMeta(prev || {}, { ...scenario, steps })\n const stepDiffs = diffScenarioSteps((prev?.steps as any[]) || [], steps)\n releaseComment = summarizeScenarioDiff(fieldDiffs, stepDiffs)\n }\n\n // publishState='released' 저장 → ScenarioHistoryEntitySubscriber 가 스냅샷 생성(comment 포함).\n // domain 을 명시(보드 releaseBoard 와 동일) — 스냅샷 domain 이 null 이 되지 않도록.\n const released = await repository.save({\n ...scenario,\n domain,\n steps,\n version: nextVersion,\n publishState: 'released',\n updater: user,\n __releaseComment: releaseComment\n } as any)\n\n return released\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, {\n description:\n 'Reverts a scenario to a released version by copying that version into the current draft. ' +\n 'The past version remains as an archive; this does not create a new version.'\n })\n async revertScenarioVersion(\n @Arg('id') id: string,\n @Arg('version', type => Int) version: number,\n @Ctx() context: ResolverContext\n ): Promise<Scenario> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository(Scenario)\n const scenario = await repository.findOne({ where: { domain: { id: domain.id }, id } })\n\n if (!scenario) {\n throw new Error(context.t('error.scenario not found', { scenario: id }))\n }\n\n const history = await tx.getRepository(ScenarioHistory).findOne({\n where: { originalId: id, version }\n })\n\n if (!history) {\n throw new Error(`Scenario version (${id}:${version}) is not found`)\n }\n\n // 과거 버전을 최신 드래프트로 복사 — 편집 가능한 draft 상태로.\n const reverted = await repository.save({\n ...scenario,\n description: history.description,\n type: history.type,\n schedule: history.schedule,\n timezone: history.timezone,\n ttl: history.ttl,\n iteration: history.iteration,\n privilege: history.privilege,\n steps: history.steps,\n publishState: 'draft',\n updater: user\n } as any)\n\n // [전환기 dual-write] 구버전 롤백 대비 Step 테이블도 복원된 draft 로 동기화.\n await syncLegacyStepTable(reverted, (history.steps as any[]) || [], { domain, user }, tx)\n\n return reverted\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"scenario-mutation.js","sourceRoot":"","sources":["../../../server/service/scenario/scenario-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Int, Mutation, Resolver, UseMiddleware } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport {\n Application,\n getCallbackBaseWithDomainContext,\n registerSchedule,\n unregisterSchedule\n} from '@things-factory/scheduler-client'\nimport { Refusal, SpeakRefusals } from '@things-factory/shell'\n\nimport { Scenario } from './scenario'\nimport { ScenarioHistory } from './scenario-history'\nimport { NewScenario, ScenarioPatch } from './scenario-type'\nimport { resolveScenarioSteps, getLatestReleasedHistory, syncLegacyStepTable } from './resolve-steps'\nimport { diffScenarioMeta, diffScenarioSteps, summarizeScenarioDiff } from './scenario-version-diff'\n\nconst crypto = require('crypto')\n\n@Resolver(Scenario)\n@UseMiddleware(SpeakRefusals)\nexport class ScenarioMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, { description: 'Creates a new scenario.' })\n async createScenario(\n @Arg('scenario', type => NewScenario) scenario: NewScenario,\n @Ctx() context: ResolverContext\n ): Promise<Scenario> {\n const { domain, user, tx } = context.state\n\n return await tx.getRepository(Scenario).save({\n ...scenario,\n domain,\n creator: user,\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, { description: 'Updates an existing scenario.' })\n async updateScenario(\n @Arg('name') name: string,\n @Arg('patch', type => ScenarioPatch) patch: ScenarioPatch,\n @Ctx() context: ResolverContext\n ): Promise<Scenario> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository(Scenario)\n const scenario = await repository.findOne({\n where: { domain: { id: domain.id }, name }\n })\n\n if (!scenario) {\n throw new Error(\n context.t('error.scenario not found', {\n scenario: name\n })\n )\n }\n\n return await repository.save({\n ...scenario,\n ...patch,\n // 콘텐츠 편집 → draft 로 표시(재릴리즈 필요). 스케줄 mutation 등은 이 경로를 타지 않음.\n publishState: 'draft',\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [Scenario], {\n description: 'Updates multiple scenarios at once. Can be used to create or update records.'\n })\n async updateMultipleScenario(\n @Arg('patches', type => [ScenarioPatch]) patches: ScenarioPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Scenario[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const scenarioRepo = tx.getRepository(Scenario)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await scenarioRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const newRecord = _updateRecords[i]\n const scenario = await scenarioRepo.findOneBy({ id: newRecord.id })\n\n if (!scenario) {\n throw new Error(`Scenario '${newRecord.id}' not found`)\n }\n\n // Inheritance read-only 가드 — 다른 도메인 소유 scenario 의 row 직접 update 차단.\n // 자식이 부모 scenario.id 로 patch 보내면 upsert 가 부모 row 변경할 위험.\n // 자식별 변경은 copyScenarios 로 자기 도메인 사본 생성 후 수정.\n if (scenario.domainId !== domain.id) {\n throw new Error(\n `Cannot modify inherited scenario '${scenario.name}' (owned by another domain). ` +\n `Use copyScenarios to clone into current domain first, or modify step params via EnvVar override on useDomainAttribute fields.`\n )\n }\n\n const result = await scenarioRepo.save({\n ...scenario,\n ...newRecord,\n publishState: 'draft',\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'Deletes a single scenario by its name.' })\n async deleteScenario(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Scenario).delete({ domain: { id: domain.id }, name })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'Deletes multiple scenarios by their IDs.' })\n async deleteScenarios(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Scenario).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, {\n description:\n 'Imports multiple scenarios, including their steps. This can overwrite existing scenarios if IDs match.'\n })\n async importScenarios(\n @Arg('scenarios', type => [ScenarioPatch]) scenarios: Scenario[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { tx, domain, user } = context.state\n\n const repository = tx.getRepository(Scenario)\n\n await Promise.all(\n scenarios.map(async (scenario: Scenario) => {\n const { id, name } = scenario\n var savedScenario\n\n if (id) {\n const sameId = await repository.findOneBy({ id })\n\n if (sameId) {\n if (sameId.domainId != domain.id) {\n throw `Scenario with id '${id}:${name}' is already taken by another domain`\n }\n\n const sameName = await repository.findOneBy({ domain: { id: domain.id }, name })\n if (sameName && sameName.id != id) {\n throw `Scenario Name '${name}' is already taken by another scenario`\n }\n\n savedScenario = await repository.save({\n ...sameId,\n ...scenario,\n domain,\n updater: user\n })\n } else {\n savedScenario = await repository.save({\n ...scenario,\n domain,\n updater: user,\n creator: user\n })\n }\n } else {\n savedScenario = await repository.save({\n ...scenario,\n domain,\n updater: user,\n creator: user\n })\n }\n\n // [버전관리 / Option A] steps 는 Scenario.steps(JSON) 컬럼에 기록(별도 Step 행 생성 없음).\n // 가져온 시나리오는 draft 작업본으로 취급한다.\n const importedSteps = (scenario.steps || []).map((step: any, i: number) => ({\n id: step.id || crypto.randomUUID(),\n name: step.name,\n description: step.description,\n sequence: step.sequence ?? i,\n task: step.task,\n skip: step.skip,\n log: step.log,\n connection: step.connection,\n params: step.params,\n result: step.result\n }))\n\n savedScenario.steps = importedSteps\n savedScenario.publishState = 'draft'\n await repository.save(savedScenario)\n\n // [전환기 dual-write] 구버전 롤백 대비 Step 테이블도 동기화.\n await syncLegacyStepTable(savedScenario, importedSteps, { domain, user }, tx)\n })\n )\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [Scenario], {\n description: 'Copies multiple existing scenarios within the same domain, creating new scenarios with new IDs.'\n })\n async copyScenarios(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<Scenario[]> {\n const { domain, user, tx } = context.state\n\n const originals = await tx.getRepository(Scenario).find({\n where: {\n id: In(ids),\n domain: { id: domain.id }\n },\n relations: ['domain']\n })\n\n if (originals.length == 0) {\n return []\n }\n\n // [버전관리 / Option A] steps 는 Scenario.steps(JSON) 컬럼으로 복사한다(별도 Step 행 생성 없음).\n // 사본은 항상 draft(version 0) 로 시작한다.\n const newCopys = []\n for (const scenario of originals) {\n const scenarioId = crypto.randomUUID()\n const srcSteps = await resolveScenarioSteps(scenario, tx)\n const steps = srcSteps.map(step => ({ ...step, id: crypto.randomUUID() }))\n\n newCopys.push({\n id: scenarioId,\n name: scenario.name + ' (' + scenarioId + ')',\n type: scenario.type,\n description: scenario.description,\n active: false,\n schedule: scenario.schedule,\n timezone: scenario.timezone,\n steps,\n publishState: 'draft',\n version: 0,\n\n domain,\n creator: user,\n updater: user\n })\n }\n\n const copied = await tx.getRepository(Scenario).save(newCopys)\n\n // [전환기 dual-write] 구버전 롤백 대비 각 사본의 Step 테이블도 동기화.\n for (const scenario of copied) {\n await syncLegacyStepTable(scenario, scenario.steps as any[], { domain, user }, tx)\n }\n\n return copied\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, { description: 'Starts the schedule for a specific scenario, if one is defined.' })\n async startScenarioSchedule(\n @Arg('scenarioId') scenarioId: string,\n @Ctx() context: ResolverContext\n ): Promise<Scenario> {\n const { domain, user, tx } = context.state\n\n var repository = tx.getRepository(Scenario)\n var scenario = await repository.findOne({\n where: { domain: { id: domain.id }, id: scenarioId }\n })\n\n if (!scenario) {\n throw new Error(\n context.t('error.scenario not found', {\n scenario: scenarioId\n })\n )\n }\n\n if (!scenario.schedule) {\n throw new Error(\n context.t('error.schedule is not set', {\n scenario: scenario.name\n })\n )\n }\n\n if (!scenario.timezone) {\n throw new Error(\n context.t('error.timezone is not set', {\n scenario: scenario.name\n })\n )\n }\n\n try {\n var handle = await registerSchedule({\n name: scenario.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'scenario',\n key: scenario.id,\n operation: 'start'\n },\n type: 'cron',\n schedule: scenario.schedule,\n timezone: scenario.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${getCallbackBaseWithDomainContext(domain)}/callback-schedule-for-scenario`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n userId: user.id,\n scenarioId\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: -1,\n retry_period: 60\n }\n })\n\n /*\n * registerSchedule answers nothing when the scheduler did not take it (it logs and returns). A schedule nobody holds\n * was saved as started with no id - said here instead (the user, 2026-10-31).\n */\n if (!handle) {\n throw new Refusal('scenario-schedule-not-registered', { scenario: scenario.name }, `The scheduler did not take the schedule of '${scenario.name}'.`)\n }\n\n return await repository.save({\n ...scenario,\n scheduleId: handle\n })\n } catch (err) {\n console.error('startScenarioSchedule', err)\n throw err\n }\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, { description: 'Stops the schedule for a specific scenario.' })\n async stopScenarioSchedule(\n @Arg('scenarioId') scenarioId: string,\n @Ctx() context: ResolverContext\n ): Promise<Scenario | undefined> {\n const { domain, tx } = context.state\n\n var repository = tx.getRepository(Scenario)\n var scenario = await repository.findOne({\n where: { domain: { id: domain.id }, id: scenarioId }\n })\n\n if (!scenario) {\n throw new Error(\n context.t('error.scenario not found', {\n scenario: scenarioId\n })\n )\n }\n\n try {\n await unregisterSchedule(scenario.scheduleId)\n\n return await repository.save({\n ...scenario,\n scheduleId: null\n })\n } catch (err) {\n console.error('stopScenarioSchedule', err)\n }\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, {\n description:\n 'Releases (publishes) a scenario, creating an immutable version snapshot. ' +\n 'Operational execution (schedule/auto-start) runs the latest released version.'\n })\n async releaseScenario(\n @Arg('id') id: string,\n @Ctx() context: ResolverContext,\n @Arg('comment', { nullable: true }) comment?: string\n ): Promise<Scenario> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository(Scenario)\n // relations 로드 — 스냅샷(ScenarioHistory)이 domain/creator/role 을 담아야 함.\n // 특히 domain 이 null 이면 scenarioVersions 의 domain 필터에 걸리지 않아 이력이 안 보인다.\n const scenario = await repository.findOne({\n where: { domain: { id: domain.id }, id },\n relations: ['domain', 'creator', 'role']\n })\n\n if (!scenario) {\n throw new Error(context.t('error.scenario not found', { scenario: id }))\n }\n\n // 이미 released 상태(편집 없음)면 새 버전을 만들 이유가 없음 — 보드와 동일 규율.\n if (scenario.publishState === 'released') {\n throw new Error(`Scenario '${scenario.name}' is already released. Edit the draft before releasing a new version.`)\n }\n\n // 스냅샷에 담을 steps 확보(하위호환: JSON 없으면 레거시 Step 테이블에서). 동시에 draft JSON 자연 이관.\n const steps = await resolveScenarioSteps(scenario, tx)\n\n // 다음 버전 번호 = 기존 히스토리 최대 + 1\n const maxHistory = await tx\n .getRepository(ScenarioHistory)\n .createQueryBuilder('history')\n .select('MAX(history.version)', 'max')\n .where('history.originalId = :id', { id })\n .getRawOne()\n const nextVersion = maxHistory?.max ? Number(maxHistory.max) + 1 : 1\n\n // 코멘트 미제공 시 diff 요약으로 자동 초기값 생성(직전 릴리즈 대비, 최초 릴리즈는 빈 기준).\n let releaseComment = comment\n if (releaseComment === undefined || releaseComment === null) {\n const prev = await getLatestReleasedHistory(scenario, tx)\n const fieldDiffs = diffScenarioMeta(prev || {}, { ...scenario, steps })\n const stepDiffs = diffScenarioSteps((prev?.steps as any[]) || [], steps)\n releaseComment = summarizeScenarioDiff(fieldDiffs, stepDiffs)\n }\n\n // publishState='released' 저장 → ScenarioHistoryEntitySubscriber 가 스냅샷 생성(comment 포함).\n // domain 을 명시(보드 releaseBoard 와 동일) — 스냅샷 domain 이 null 이 되지 않도록.\n const released = await repository.save({\n ...scenario,\n domain,\n steps,\n version: nextVersion,\n publishState: 'released',\n updater: user,\n __releaseComment: releaseComment\n } as any)\n\n return released\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"scenario\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Scenario, {\n description:\n 'Reverts a scenario to a released version by copying that version into the current draft. ' +\n 'The past version remains as an archive; this does not create a new version.'\n })\n async revertScenarioVersion(\n @Arg('id') id: string,\n @Arg('version', type => Int) version: number,\n @Ctx() context: ResolverContext\n ): Promise<Scenario> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository(Scenario)\n const scenario = await repository.findOne({ where: { domain: { id: domain.id }, id } })\n\n if (!scenario) {\n throw new Error(context.t('error.scenario not found', { scenario: id }))\n }\n\n const history = await tx.getRepository(ScenarioHistory).findOne({\n where: { originalId: id, version }\n })\n\n if (!history) {\n throw new Error(`Scenario version (${id}:${version}) is not found`)\n }\n\n // 과거 버전을 최신 드래프트로 복사 — 편집 가능한 draft 상태로.\n const reverted = await repository.save({\n ...scenario,\n description: history.description,\n type: history.type,\n schedule: history.schedule,\n timezone: history.timezone,\n ttl: history.ttl,\n iteration: history.iteration,\n privilege: history.privilege,\n steps: history.steps,\n publishState: 'draft',\n updater: user\n } as any)\n\n // [전환기 dual-write] 구버전 롤백 대비 Step 테이블도 복원된 draft 로 동기화.\n await syncLegacyStepTable(reverted, (history.steps as any[]) || [], { domain, user }, tx)\n\n return reverted\n }\n}\n"]}
|
|
@@ -56,6 +56,7 @@ tslib_1.__decorate([
|
|
|
56
56
|
tslib_1.__metadata("design:returntype", Promise)
|
|
57
57
|
], ScenarioInstanceMutation.prototype, "stopScenario", null);
|
|
58
58
|
exports.ScenarioInstanceMutation = ScenarioInstanceMutation = tslib_1.__decorate([
|
|
59
|
-
(0, type_graphql_1.Resolver)(scenario_instance_type_1.ScenarioInstance)
|
|
59
|
+
(0, type_graphql_1.Resolver)(scenario_instance_type_1.ScenarioInstance),
|
|
60
|
+
(0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
|
|
60
61
|
], ScenarioInstanceMutation);
|
|
61
62
|
//# sourceMappingURL=scenario-instance-mutation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-instance-mutation.js","sourceRoot":"","sources":["../../../server/service/scenario-instance/scenario-instance-mutation.ts"],"names":[],"mappings":";;;;AAAA,+
|
|
1
|
+
{"version":3,"file":"scenario-instance-mutation.js","sourceRoot":"","sources":["../../../server/service/scenario-instance/scenario-instance-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAA0E;AAE1E,iDAAmE;AAEnE,qEAAmH;AAEnH,+EAI8C;AAIvC,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAI7B,AAAN,KAAK,CAAC,WAAW,CAC0B,YAAoB,EACxC,YAAoB,EACmB,SAAc,EACnE,OAAwB,EAE/B,IAAa;QAEb,OAAO,MAAM,IAAA,iCAAqB,EAChC,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CACxC,CAAA;IACH,CAAC;IAKK,AAAN,KAAK,CAAC,aAAa,CACwB,YAAoB,EACxC,YAAoB,EACmB,SAAc,EACnE,OAAwB,EAE/B,IAAa;QAEb,OAAO,MAAM,IAAA,mCAAuB,EAClC,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CACxC,CAAA;IACH,CAAC;IAMK,AAAN,KAAK,CAAC,YAAY,CACyB,YAAoB,EACtD,OAAwB;QAE/B,OAAO,MAAM,IAAA,kCAAsB,EAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAC5D,CAAC;CACF,CAAA;AAnDY,4DAAwB;AAI7B;IAHL,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,kDAAyB,EAAE;QAC9C,WAAW,EAAE,6EAA6E;KAC3F,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,mBAAA,IAAA,kBAAG,EAAC,cAAc,CAAC,CAAA;IACnB,mBAAA,IAAA,kBAAG,EAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1D,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC,CAAA;;;;2DAU9G;AAKK;IAHL,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,oDAA2B,EAAE;QAChD,WAAW,EAAE,mEAAmE;KACjF,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,mBAAA,IAAA,kBAAG,EAAC,cAAc,CAAC,CAAA;IACnB,mBAAA,IAAA,kBAAG,EAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1D,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC,CAAA;;;;6DAU9G;AAMK;IAJL,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,yCAAgB,EAAE;QACrC,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,gDAAgD;KAC9D,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;4DAGP;mCAlDU,wBAAwB;IAFpC,IAAA,uBAAQ,EAAC,yCAAgB,CAAC;IAC1B,IAAA,4BAAa,EAAC,qBAAa,CAAC;GAChB,wBAAwB,CAmDpC","sourcesContent":["import { Arg, Ctx, Mutation, Resolver, UseMiddleware } from 'type-graphql'\n\nimport { ScalarObject, SpeakRefusals } from '@things-factory/shell'\n\nimport { ScenarioInstance, ScenarioInstanceRunResult, ScenarioInstanceStartResult } from './scenario-instance-type'\n\nimport {\n runScenario as controllerRunScenario,\n startScenario as controllerStartScenario,\n stopScenario as controllerStopScenario\n} from '../../controllers/scenario-controller'\n\n@Resolver(ScenarioInstance)\n@UseMiddleware(SpeakRefusals)\nexport class ScenarioInstanceMutation {\n @Mutation(returns => ScenarioInstanceRunResult, {\n description: 'Runs a new scenario instance once and returns the result after it finishes.'\n })\n async runScenario(\n @Arg('instanceName', { nullable: true }) instanceName: string,\n @Arg('scenarioName') scenarioName: string,\n @Arg('variables', type => ScalarObject, { nullable: true }) variables: any,\n @Ctx() context: ResolverContext,\n @Arg('mode', { nullable: true, description: \"Version to run: 'released' (default) or 'draft' (debugging).\" })\n mode?: string\n ): Promise<ScenarioInstanceRunResult> {\n return await controllerRunScenario(\n instanceName,\n scenarioName,\n variables,\n context,\n mode === 'draft' ? 'draft' : 'released'\n )\n }\n\n @Mutation(returns => ScenarioInstanceStartResult, {\n description: 'Starts a new scenario instance, which will run in the background.'\n })\n async startScenario(\n @Arg('instanceName', { nullable: true }) instanceName: string,\n @Arg('scenarioName') scenarioName: string,\n @Arg('variables', type => ScalarObject, { nullable: true }) variables: any,\n @Ctx() context: ResolverContext,\n @Arg('mode', { nullable: true, description: \"Version to run: 'released' (default) or 'draft' (debugging).\" })\n mode?: string\n ): Promise<ScenarioInstanceStartResult> {\n return await controllerStartScenario(\n instanceName,\n scenarioName,\n variables,\n context,\n mode === 'draft' ? 'draft' : 'released'\n )\n }\n\n @Mutation(returns => ScenarioInstance, {\n nullable: true,\n description: 'Stops a running scenario instance by its name.'\n })\n async stopScenario(\n @Arg('instanceName', { nullable: true }) instanceName: string,\n @Ctx() context: ResolverContext\n ): Promise<ScenarioInstance | undefined> {\n return await controllerStopScenario(instanceName, context)\n }\n}\n"]}
|