diff --git a/src/lib/locales/en-US.json b/src/lib/locales/en-US.json index cfe0a95e20..7721c0c6b8 100644 --- a/src/lib/locales/en-US.json +++ b/src/lib/locales/en-US.json @@ -534,6 +534,7 @@ "prodDefs_emptyType": "Need to select an Application Type", "prodDefs_emptyFlow": "Need to select a Workflow definition", "prodDefs_noFlow": "No Workflow Required", + "prodDefs_startAt": "Start Manual Rebuilds at", "stores_emptyStoreType": "Need to select a store type for this store", "storeTypes_title": "Store Types", "storeTypes_name": "Store Type Name", diff --git a/src/lib/locales/es-419.json b/src/lib/locales/es-419.json index 91272dfdf1..6ca1c198e3 100644 --- a/src/lib/locales/es-419.json +++ b/src/lib/locales/es-419.json @@ -535,6 +535,7 @@ "prodDefs_emptyType": "Necesita seleccionar un tipo de aplicación", "prodDefs_emptyFlow": "Need to select a Workflow definition", "prodDefs_noFlow": "No Workflow Required", + "prodDefs_startAt": "Iniciar reconstrucciones manuales en", "storeTypes_title": "Tipos de tienda", "storeTypes_name": "Store Type Name", "storeTypes_add": "AƱadir tipo de tienda", diff --git a/src/lib/locales/fr-FR.json b/src/lib/locales/fr-FR.json index 2720fc5c1e..784fba2671 100644 --- a/src/lib/locales/fr-FR.json +++ b/src/lib/locales/fr-FR.json @@ -509,6 +509,7 @@ "prodDefs_emptyType": "Need to select an Application Type", "prodDefs_emptyFlow": "Need to select a Workflow definition", "prodDefs_noFlow": "No Workflow Required", + "prodDefs_startAt": "Start Manual Rebuilds at", "stores_emptyStoreType": "Need to select a store type for this store", "storeTypes_title": "Store Types", "storeTypes_name": "Store Type Name", diff --git a/src/lib/prisma/migrations/14_start_rebuilds_at_state/migration.sql b/src/lib/prisma/migrations/14_start_rebuilds_at_state/migration.sql new file mode 100644 index 0000000000..cea28fc6fe --- /dev/null +++ b/src/lib/prisma/migrations/14_start_rebuilds_at_state/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "ProductDefinitions" ADD COLUMN "StartManualRebuildAt" TEXT; diff --git a/src/lib/prisma/schema.prisma b/src/lib/prisma/schema.prisma index 6e96d47d64..71f676dd4f 100644 --- a/src/lib/prisma/schema.prisma +++ b/src/lib/prisma/schema.prisma @@ -218,6 +218,7 @@ model ProductDefinitions { Description String? WorkflowId Int RebuildWorkflowId Int? + StartManualRebuildAt String? RepublishWorkflowId Int? Properties String? OrganizationProductDefinitions OrganizationProductDefinitions[] diff --git a/src/lib/products/server.ts b/src/lib/products/server.ts index 92f5519906..05b987e397 100644 --- a/src/lib/products/server.ts +++ b/src/lib/products/server.ts @@ -2,6 +2,7 @@ import { ProductTransitionType, WorkflowType } from '$lib/prisma'; import { BullMQ, getQueues } from '$lib/server/bullmq'; import { DatabaseReads, DatabaseWrites } from '$lib/server/database'; import { Workflow } from '$lib/server/workflow'; +import type { WorkflowState } from '$lib/workflowTypes'; import { ProductActionType } from '.'; export async function doProductAction(productId: string, action: ProductActionType) { @@ -21,6 +22,7 @@ export async function doProductAction(productId: string, action: ProductActionTy WorkflowOptions: true } }, + StartManualRebuildAt: true, RepublishWorkflow: { select: { Type: true, @@ -49,7 +51,12 @@ export async function doProductAction(productId: string, action: ProductActionTy await Workflow.create(productId, { productType: product.ProductDefinition[flowType].ProductType, options: new Set(product.ProductDefinition[flowType].WorkflowOptions), - workflowType: product.ProductDefinition[flowType].Type + workflowType: product.ProductDefinition[flowType].Type, + // ISSUE #1324 use isAutomatic here + start: + (action === 'rebuild' && + (product.ProductDefinition.StartManualRebuildAt as WorkflowState)) || + undefined }); } break; diff --git a/src/lib/server/job-executors/system.ts b/src/lib/server/job-executors/system.ts index 24bbcdd54a..34e7481372 100644 --- a/src/lib/server/job-executors/system.ts +++ b/src/lib/server/job-executors/system.ts @@ -539,7 +539,7 @@ export async function migrate(job: Job): Promise ).map(({ Id }) => DatabaseWrites.workflowInstances.markProcessFinalized(Id)) ); - job.updateProgress(70); + job.updateProgress(50); // Update WorkflowDefinitions ProductType and WorkflowOptions const workflowDefsNeedUpdate = (await DatabaseReads.workflowDefinitions.count({ @@ -618,6 +618,36 @@ export async function migrate(job: Job): Promise await DatabaseWrites.workflowDefinitions.updateMany(def); } } + job.updateProgress(55); + const prodDefsNeedUpdate = await DatabaseReads.productDefinitions.findMany({ + where: { Properties: { contains: '"ShouldExecute":' } }, + select: { Id: true, Properties: true } + }); + if (prodDefsNeedUpdate.length) { + for (const prodDef of prodDefsNeedUpdate) { + const prefix = `ProductDefinition Id=${prodDef.Id}`; + try { + const parsed = JSON.parse(prodDef.Properties!); + const targets = Object.keys(parsed['ShouldExecute']); + if (targets.length === 1) { + await DatabaseWrites.productDefinitions.update({ + where: { Id: prodDef.Id }, + data: { + StartManualRebuildAt: targets[0], + // Remove ShouldExecute from Properties + Properties: JSON.stringify({ ...parsed, ShouldExecute: undefined }) + } + }); + } else { + job.log( + `${prefix} Multiple ShouldExecute targets: ${JSON.stringify(parsed['ShouldExecute'], null, 2)}` + ); + } + } catch (e) { + job.log(`${prefix} Error: ${e}`); + } + } + } job.updateProgress(60); // 4. Populate Product.PackageName @@ -699,6 +729,7 @@ export async function migrate(job: Job): Promise migrationErrors, orphanedWPIs: orphanedInstances.reduce((p, c) => p + (c?.at(-1)?.count ?? 0), 0), updatedWorkflowDefinitions: workflowDefsNeedUpdate, + updatedProductDefinitions: !!prodDefsNeedUpdate, updatedPackages, deletedUsers: { users: deletedUsers, diff --git a/src/lib/workflowTypes.ts b/src/lib/workflowTypes.ts index ea43ff6217..98e65886e4 100644 --- a/src/lib/workflowTypes.ts +++ b/src/lib/workflowTypes.ts @@ -130,7 +130,7 @@ export type WorkflowInstanceContext = { )[]; includeReviewers: boolean; includeArtifacts: ArtifactLists | null; - start?: WorkflowState; + start?: WorkflowState; // keep here too so it is still persisted in DB environment: Environment; }; @@ -181,6 +181,7 @@ export type WorkflowConfig = { options: Set; productType: ProductType; workflowType: WorkflowType; + start?: WorkflowState; }; export type WorkflowInput = WorkflowConfig & { diff --git a/src/routes/(authenticated)/admin/settings/product-definitions/edit/+page.server.ts b/src/routes/(authenticated)/admin/settings/product-definitions/edit/+page.server.ts index 5eb8cbd14f..96a39ca75d 100644 --- a/src/routes/(authenticated)/admin/settings/product-definitions/edit/+page.server.ts +++ b/src/routes/(authenticated)/admin/settings/product-definitions/edit/+page.server.ts @@ -6,6 +6,7 @@ import type { Actions, PageServerLoad } from './$types'; import { localizeHref } from '$lib/paraglide/runtime'; import { DatabaseReads, DatabaseWrites } from '$lib/server/database'; import { idSchema, propertiesSchema } from '$lib/valibot'; +import { WorkflowState } from '$lib/workflowTypes'; const editSchema = v.object({ id: idSchema, @@ -13,6 +14,7 @@ const editSchema = v.object({ applicationType: idSchema, workflow: idSchema, rebuildWorkflow: v.nullable(idSchema), + startManualRebuildAt: v.nullable(v.literal(String(WorkflowState.Synchronize_Data))), republishWorkflow: v.nullable(idSchema), description: v.nullable(v.string()), properties: propertiesSchema @@ -40,6 +42,7 @@ export const load = (async ({ url, locals }) => { applicationType: data.TypeId, workflow: data.WorkflowId, rebuildWorkflow: data.RebuildWorkflowId, + startManualRebuildAt: data.StartManualRebuildAt, republishWorkflow: data.RepublishWorkflowId, description: data.Description, properties: data.Properties @@ -65,6 +68,7 @@ export const actions = { Name: form.data.name, WorkflowId: form.data.workflow, RebuildWorkflowId: form.data.rebuildWorkflow, + StartManualRebuildAt: form.data.startManualRebuildAt, RepublishWorkflowId: form.data.republishWorkflow, Description: form.data.description, Properties: form.data.properties diff --git a/src/routes/(authenticated)/admin/settings/product-definitions/edit/+page.svelte b/src/routes/(authenticated)/admin/settings/product-definitions/edit/+page.svelte index 023592f5f6..fafb7bca39 100644 --- a/src/routes/(authenticated)/admin/settings/product-definitions/edit/+page.svelte +++ b/src/routes/(authenticated)/admin/settings/product-definitions/edit/+page.svelte @@ -8,6 +8,7 @@ import { getLocale, localizeHref } from '$lib/paraglide/runtime'; import { toast } from '$lib/utils'; import { byName } from '$lib/utils/sorting'; + import { WorkflowState } from '$lib/workflowTypes'; interface Props { data: PageData; @@ -95,6 +96,19 @@   + {#if $form.rebuildWorkflow} + + +   + + {/if} + + + +   + + {/if}