diff --git a/api/src/org/labkey/api/workflow/WorkflowService.java b/api/src/org/labkey/api/workflow/WorkflowService.java index 55e22cb6602..238c8ac8015 100644 --- a/api/src/org/labkey/api/workflow/WorkflowService.java +++ b/api/src/org/labkey/api/workflow/WorkflowService.java @@ -1,13 +1,27 @@ package org.labkey.api.workflow; +import jakarta.servlet.http.HttpServletRequest; import org.jetbrains.annotations.NotNull; -import org.labkey.api.data.Container;import org.labkey.api.security.User;import org.labkey.api.services.ServiceRegistry; +import org.labkey.api.data.Container; +import org.labkey.api.dataiterator.DataIteratorBuilder; +import org.labkey.api.security.User;import org.labkey.api.services.ServiceRegistry; + +import java.util.Map; public interface WorkflowService { + enum WorkflowConfigs + { + ActionId, + JobId, + } + enum ActionType { - AssayImport("assay types", "Imported assay data"); + AssayImport("assay types", "Imported assay data"), + DeriveSamples("derivation sample type parameters", "Derived samples"), + AliquotSamples("aliquot sample type parameters", "Aliquot samples"), + PoolSamples("pooling sample type parameters", "Pooled samples"); private final String _inputDescription; private final String _auditMessage; @@ -39,6 +53,13 @@ static WorkflowService get() return ServiceRegistry.get().getService(WorkflowService.class); } + void populateConfigParams(Map provided, Map configParameters); + + void populateConfigParams(HttpServletRequest request, Map configParameters); void onActionComplete(@NotNull Container container, @NotNull User user, @NotNull Long actionId); void onActionComplete(@NotNull Container container, @NotNull User user, @NotNull Long taskId, @NotNull ActionType actionType); + + DataIteratorBuilder getSampleCreationDataIteratorBuilder(DataIteratorBuilder data, Container container, User user); + + DataIteratorBuilder getActionAuditDataIteratorBuilder(DataIteratorBuilder data, Container container, User user); } diff --git a/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java b/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java index bd8273f8d99..5aaa85810bc 100644 --- a/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java +++ b/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java @@ -108,6 +108,7 @@ import org.labkey.api.util.StringUtilsLabKey; import org.labkey.api.util.logging.LogHelper; import org.labkey.api.view.UnauthorizedException; +import org.labkey.api.workflow.WorkflowService; import org.labkey.experiment.ExpDataIterators; import org.labkey.experiment.SampleTypeAuditProvider; @@ -416,6 +417,14 @@ public DataIteratorBuilder createImportDIB(User user, Container container, DataI if (sampleType.getAutoLinkTargetContainer() != null && StudyPublishService.get() != null && !context.getInsertOption().updateOnly/* TODO support link to study on update? */) dib = LoggingDataIterator.wrap(new ExpDataIterators.AutoLinkToStudyDataIteratorBuilder(dib, getSchema(), userSchema.getContainer(), userSchema.getUser(), sampleType)); + if (WorkflowService.get() != null) + { + if (context.getConfigParameter(WorkflowService.WorkflowConfigs.ActionId) != null) + { + dib = WorkflowService.get().getSampleCreationDataIteratorBuilder(dib, userSchema.getContainer(), userSchema.getUser()); + dib = WorkflowService.get().getActionAuditDataIteratorBuilder(dib, userSchema.getContainer(), userSchema.getUser()); + } + } } return dib; } diff --git a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java index ade152c4c0f..8678008f209 100644 --- a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java +++ b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java @@ -252,6 +252,7 @@ import org.labkey.api.view.WebPartView; import org.labkey.api.view.template.ClientDependency; import org.labkey.api.view.template.PageConfig; +import org.labkey.api.workflow.WorkflowService; import org.labkey.experiment.ChooseExperimentTypeBean; import org.labkey.experiment.ConfirmDeleteView; import org.labkey.experiment.CustomPropertiesView; @@ -4448,6 +4449,8 @@ protected int importData( tInfo = ExperimentService.get().createMaterialTable(new SamplesSchema(getUser(), getContainer()), ContainerFilter.current(this), null); updateService = tInfo.getUpdateService(); } + if (WorkflowService.get() != null) + WorkflowService.get().populateConfigParams(getViewContext().getRequest(), _context.getConfigParameters()); int count = importData(dl, tInfo, updateService, _context, auditEvent, getUser(), getContainer()); diff --git a/query/src/org/labkey/query/controllers/QueryController.java b/query/src/org/labkey/query/controllers/QueryController.java index 874f0a0ad70..c089be45ace 100644 --- a/query/src/org/labkey/query/controllers/QueryController.java +++ b/query/src/org/labkey/query/controllers/QueryController.java @@ -267,6 +267,7 @@ import org.labkey.api.view.ViewServlet; import org.labkey.api.view.WebPartView; import org.labkey.api.view.template.PageConfig; +import org.labkey.api.workflow.WorkflowService; import org.labkey.api.writer.HtmlWriter; import org.labkey.api.writer.ZipFile; import org.labkey.data.xml.ColumnType; @@ -4659,11 +4660,13 @@ protected JSONObject executeJson(JSONObject json, CommandType commandType, boole } } - Map extraContext = json.has("extraContext") ? json.getJSONObject("extraContext").toMap() : new CaseInsensitiveHashMap<>(); + Map extraContext = json.has("extraContext") ? new CaseInsensitiveHashMap(json.getJSONObject("extraContext").toMap()) : new CaseInsensitiveHashMap<>(); Map auditDetails = json.has("auditDetails") ? json.getJSONObject("auditDetails").toMap() : new CaseInsensitiveHashMap<>(); Map configParameters = new HashMap<>(); + if (WorkflowService.get() != null) + WorkflowService.get().populateConfigParams(extraContext, configParameters); // Check first if the audit behavior has been defined for the table either in code or through XML. // If not defined there, check for the audit behavior defined in the action form (json).