From b47338b50c5227838d0ad329b480dee26f39b075 Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Fri, 20 Sep 2024 15:41:09 +0300 Subject: [PATCH] chore(server): automate IoC 12 - createTestAutomationRunFactory --- .../modules/automate/domain/operations.ts | 8 +++ .../automate/graph/resolvers/automate.ts | 14 ++-- packages/server/modules/automate/index.ts | 8 ++- .../automate/repositories/automations.ts | 65 ++++++++++--------- .../modules/automate/services/trigger.ts | 29 ++++----- .../modules/automate/tests/trigger.spec.ts | 18 +++-- packages/server/modules/core/loaders.ts | 3 +- 7 files changed, 86 insertions(+), 59 deletions(-) diff --git a/packages/server/modules/automate/domain/operations.ts b/packages/server/modules/automate/domain/operations.ts index 83423db24..85a2dc1df 100644 --- a/packages/server/modules/automate/domain/operations.ts +++ b/packages/server/modules/automate/domain/operations.ts @@ -120,6 +120,14 @@ export type GetAutomationTriggerDefinitions = < triggerType?: T }) => Promise & { automationId: string }>> +export type GetLatestAutomationRevisions = (params: { + automationIds: string[] +}) => Promise<{ [automationId: string]: AutomationRevisionRecord }> + +export type GetLatestAutomationRevision = (params: { + automationId: string +}) => Promise> + export type CreateStoredAuthCode = ( params: Omit ) => Promise diff --git a/packages/server/modules/automate/graph/resolvers/automate.ts b/packages/server/modules/automate/graph/resolvers/automate.ts index 448eb7b8a..42c029146 100644 --- a/packages/server/modules/automate/graph/resolvers/automate.ts +++ b/packages/server/modules/automate/graph/resolvers/automate.ts @@ -18,7 +18,7 @@ import { getAutomationTriggerDefinitionsFactory, getFullAutomationRevisionMetadataFactory, getFunctionRunFactory, - getLatestAutomationRevision, + getLatestAutomationRevisionFactory, getLatestVersionAutomationRunsFactory, getProjectAutomationsItems, getProjectAutomationsTotalCount, @@ -63,7 +63,7 @@ import { getBranchesByIds } from '@/modules/core/repositories/branches' import { - createTestAutomationRun, + createTestAutomationRunFactory, manuallyTriggerAutomationFactory, triggerAutomationRevisionRunFactory } from '@/modules/automate/services/trigger' @@ -126,6 +126,7 @@ const getFullAutomationRevisionMetadata = getFullAutomationRevisionMetadataFacto const getAutomationToken = getAutomationTokenFactory({ db }) const upsertAutomationRun = upsertAutomationRunFactory({ db }) const getAutomationTriggerDefinitions = getAutomationTriggerDefinitionsFactory({ db }) +const getLatestAutomationRevision = getLatestAutomationRevisionFactory({ db }) export = (FF_AUTOMATE_MODULE_ENABLED ? { @@ -546,7 +547,8 @@ export = (FF_AUTOMATE_MODULE_ENABLED createAppToken, automateRunsEmitter: AutomateRunsEmitter.emit, getAutomationToken, - upsertAutomationRun + upsertAutomationRun, + getFullAutomationRevisionMetadata }), validateStreamAccess }) @@ -578,7 +580,7 @@ export = (FF_AUTOMATE_MODULE_ENABLED }) }, async createTestAutomationRun(parent, { automationId }, ctx) { - const create = createTestAutomationRun({ + const create = createTestAutomationRunFactory({ getEncryptionKeyPairFor, getFunctionInputDecryptor: getFunctionInputDecryptorFactory({ buildDecryptor @@ -586,7 +588,9 @@ export = (FF_AUTOMATE_MODULE_ENABLED getAutomation, getLatestAutomationRevision, getFullAutomationRevisionMetadata, - upsertAutomationRun + upsertAutomationRun, + getBranchLatestCommits, + validateStreamAccess }) return await create({ diff --git a/packages/server/modules/automate/index.ts b/packages/server/modules/automate/index.ts index 016566108..6a5cc727d 100644 --- a/packages/server/modules/automate/index.ts +++ b/packages/server/modules/automate/index.ts @@ -70,6 +70,9 @@ async function initScopes() { const initializeEventListeners = () => { const getAutomationRunFullTriggers = getAutomationRunFullTriggersFactory({ db }) + const getFullAutomationRevisionMetadata = getFullAutomationRevisionMetadataFactory({ + db + }) const triggerFn = triggerAutomationRevisionRunFactory({ automateRunTrigger: triggerAutomationRun, @@ -80,7 +83,8 @@ const initializeEventListeners = () => { createAppToken, automateRunsEmitter: AutomateRunsEmitter.emit, getAutomationToken: getAutomationTokenFactory({ db }), - upsertAutomationRun: upsertAutomationRunFactory({ db }) + upsertAutomationRun: upsertAutomationRunFactory({ db }), + getFullAutomationRevisionMetadata }) const setupStatusUpdateSubscriptionsInvoke = setupStatusUpdateSubscriptionsFactory({ getAutomationRunFullTriggers, @@ -93,7 +97,7 @@ const initializeEventListeners = () => { publish }) const setupRunFinishedTrackingInvoke = setupRunFinishedTrackingFactory({ - getFullAutomationRevisionMetadata: getFullAutomationRevisionMetadataFactory({ db }), + getFullAutomationRevisionMetadata, getUserById, getCommit, getFullAutomationRunById: getFullAutomationRunByIdFactory({ db }), diff --git a/packages/server/modules/automate/repositories/automations.ts b/packages/server/modules/automate/repositories/automations.ts index 8fde5c52e..f4a2de7cd 100644 --- a/packages/server/modules/automate/repositories/automations.ts +++ b/packages/server/modules/automate/repositories/automations.ts @@ -10,6 +10,8 @@ import { GetFullAutomationRevisionMetadata, GetFullAutomationRunById, GetFunctionRun, + GetLatestAutomationRevision, + GetLatestAutomationRevisions, GetLatestVersionAutomationRuns, StoreAutomation, StoreAutomationRevision, @@ -593,42 +595,45 @@ export const getAutomationRevisionFactory = return (revisions[0] || null) as Nullable<(typeof revisions)[0]> } -export async function getLatestAutomationRevisions(params: { - automationIds: string[] -}) { - const { automationIds } = params - if (!automationIds.length) return {} +export const getLatestAutomationRevisionsFactory = + (deps: { db: Knex }): GetLatestAutomationRevisions => + async (params: { automationIds: string[] }) => { + const { automationIds } = params + if (!automationIds.length) return {} - const innerQ = AutomationRevisions.knex() - .select([ - AutomationRevisions.col.automationId, - knex.raw('max(??) as ??', [AutomationRevisions.col.createdAt, 'maxCreatedAt']) - ]) - .whereIn(AutomationRevisions.col.automationId, automationIds) - .andWhere(AutomationRevisions.col.active, true) - .groupBy(AutomationRevisions.col.automationId) + const innerQ = tables + .automationRevisions(deps.db) + .select([ + AutomationRevisions.col.automationId, + knex.raw('max(??) as ??', [AutomationRevisions.col.createdAt, 'maxCreatedAt']) + ]) + .whereIn(AutomationRevisions.col.automationId, automationIds) + .andWhere(AutomationRevisions.col.active, true) + .groupBy(AutomationRevisions.col.automationId) - const outerQ = AutomationRevisions.knex().innerJoin( - innerQ.as('q1'), - function () { - this.on(AutomationRevisions.col.automationId, '=', 'q1.automationId') - this.andOn(AutomationRevisions.col.createdAt, '=', 'q1.maxCreatedAt') - } - ) + const outerQ = tables + .automationRevisions(deps.db) + .select('*') + .innerJoin(innerQ.as('q1'), function () { + this.on(AutomationRevisions.col.automationId, '=', 'q1.automationId') + this.andOn(AutomationRevisions.col.createdAt, '=', 'q1.maxCreatedAt') + }) - const res = await outerQ - return keyBy(res, (r) => r.automationId) -} + const res = await outerQ + return keyBy(res, (r) => r.automationId) + } -export async function getLatestAutomationRevision(params: { automationId: string }) { - const { automationId } = params +export const getLatestAutomationRevisionFactory = + (deps: { db: Knex }): GetLatestAutomationRevision => + async (params: { automationId: string }) => { + const { automationId } = params - const revisions = await getLatestAutomationRevisions({ - automationIds: [automationId] - }) + const revisions = await getLatestAutomationRevisionsFactory(deps)({ + automationIds: [automationId] + }) - return (revisions[automationId] ?? null) as Nullable<(typeof revisions)[0]> -} + return (revisions[automationId] ?? null) as Nullable<(typeof revisions)[0]> + } export async function getRevisionsTriggerDefinitions(params: { automationRevisionIds: string[] diff --git a/packages/server/modules/automate/services/trigger.ts b/packages/server/modules/automate/services/trigger.ts index efaee20c8..17d4ea8cb 100644 --- a/packages/server/modules/automate/services/trigger.ts +++ b/packages/server/modules/automate/services/trigger.ts @@ -1,8 +1,4 @@ -import { - InsertableAutomationRun, - getLatestAutomationRevision, - getFullAutomationRevisionMetadataFactory -} from '@/modules/automate/repositories/automations' +import { InsertableAutomationRun } from '@/modules/automate/repositories/automations' import { AutomationWithRevision, AutomationTriggerDefinitionRecord, @@ -48,15 +44,10 @@ import { GetAutomationTriggerDefinitions, GetEncryptionKeyPairFor, GetFullAutomationRevisionMetadata, + GetLatestAutomationRevision, TriggerAutomationRevisionRun, UpsertAutomationRun } from '@/modules/automate/domain/operations' -import { db } from '@/db/knex' - -// TODO: Fixed in next PRs -const getFullAutomationRevisionMetadata = getFullAutomationRevisionMetadataFactory({ - db -}) export type OnModelVersionCreateDeps = { getAutomation: GetAutomation @@ -224,6 +215,7 @@ export type TriggerAutomationRevisionRunDeps = { createAppToken: typeof createAppToken upsertAutomationRun: UpsertAutomationRun automateRunsEmitter: AutomateRunsEventsEmitter + getFullAutomationRevisionMetadata: GetFullAutomationRevisionMetadata } & CreateAutomationRunDataDeps /** @@ -241,7 +233,8 @@ export const triggerAutomationRevisionRunFactory = getAutomationToken, createAppToken, upsertAutomationRun, - automateRunsEmitter + automateRunsEmitter, + getFullAutomationRevisionMetadata } = deps const { revisionId, manifest, source = RunTriggerSource.Automatic } = params @@ -537,22 +530,26 @@ export const manuallyTriggerAutomationFactory = export type CreateTestAutomationRunDeps = { getAutomation: GetAutomation - getLatestAutomationRevision: typeof getLatestAutomationRevision - getFullAutomationRevisionMetadata: typeof getFullAutomationRevisionMetadata + getLatestAutomationRevision: GetLatestAutomationRevision + getFullAutomationRevisionMetadata: GetFullAutomationRevisionMetadata upsertAutomationRun: UpsertAutomationRun + validateStreamAccess: typeof validateStreamAccess + getBranchLatestCommits: typeof getBranchLatestCommits } & CreateAutomationRunDataDeps /** * TODO: Reduce duplication w/ other fns in this service */ -export const createTestAutomationRun = +export const createTestAutomationRunFactory = (deps: CreateTestAutomationRunDeps) => async (params: { projectId: string; automationId: string; userId: string }) => { const { getAutomation, getLatestAutomationRevision, getFullAutomationRevisionMetadata, - upsertAutomationRun + upsertAutomationRun, + validateStreamAccess, + getBranchLatestCommits } = deps const { projectId, automationId, userId } = params diff --git a/packages/server/modules/automate/tests/trigger.spec.ts b/packages/server/modules/automate/tests/trigger.spec.ts index 5d84f156e..1516f4710 100644 --- a/packages/server/modules/automate/tests/trigger.spec.ts +++ b/packages/server/modules/automate/tests/trigger.spec.ts @@ -45,7 +45,8 @@ import { getFullAutomationRunByIdFactory, upsertAutomationRunFactory, getAutomationTokenFactory, - getAutomationTriggerDefinitionsFactory + getAutomationTriggerDefinitionsFactory, + getFullAutomationRevisionMetadataFactory } from '@/modules/automate/repositories/automations' import { beforeEachContext, truncateTables } from '@/test/hooks' import { Automate } from '@speckle/shared' @@ -90,6 +91,9 @@ const getFullAutomationRunById = getFullAutomationRunByIdFactory({ db }) const upsertAutomationRun = upsertAutomationRunFactory({ db }) const getAutomationToken = getAutomationTokenFactory({ db }) const getAutomationTriggerDefinitions = getAutomationTriggerDefinitionsFactory({ db }) +const getFullAutomationRevisionMetadata = getFullAutomationRevisionMetadataFactory({ + db +}) ;(FF_AUTOMATE_MODULE_ENABLED ? describe : describe.skip)( 'Automate triggers @automate', @@ -313,7 +317,8 @@ const getAutomationTriggerDefinitions = getAutomationTriggerDefinitionsFactory({ createAppToken, automateRunsEmitter: AutomateRunsEmitter.emit, getAutomationToken, - upsertAutomationRun + upsertAutomationRun, + getFullAutomationRevisionMetadata })({ revisionId: cryptoRandomString({ length: 10 }), manifest: { @@ -404,7 +409,8 @@ const getAutomationTriggerDefinitions = getAutomationTriggerDefinitionsFactory({ createAppToken, automateRunsEmitter: AutomateRunsEmitter.emit, getAutomationToken, - upsertAutomationRun + upsertAutomationRun, + getFullAutomationRevisionMetadata })({ revisionId: automationRevisionId, manifest: { @@ -501,7 +507,8 @@ const getAutomationTriggerDefinitions = getAutomationTriggerDefinitionsFactory({ createAppToken, automateRunsEmitter: AutomateRunsEmitter.emit, getAutomationToken, - upsertAutomationRun + upsertAutomationRun, + getFullAutomationRevisionMetadata })({ revisionId: automationRevisionId, manifest: { @@ -982,7 +989,8 @@ const getAutomationTriggerDefinitions = getAutomationTriggerDefinitionsFactory({ createAppToken, automateRunsEmitter: AutomateRunsEmitter.emit, getAutomationToken, - upsertAutomationRun + upsertAutomationRun, + getFullAutomationRevisionMetadata }), validateStreamAccess, ...(overrides || {}) diff --git a/packages/server/modules/core/loaders.ts b/packages/server/modules/core/loaders.ts index f1e76f28f..76d85a1e6 100644 --- a/packages/server/modules/core/loaders.ts +++ b/packages/server/modules/core/loaders.ts @@ -65,7 +65,7 @@ import { getAutomationRunsTriggers, getAutomationsFactory, getFunctionAutomationCounts, - getLatestAutomationRevisions, + getLatestAutomationRevisionsFactory, getRevisionsFunctions, getRevisionsTriggerDefinitions } from '@/modules/automate/repositories/automations' @@ -92,6 +92,7 @@ const getStreamPendingModels = getStreamPendingModelsFactory({ db }) const getAppScopes = getAppScopesFactory({ db }) const getAutomations = getAutomationsFactory({ db }) const getAutomationRevisions = getAutomationRevisionsFactory({ db }) +const getLatestAutomationRevisions = getLatestAutomationRevisionsFactory({ db }) /** * TODO: Lazy load DataLoaders to reduce memory usage