From fdd35a0759e43b4a5dc8ff9aaae3c5b7c8773179 Mon Sep 17 00:00:00 2001 From: Saurav Suman Date: Tue, 3 Feb 2026 17:35:44 +0530 Subject: [PATCH] feat: added change_reason in workspace table --- .../Model/CreateWorkspaceInput.hs | 26 +++++-- .../Model/CreateWorkspaceOutput.hs | 41 +++++++---- .../Superposition/Model/GetWorkspaceOutput.hs | 41 +++++++---- .../Model/MigrateWorkspaceSchemaOutput.hs | 41 +++++++---- .../Model/UpdateWorkspaceInput.hs | 26 +++++-- .../Model/UpdateWorkspaceOutput.hs | 41 +++++++---- .../Superposition/Model/WorkspaceResponse.hs | 25 +++++-- .../client/SuperpositionAsyncClient.java | 6 +- .../client/SuperpositionAsyncClientImpl.java | 2 +- .../client/SuperpositionClient.java | 6 +- .../client/SuperpositionClientImpl.java | 2 +- .../model/CreateWorkspaceInput.java | 69 +++++++++++++------ .../model/CreateWorkspaceOutput.java | 45 +++++++++--- .../model/GetWorkspaceOutput.java | 45 +++++++++--- .../model/MigrateWorkspaceSchemaOutput.java | 45 +++++++++--- .../model/UpdateWorkspaceInput.java | 29 +++++++- .../model/UpdateWorkspaceOutput.java | 45 +++++++++--- .../juspay/superposition/model/Workspace.java | 1 + .../model/WorkspaceResponse.java | 45 +++++++++--- .../src/commands/CreateWorkspaceCommand.ts | 2 + .../sdk/src/commands/GetWorkspaceCommand.ts | 1 + .../sdk/src/commands/ListWorkspaceCommand.ts | 1 + .../commands/MigrateWorkspaceSchemaCommand.ts | 1 + .../src/commands/UpdateWorkspaceCommand.ts | 2 + clients/javascript/sdk/src/models/models_0.ts | 3 + .../sdk/src/protocols/Aws_restJson1.ts | 7 ++ .../sdk/superposition_sdk/_private/schemas.py | 59 ++++++++++++++++ .../python/sdk/superposition_sdk/models.py | 44 ++++++++++++ crates/frontend/src/api.rs | 3 + .../frontend/src/components/workspace_form.rs | 17 ++++- .../src/components/workspace_form/types.rs | 1 + crates/frontend/src/pages/workspace.rs | 7 ++ crates/service_utils/src/encryption.rs | 1 + .../superposition/src/workspace/handlers.rs | 4 +- .../src/client/create_workspace.rs | 2 + .../src/client/get_workspace.rs | 1 + .../src/client/migrate_workspace_schema.rs | 1 + .../src/client/update_workspace.rs | 2 + .../_create_workspace_input.rs | 23 +++++++ .../_create_workspace_output.rs | 27 ++++++++ .../operation/create_workspace/builders.rs | 14 ++++ .../get_workspace/_get_workspace_output.rs | 27 ++++++++ .../_migrate_workspace_schema_output.rs | 27 ++++++++ .../_update_workspace_input.rs | 22 ++++++ .../_update_workspace_output.rs | 27 ++++++++ .../operation/update_workspace/builders.rs | 14 ++++ .../protocol_serde/shape_create_workspace.rs | 9 +++ .../shape_create_workspace_input.rs | 27 ++++---- .../src/protocol_serde/shape_get_workspace.rs | 9 +++ .../shape_migrate_workspace_schema.rs | 9 +++ .../protocol_serde/shape_update_workspace.rs | 9 +++ .../shape_update_workspace_input.rs | 37 +++++----- .../shape_workspace_response.rs | 9 +++ crates/superposition_sdk/src/serde_util.rs | 5 ++ .../src/types/_workspace_response.rs | 27 ++++++++ .../down.sql | 1 + .../up.sql | 1 + .../superposition_types/src/api/workspace.rs | 8 ++- .../src/database/models.rs | 1 + .../src/database/superposition_schema.rs | 1 + docker-compose/postgres/db_init.sql | 3 + docs/docs/api/Superposition.openapi.json | 27 ++++++++ docs/docs/api/create-workspace.api.mdx | 6 +- docs/docs/api/get-workspace.api.mdx | 4 +- docs/docs/api/list-workspace.api.mdx | 4 +- .../docs/api/migrate-workspace-schema.api.mdx | 4 +- docs/docs/api/update-workspace.api.mdx | 6 +- smithy/models/workspace.smithy | 9 +++ smithy/patches/java.patch | 2 + superposition.sql | 3 + tests/index.ts | 1 + tests/src/config.test.ts | 2 + tests/src/context.test.ts | 1 + tests/src/experiment_groups.test.ts | 2 + tests/src/experiments.test.ts | 3 + tests/src/workspace.test.ts | 8 ++- 76 files changed, 973 insertions(+), 186 deletions(-) create mode 100644 crates/superposition_types/migrations/2026-02-03-100000_workspace_change_reason/down.sql create mode 100644 crates/superposition_types/migrations/2026-02-03-100000_workspace_change_reason/up.sql diff --git a/clients/haskell/sdk/Io/Superposition/Model/CreateWorkspaceInput.hs b/clients/haskell/sdk/Io/Superposition/Model/CreateWorkspaceInput.hs index 57bccac21..dfa1b5e92 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/CreateWorkspaceInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/CreateWorkspaceInput.hs @@ -8,6 +8,7 @@ module Io.Superposition.Model.CreateWorkspaceInput ( setAutoPopulateControl, setEnableContextValidation, setEnableChangeReasonValidation, + setChangeReason, build, CreateWorkspaceInputBuilder, CreateWorkspaceInput, @@ -19,7 +20,8 @@ module Io.Superposition.Model.CreateWorkspaceInput ( allow_experiment_self_approval, auto_populate_control, enable_context_validation, - enable_change_reason_validation + enable_change_reason_validation, + change_reason ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -44,7 +46,8 @@ data CreateWorkspaceInput = CreateWorkspaceInput { allow_experiment_self_approval :: Data.Maybe.Maybe Bool, auto_populate_control :: Data.Maybe.Maybe Bool, enable_context_validation :: Data.Maybe.Maybe Bool, - enable_change_reason_validation :: Data.Maybe.Maybe Bool + enable_change_reason_validation :: Data.Maybe.Maybe Bool, + change_reason :: Data.Text.Text } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -61,7 +64,8 @@ instance Data.Aeson.ToJSON CreateWorkspaceInput where "allow_experiment_self_approval" Data.Aeson..= allow_experiment_self_approval a, "auto_populate_control" Data.Aeson..= auto_populate_control a, "enable_context_validation" Data.Aeson..= enable_context_validation a, - "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a + "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a, + "change_reason" Data.Aeson..= change_reason a ] @@ -78,6 +82,7 @@ instance Data.Aeson.FromJSON CreateWorkspaceInput where Control.Applicative.<*> (v Data.Aeson..:? "auto_populate_control") Control.Applicative.<*> (v Data.Aeson..:? "enable_context_validation") Control.Applicative.<*> (v Data.Aeson..:? "enable_change_reason_validation") + Control.Applicative.<*> (v Data.Aeson..: "change_reason") @@ -91,7 +96,8 @@ data CreateWorkspaceInputBuilderState = CreateWorkspaceInputBuilderState { allow_experiment_self_approvalBuilderState :: Data.Maybe.Maybe Bool, auto_populate_controlBuilderState :: Data.Maybe.Maybe Bool, enable_context_validationBuilderState :: Data.Maybe.Maybe Bool, - enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool + enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool, + change_reasonBuilderState :: Data.Maybe.Maybe Data.Text.Text } deriving ( GHC.Generics.Generic ) @@ -106,7 +112,8 @@ defaultBuilderState = CreateWorkspaceInputBuilderState { allow_experiment_self_approvalBuilderState = Data.Maybe.Nothing, auto_populate_controlBuilderState = Data.Maybe.Nothing, enable_context_validationBuilderState = Data.Maybe.Nothing, - enable_change_reason_validationBuilderState = Data.Maybe.Nothing + enable_change_reason_validationBuilderState = Data.Maybe.Nothing, + change_reasonBuilderState = Data.Maybe.Nothing } type CreateWorkspaceInputBuilder = Control.Monad.State.Strict.State CreateWorkspaceInputBuilderState @@ -147,6 +154,10 @@ setEnableChangeReasonValidation :: Data.Maybe.Maybe Bool -> CreateWorkspaceInput setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = value })) +setChangeReason :: Data.Text.Text -> CreateWorkspaceInputBuilder () +setChangeReason value = + Control.Monad.State.Strict.modify (\s -> (s { change_reasonBuilderState = Data.Maybe.Just value })) + build :: CreateWorkspaceInputBuilder () -> Data.Either.Either Data.Text.Text CreateWorkspaceInput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -159,6 +170,7 @@ build builder = do auto_populate_control' <- Data.Either.Right (auto_populate_controlBuilderState st) enable_context_validation' <- Data.Either.Right (enable_context_validationBuilderState st) enable_change_reason_validation' <- Data.Either.Right (enable_change_reason_validationBuilderState st) + change_reason' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.CreateWorkspaceInput.CreateWorkspaceInput.change_reason is a required property.") Data.Either.Right (change_reasonBuilderState st) Data.Either.Right (CreateWorkspaceInput { org_id = org_id', workspace_admin_email = workspace_admin_email', @@ -168,7 +180,8 @@ build builder = do allow_experiment_self_approval = allow_experiment_self_approval', auto_populate_control = auto_populate_control', enable_context_validation = enable_context_validation', - enable_change_reason_validation = enable_change_reason_validation' + enable_change_reason_validation = enable_change_reason_validation', + change_reason = change_reason' }) @@ -181,6 +194,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder CreateWorkspaceInput where Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "allow_experiment_self_approval" (allow_experiment_self_approval self) + Io.Superposition.Utility.serField "change_reason" (change_reason self) Io.Superposition.Utility.serField "workspace_admin_email" (workspace_admin_email self) Io.Superposition.Utility.serField "auto_populate_control" (auto_populate_control self) Io.Superposition.Utility.serField "enable_context_validation" (enable_context_validation self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/CreateWorkspaceOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/CreateWorkspaceOutput.hs index 9a0452a3d..c563cc2fa 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/CreateWorkspaceOutput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/CreateWorkspaceOutput.hs @@ -16,6 +16,7 @@ module Io.Superposition.Model.CreateWorkspaceOutput ( setAutoPopulateControl, setEnableContextValidation, setEnableChangeReasonValidation, + setChangeReason, build, CreateWorkspaceOutputBuilder, CreateWorkspaceOutput, @@ -35,7 +36,8 @@ module Io.Superposition.Model.CreateWorkspaceOutput ( allow_experiment_self_approval, auto_populate_control, enable_context_validation, - enable_change_reason_validation + enable_change_reason_validation, + change_reason ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -69,7 +71,8 @@ data CreateWorkspaceOutput = CreateWorkspaceOutput { allow_experiment_self_approval :: Bool, auto_populate_control :: Bool, enable_context_validation :: Bool, - enable_change_reason_validation :: Bool + enable_change_reason_validation :: Bool, + change_reason :: Data.Text.Text } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -94,7 +97,8 @@ instance Data.Aeson.ToJSON CreateWorkspaceOutput where "allow_experiment_self_approval" Data.Aeson..= allow_experiment_self_approval a, "auto_populate_control" Data.Aeson..= auto_populate_control a, "enable_context_validation" Data.Aeson..= enable_context_validation a, - "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a + "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a, + "change_reason" Data.Aeson..= change_reason a ] @@ -119,6 +123,7 @@ instance Data.Aeson.FromJSON CreateWorkspaceOutput where Control.Applicative.<*> (v Data.Aeson..: "auto_populate_control") Control.Applicative.<*> (v Data.Aeson..: "enable_context_validation") Control.Applicative.<*> (v Data.Aeson..: "enable_change_reason_validation") + Control.Applicative.<*> (v Data.Aeson..: "change_reason") @@ -140,7 +145,8 @@ data CreateWorkspaceOutputBuilderState = CreateWorkspaceOutputBuilderState { allow_experiment_self_approvalBuilderState :: Data.Maybe.Maybe Bool, auto_populate_controlBuilderState :: Data.Maybe.Maybe Bool, enable_context_validationBuilderState :: Data.Maybe.Maybe Bool, - enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool + enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool, + change_reasonBuilderState :: Data.Maybe.Maybe Data.Text.Text } deriving ( GHC.Generics.Generic ) @@ -163,7 +169,8 @@ defaultBuilderState = CreateWorkspaceOutputBuilderState { allow_experiment_self_approvalBuilderState = Data.Maybe.Nothing, auto_populate_controlBuilderState = Data.Maybe.Nothing, enable_context_validationBuilderState = Data.Maybe.Nothing, - enable_change_reason_validationBuilderState = Data.Maybe.Nothing + enable_change_reason_validationBuilderState = Data.Maybe.Nothing, + change_reasonBuilderState = Data.Maybe.Nothing } type CreateWorkspaceOutputBuilder = Control.Monad.State.Strict.State CreateWorkspaceOutputBuilderState @@ -236,6 +243,10 @@ setEnableChangeReasonValidation :: Bool -> CreateWorkspaceOutputBuilder () setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = Data.Maybe.Just value })) +setChangeReason :: Data.Text.Text -> CreateWorkspaceOutputBuilder () +setChangeReason value = + Control.Monad.State.Strict.modify (\s -> (s { change_reasonBuilderState = Data.Maybe.Just value })) + build :: CreateWorkspaceOutputBuilder () -> Data.Either.Either Data.Text.Text CreateWorkspaceOutput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -256,6 +267,7 @@ build builder = do auto_populate_control' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.CreateWorkspaceOutput.CreateWorkspaceOutput.auto_populate_control is a required property.") Data.Either.Right (auto_populate_controlBuilderState st) enable_context_validation' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.CreateWorkspaceOutput.CreateWorkspaceOutput.enable_context_validation is a required property.") Data.Either.Right (enable_context_validationBuilderState st) enable_change_reason_validation' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.CreateWorkspaceOutput.CreateWorkspaceOutput.enable_change_reason_validation is a required property.") Data.Either.Right (enable_change_reason_validationBuilderState st) + change_reason' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.CreateWorkspaceOutput.CreateWorkspaceOutput.change_reason is a required property.") Data.Either.Right (change_reasonBuilderState st) Data.Either.Right (CreateWorkspaceOutput { workspace_name = workspace_name', organisation_id = organisation_id', @@ -273,7 +285,8 @@ build builder = do allow_experiment_self_approval = allow_experiment_self_approval', auto_populate_control = auto_populate_control', enable_context_validation = enable_context_validation', - enable_change_reason_validation = enable_change_reason_validation' + enable_change_reason_validation = enable_change_reason_validation', + change_reason = change_reason' }) @@ -295,14 +308,15 @@ instance Io.Superposition.Utility.FromResponseParser CreateWorkspaceOutput where var11 <- Io.Superposition.Utility.deSerField "last_modified_at" var12 <- Io.Superposition.Utility.deSerField "organisation_id" var13 <- Io.Superposition.Utility.deSerField "allow_experiment_self_approval" - var14 <- Io.Superposition.Utility.deSerField "workspace_schema_name" - var15 <- Io.Superposition.Utility.deSerField "metrics" - var16 <- Io.Superposition.Utility.deSerField "workspace_name" + var14 <- Io.Superposition.Utility.deSerField "change_reason" + var15 <- Io.Superposition.Utility.deSerField "workspace_schema_name" + var16 <- Io.Superposition.Utility.deSerField "metrics" + var17 <- Io.Superposition.Utility.deSerField "workspace_name" pure $ CreateWorkspaceOutput { - workspace_name = var16, + workspace_name = var17, organisation_id = var12, organisation_name = var4, - workspace_schema_name = var14, + workspace_schema_name = var15, workspace_status = var10, workspace_admin_email = var0, config_version = var7, @@ -311,10 +325,11 @@ instance Io.Superposition.Utility.FromResponseParser CreateWorkspaceOutput where last_modified_at = var11, created_at = var3, mandatory_dimensions = var8, - metrics = var15, + metrics = var16, allow_experiment_self_approval = var13, auto_populate_control = var1, enable_context_validation = var2, - enable_change_reason_validation = var9 + enable_change_reason_validation = var9, + change_reason = var14 } diff --git a/clients/haskell/sdk/Io/Superposition/Model/GetWorkspaceOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/GetWorkspaceOutput.hs index 4bfe9dd59..27f200e1d 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/GetWorkspaceOutput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/GetWorkspaceOutput.hs @@ -16,6 +16,7 @@ module Io.Superposition.Model.GetWorkspaceOutput ( setAutoPopulateControl, setEnableContextValidation, setEnableChangeReasonValidation, + setChangeReason, build, GetWorkspaceOutputBuilder, GetWorkspaceOutput, @@ -35,7 +36,8 @@ module Io.Superposition.Model.GetWorkspaceOutput ( allow_experiment_self_approval, auto_populate_control, enable_context_validation, - enable_change_reason_validation + enable_change_reason_validation, + change_reason ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -69,7 +71,8 @@ data GetWorkspaceOutput = GetWorkspaceOutput { allow_experiment_self_approval :: Bool, auto_populate_control :: Bool, enable_context_validation :: Bool, - enable_change_reason_validation :: Bool + enable_change_reason_validation :: Bool, + change_reason :: Data.Text.Text } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -94,7 +97,8 @@ instance Data.Aeson.ToJSON GetWorkspaceOutput where "allow_experiment_self_approval" Data.Aeson..= allow_experiment_self_approval a, "auto_populate_control" Data.Aeson..= auto_populate_control a, "enable_context_validation" Data.Aeson..= enable_context_validation a, - "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a + "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a, + "change_reason" Data.Aeson..= change_reason a ] @@ -119,6 +123,7 @@ instance Data.Aeson.FromJSON GetWorkspaceOutput where Control.Applicative.<*> (v Data.Aeson..: "auto_populate_control") Control.Applicative.<*> (v Data.Aeson..: "enable_context_validation") Control.Applicative.<*> (v Data.Aeson..: "enable_change_reason_validation") + Control.Applicative.<*> (v Data.Aeson..: "change_reason") @@ -140,7 +145,8 @@ data GetWorkspaceOutputBuilderState = GetWorkspaceOutputBuilderState { allow_experiment_self_approvalBuilderState :: Data.Maybe.Maybe Bool, auto_populate_controlBuilderState :: Data.Maybe.Maybe Bool, enable_context_validationBuilderState :: Data.Maybe.Maybe Bool, - enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool + enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool, + change_reasonBuilderState :: Data.Maybe.Maybe Data.Text.Text } deriving ( GHC.Generics.Generic ) @@ -163,7 +169,8 @@ defaultBuilderState = GetWorkspaceOutputBuilderState { allow_experiment_self_approvalBuilderState = Data.Maybe.Nothing, auto_populate_controlBuilderState = Data.Maybe.Nothing, enable_context_validationBuilderState = Data.Maybe.Nothing, - enable_change_reason_validationBuilderState = Data.Maybe.Nothing + enable_change_reason_validationBuilderState = Data.Maybe.Nothing, + change_reasonBuilderState = Data.Maybe.Nothing } type GetWorkspaceOutputBuilder = Control.Monad.State.Strict.State GetWorkspaceOutputBuilderState @@ -236,6 +243,10 @@ setEnableChangeReasonValidation :: Bool -> GetWorkspaceOutputBuilder () setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = Data.Maybe.Just value })) +setChangeReason :: Data.Text.Text -> GetWorkspaceOutputBuilder () +setChangeReason value = + Control.Monad.State.Strict.modify (\s -> (s { change_reasonBuilderState = Data.Maybe.Just value })) + build :: GetWorkspaceOutputBuilder () -> Data.Either.Either Data.Text.Text GetWorkspaceOutput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -256,6 +267,7 @@ build builder = do auto_populate_control' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.GetWorkspaceOutput.GetWorkspaceOutput.auto_populate_control is a required property.") Data.Either.Right (auto_populate_controlBuilderState st) enable_context_validation' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.GetWorkspaceOutput.GetWorkspaceOutput.enable_context_validation is a required property.") Data.Either.Right (enable_context_validationBuilderState st) enable_change_reason_validation' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.GetWorkspaceOutput.GetWorkspaceOutput.enable_change_reason_validation is a required property.") Data.Either.Right (enable_change_reason_validationBuilderState st) + change_reason' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.GetWorkspaceOutput.GetWorkspaceOutput.change_reason is a required property.") Data.Either.Right (change_reasonBuilderState st) Data.Either.Right (GetWorkspaceOutput { workspace_name = workspace_name', organisation_id = organisation_id', @@ -273,7 +285,8 @@ build builder = do allow_experiment_self_approval = allow_experiment_self_approval', auto_populate_control = auto_populate_control', enable_context_validation = enable_context_validation', - enable_change_reason_validation = enable_change_reason_validation' + enable_change_reason_validation = enable_change_reason_validation', + change_reason = change_reason' }) @@ -295,14 +308,15 @@ instance Io.Superposition.Utility.FromResponseParser GetWorkspaceOutput where var11 <- Io.Superposition.Utility.deSerField "last_modified_at" var12 <- Io.Superposition.Utility.deSerField "organisation_id" var13 <- Io.Superposition.Utility.deSerField "allow_experiment_self_approval" - var14 <- Io.Superposition.Utility.deSerField "workspace_schema_name" - var15 <- Io.Superposition.Utility.deSerField "metrics" - var16 <- Io.Superposition.Utility.deSerField "workspace_name" + var14 <- Io.Superposition.Utility.deSerField "change_reason" + var15 <- Io.Superposition.Utility.deSerField "workspace_schema_name" + var16 <- Io.Superposition.Utility.deSerField "metrics" + var17 <- Io.Superposition.Utility.deSerField "workspace_name" pure $ GetWorkspaceOutput { - workspace_name = var16, + workspace_name = var17, organisation_id = var12, organisation_name = var4, - workspace_schema_name = var14, + workspace_schema_name = var15, workspace_status = var10, workspace_admin_email = var0, config_version = var7, @@ -311,10 +325,11 @@ instance Io.Superposition.Utility.FromResponseParser GetWorkspaceOutput where last_modified_at = var11, created_at = var3, mandatory_dimensions = var8, - metrics = var15, + metrics = var16, allow_experiment_self_approval = var13, auto_populate_control = var1, enable_context_validation = var2, - enable_change_reason_validation = var9 + enable_change_reason_validation = var9, + change_reason = var14 } diff --git a/clients/haskell/sdk/Io/Superposition/Model/MigrateWorkspaceSchemaOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/MigrateWorkspaceSchemaOutput.hs index 3514b61f4..64fdb99a3 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/MigrateWorkspaceSchemaOutput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/MigrateWorkspaceSchemaOutput.hs @@ -16,6 +16,7 @@ module Io.Superposition.Model.MigrateWorkspaceSchemaOutput ( setAutoPopulateControl, setEnableContextValidation, setEnableChangeReasonValidation, + setChangeReason, build, MigrateWorkspaceSchemaOutputBuilder, MigrateWorkspaceSchemaOutput, @@ -35,7 +36,8 @@ module Io.Superposition.Model.MigrateWorkspaceSchemaOutput ( allow_experiment_self_approval, auto_populate_control, enable_context_validation, - enable_change_reason_validation + enable_change_reason_validation, + change_reason ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -69,7 +71,8 @@ data MigrateWorkspaceSchemaOutput = MigrateWorkspaceSchemaOutput { allow_experiment_self_approval :: Bool, auto_populate_control :: Bool, enable_context_validation :: Bool, - enable_change_reason_validation :: Bool + enable_change_reason_validation :: Bool, + change_reason :: Data.Text.Text } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -94,7 +97,8 @@ instance Data.Aeson.ToJSON MigrateWorkspaceSchemaOutput where "allow_experiment_self_approval" Data.Aeson..= allow_experiment_self_approval a, "auto_populate_control" Data.Aeson..= auto_populate_control a, "enable_context_validation" Data.Aeson..= enable_context_validation a, - "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a + "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a, + "change_reason" Data.Aeson..= change_reason a ] @@ -119,6 +123,7 @@ instance Data.Aeson.FromJSON MigrateWorkspaceSchemaOutput where Control.Applicative.<*> (v Data.Aeson..: "auto_populate_control") Control.Applicative.<*> (v Data.Aeson..: "enable_context_validation") Control.Applicative.<*> (v Data.Aeson..: "enable_change_reason_validation") + Control.Applicative.<*> (v Data.Aeson..: "change_reason") @@ -140,7 +145,8 @@ data MigrateWorkspaceSchemaOutputBuilderState = MigrateWorkspaceSchemaOutputBuil allow_experiment_self_approvalBuilderState :: Data.Maybe.Maybe Bool, auto_populate_controlBuilderState :: Data.Maybe.Maybe Bool, enable_context_validationBuilderState :: Data.Maybe.Maybe Bool, - enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool + enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool, + change_reasonBuilderState :: Data.Maybe.Maybe Data.Text.Text } deriving ( GHC.Generics.Generic ) @@ -163,7 +169,8 @@ defaultBuilderState = MigrateWorkspaceSchemaOutputBuilderState { allow_experiment_self_approvalBuilderState = Data.Maybe.Nothing, auto_populate_controlBuilderState = Data.Maybe.Nothing, enable_context_validationBuilderState = Data.Maybe.Nothing, - enable_change_reason_validationBuilderState = Data.Maybe.Nothing + enable_change_reason_validationBuilderState = Data.Maybe.Nothing, + change_reasonBuilderState = Data.Maybe.Nothing } type MigrateWorkspaceSchemaOutputBuilder = Control.Monad.State.Strict.State MigrateWorkspaceSchemaOutputBuilderState @@ -236,6 +243,10 @@ setEnableChangeReasonValidation :: Bool -> MigrateWorkspaceSchemaOutputBuilder ( setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = Data.Maybe.Just value })) +setChangeReason :: Data.Text.Text -> MigrateWorkspaceSchemaOutputBuilder () +setChangeReason value = + Control.Monad.State.Strict.modify (\s -> (s { change_reasonBuilderState = Data.Maybe.Just value })) + build :: MigrateWorkspaceSchemaOutputBuilder () -> Data.Either.Either Data.Text.Text MigrateWorkspaceSchemaOutput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -256,6 +267,7 @@ build builder = do auto_populate_control' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.MigrateWorkspaceSchemaOutput.MigrateWorkspaceSchemaOutput.auto_populate_control is a required property.") Data.Either.Right (auto_populate_controlBuilderState st) enable_context_validation' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.MigrateWorkspaceSchemaOutput.MigrateWorkspaceSchemaOutput.enable_context_validation is a required property.") Data.Either.Right (enable_context_validationBuilderState st) enable_change_reason_validation' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.MigrateWorkspaceSchemaOutput.MigrateWorkspaceSchemaOutput.enable_change_reason_validation is a required property.") Data.Either.Right (enable_change_reason_validationBuilderState st) + change_reason' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.MigrateWorkspaceSchemaOutput.MigrateWorkspaceSchemaOutput.change_reason is a required property.") Data.Either.Right (change_reasonBuilderState st) Data.Either.Right (MigrateWorkspaceSchemaOutput { workspace_name = workspace_name', organisation_id = organisation_id', @@ -273,7 +285,8 @@ build builder = do allow_experiment_self_approval = allow_experiment_self_approval', auto_populate_control = auto_populate_control', enable_context_validation = enable_context_validation', - enable_change_reason_validation = enable_change_reason_validation' + enable_change_reason_validation = enable_change_reason_validation', + change_reason = change_reason' }) @@ -295,14 +308,15 @@ instance Io.Superposition.Utility.FromResponseParser MigrateWorkspaceSchemaOutpu var11 <- Io.Superposition.Utility.deSerField "last_modified_at" var12 <- Io.Superposition.Utility.deSerField "organisation_id" var13 <- Io.Superposition.Utility.deSerField "allow_experiment_self_approval" - var14 <- Io.Superposition.Utility.deSerField "workspace_schema_name" - var15 <- Io.Superposition.Utility.deSerField "metrics" - var16 <- Io.Superposition.Utility.deSerField "workspace_name" + var14 <- Io.Superposition.Utility.deSerField "change_reason" + var15 <- Io.Superposition.Utility.deSerField "workspace_schema_name" + var16 <- Io.Superposition.Utility.deSerField "metrics" + var17 <- Io.Superposition.Utility.deSerField "workspace_name" pure $ MigrateWorkspaceSchemaOutput { - workspace_name = var16, + workspace_name = var17, organisation_id = var12, organisation_name = var4, - workspace_schema_name = var14, + workspace_schema_name = var15, workspace_status = var10, workspace_admin_email = var0, config_version = var7, @@ -311,10 +325,11 @@ instance Io.Superposition.Utility.FromResponseParser MigrateWorkspaceSchemaOutpu last_modified_at = var11, created_at = var3, mandatory_dimensions = var8, - metrics = var15, + metrics = var16, allow_experiment_self_approval = var13, auto_populate_control = var1, enable_context_validation = var2, - enable_change_reason_validation = var9 + enable_change_reason_validation = var9, + change_reason = var14 } diff --git a/clients/haskell/sdk/Io/Superposition/Model/UpdateWorkspaceInput.hs b/clients/haskell/sdk/Io/Superposition/Model/UpdateWorkspaceInput.hs index 0d9fb7c78..d363e724b 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/UpdateWorkspaceInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/UpdateWorkspaceInput.hs @@ -10,6 +10,7 @@ module Io.Superposition.Model.UpdateWorkspaceInput ( setAutoPopulateControl, setEnableContextValidation, setEnableChangeReasonValidation, + setChangeReason, build, UpdateWorkspaceInputBuilder, UpdateWorkspaceInput, @@ -23,7 +24,8 @@ module Io.Superposition.Model.UpdateWorkspaceInput ( allow_experiment_self_approval, auto_populate_control, enable_context_validation, - enable_change_reason_validation + enable_change_reason_validation, + change_reason ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -50,7 +52,8 @@ data UpdateWorkspaceInput = UpdateWorkspaceInput { allow_experiment_self_approval :: Data.Maybe.Maybe Bool, auto_populate_control :: Data.Maybe.Maybe Bool, enable_context_validation :: Data.Maybe.Maybe Bool, - enable_change_reason_validation :: Data.Maybe.Maybe Bool + enable_change_reason_validation :: Data.Maybe.Maybe Bool, + change_reason :: Data.Maybe.Maybe Data.Text.Text } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -69,7 +72,8 @@ instance Data.Aeson.ToJSON UpdateWorkspaceInput where "allow_experiment_self_approval" Data.Aeson..= allow_experiment_self_approval a, "auto_populate_control" Data.Aeson..= auto_populate_control a, "enable_context_validation" Data.Aeson..= enable_context_validation a, - "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a + "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a, + "change_reason" Data.Aeson..= change_reason a ] @@ -88,6 +92,7 @@ instance Data.Aeson.FromJSON UpdateWorkspaceInput where Control.Applicative.<*> (v Data.Aeson..:? "auto_populate_control") Control.Applicative.<*> (v Data.Aeson..:? "enable_context_validation") Control.Applicative.<*> (v Data.Aeson..:? "enable_change_reason_validation") + Control.Applicative.<*> (v Data.Aeson..:? "change_reason") @@ -103,7 +108,8 @@ data UpdateWorkspaceInputBuilderState = UpdateWorkspaceInputBuilderState { allow_experiment_self_approvalBuilderState :: Data.Maybe.Maybe Bool, auto_populate_controlBuilderState :: Data.Maybe.Maybe Bool, enable_context_validationBuilderState :: Data.Maybe.Maybe Bool, - enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool + enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool, + change_reasonBuilderState :: Data.Maybe.Maybe Data.Text.Text } deriving ( GHC.Generics.Generic ) @@ -120,7 +126,8 @@ defaultBuilderState = UpdateWorkspaceInputBuilderState { allow_experiment_self_approvalBuilderState = Data.Maybe.Nothing, auto_populate_controlBuilderState = Data.Maybe.Nothing, enable_context_validationBuilderState = Data.Maybe.Nothing, - enable_change_reason_validationBuilderState = Data.Maybe.Nothing + enable_change_reason_validationBuilderState = Data.Maybe.Nothing, + change_reasonBuilderState = Data.Maybe.Nothing } type UpdateWorkspaceInputBuilder = Control.Monad.State.Strict.State UpdateWorkspaceInputBuilderState @@ -169,6 +176,10 @@ setEnableChangeReasonValidation :: Data.Maybe.Maybe Bool -> UpdateWorkspaceInput setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = value })) +setChangeReason :: Data.Maybe.Maybe Data.Text.Text -> UpdateWorkspaceInputBuilder () +setChangeReason value = + Control.Monad.State.Strict.modify (\s -> (s { change_reasonBuilderState = value })) + build :: UpdateWorkspaceInputBuilder () -> Data.Either.Either Data.Text.Text UpdateWorkspaceInput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -183,6 +194,7 @@ build builder = do auto_populate_control' <- Data.Either.Right (auto_populate_controlBuilderState st) enable_context_validation' <- Data.Either.Right (enable_context_validationBuilderState st) enable_change_reason_validation' <- Data.Either.Right (enable_change_reason_validationBuilderState st) + change_reason' <- Data.Either.Right (change_reasonBuilderState st) Data.Either.Right (UpdateWorkspaceInput { org_id = org_id', workspace_name = workspace_name', @@ -194,7 +206,8 @@ build builder = do allow_experiment_self_approval = allow_experiment_self_approval', auto_populate_control = auto_populate_control', enable_context_validation = enable_context_validation', - enable_change_reason_validation = enable_change_reason_validation' + enable_change_reason_validation = enable_change_reason_validation', + change_reason = change_reason' }) @@ -208,6 +221,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder UpdateWorkspaceInput where Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "allow_experiment_self_approval" (allow_experiment_self_approval self) + Io.Superposition.Utility.serField "change_reason" (change_reason self) Io.Superposition.Utility.serField "workspace_admin_email" (workspace_admin_email self) Io.Superposition.Utility.serField "auto_populate_control" (auto_populate_control self) Io.Superposition.Utility.serField "enable_context_validation" (enable_context_validation self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/UpdateWorkspaceOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/UpdateWorkspaceOutput.hs index b9638ca86..c970e1c03 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/UpdateWorkspaceOutput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/UpdateWorkspaceOutput.hs @@ -16,6 +16,7 @@ module Io.Superposition.Model.UpdateWorkspaceOutput ( setAutoPopulateControl, setEnableContextValidation, setEnableChangeReasonValidation, + setChangeReason, build, UpdateWorkspaceOutputBuilder, UpdateWorkspaceOutput, @@ -35,7 +36,8 @@ module Io.Superposition.Model.UpdateWorkspaceOutput ( allow_experiment_self_approval, auto_populate_control, enable_context_validation, - enable_change_reason_validation + enable_change_reason_validation, + change_reason ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -69,7 +71,8 @@ data UpdateWorkspaceOutput = UpdateWorkspaceOutput { allow_experiment_self_approval :: Bool, auto_populate_control :: Bool, enable_context_validation :: Bool, - enable_change_reason_validation :: Bool + enable_change_reason_validation :: Bool, + change_reason :: Data.Text.Text } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -94,7 +97,8 @@ instance Data.Aeson.ToJSON UpdateWorkspaceOutput where "allow_experiment_self_approval" Data.Aeson..= allow_experiment_self_approval a, "auto_populate_control" Data.Aeson..= auto_populate_control a, "enable_context_validation" Data.Aeson..= enable_context_validation a, - "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a + "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a, + "change_reason" Data.Aeson..= change_reason a ] @@ -119,6 +123,7 @@ instance Data.Aeson.FromJSON UpdateWorkspaceOutput where Control.Applicative.<*> (v Data.Aeson..: "auto_populate_control") Control.Applicative.<*> (v Data.Aeson..: "enable_context_validation") Control.Applicative.<*> (v Data.Aeson..: "enable_change_reason_validation") + Control.Applicative.<*> (v Data.Aeson..: "change_reason") @@ -140,7 +145,8 @@ data UpdateWorkspaceOutputBuilderState = UpdateWorkspaceOutputBuilderState { allow_experiment_self_approvalBuilderState :: Data.Maybe.Maybe Bool, auto_populate_controlBuilderState :: Data.Maybe.Maybe Bool, enable_context_validationBuilderState :: Data.Maybe.Maybe Bool, - enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool + enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool, + change_reasonBuilderState :: Data.Maybe.Maybe Data.Text.Text } deriving ( GHC.Generics.Generic ) @@ -163,7 +169,8 @@ defaultBuilderState = UpdateWorkspaceOutputBuilderState { allow_experiment_self_approvalBuilderState = Data.Maybe.Nothing, auto_populate_controlBuilderState = Data.Maybe.Nothing, enable_context_validationBuilderState = Data.Maybe.Nothing, - enable_change_reason_validationBuilderState = Data.Maybe.Nothing + enable_change_reason_validationBuilderState = Data.Maybe.Nothing, + change_reasonBuilderState = Data.Maybe.Nothing } type UpdateWorkspaceOutputBuilder = Control.Monad.State.Strict.State UpdateWorkspaceOutputBuilderState @@ -236,6 +243,10 @@ setEnableChangeReasonValidation :: Bool -> UpdateWorkspaceOutputBuilder () setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = Data.Maybe.Just value })) +setChangeReason :: Data.Text.Text -> UpdateWorkspaceOutputBuilder () +setChangeReason value = + Control.Monad.State.Strict.modify (\s -> (s { change_reasonBuilderState = Data.Maybe.Just value })) + build :: UpdateWorkspaceOutputBuilder () -> Data.Either.Either Data.Text.Text UpdateWorkspaceOutput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -256,6 +267,7 @@ build builder = do auto_populate_control' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.UpdateWorkspaceOutput.UpdateWorkspaceOutput.auto_populate_control is a required property.") Data.Either.Right (auto_populate_controlBuilderState st) enable_context_validation' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.UpdateWorkspaceOutput.UpdateWorkspaceOutput.enable_context_validation is a required property.") Data.Either.Right (enable_context_validationBuilderState st) enable_change_reason_validation' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.UpdateWorkspaceOutput.UpdateWorkspaceOutput.enable_change_reason_validation is a required property.") Data.Either.Right (enable_change_reason_validationBuilderState st) + change_reason' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.UpdateWorkspaceOutput.UpdateWorkspaceOutput.change_reason is a required property.") Data.Either.Right (change_reasonBuilderState st) Data.Either.Right (UpdateWorkspaceOutput { workspace_name = workspace_name', organisation_id = organisation_id', @@ -273,7 +285,8 @@ build builder = do allow_experiment_self_approval = allow_experiment_self_approval', auto_populate_control = auto_populate_control', enable_context_validation = enable_context_validation', - enable_change_reason_validation = enable_change_reason_validation' + enable_change_reason_validation = enable_change_reason_validation', + change_reason = change_reason' }) @@ -295,14 +308,15 @@ instance Io.Superposition.Utility.FromResponseParser UpdateWorkspaceOutput where var11 <- Io.Superposition.Utility.deSerField "last_modified_at" var12 <- Io.Superposition.Utility.deSerField "organisation_id" var13 <- Io.Superposition.Utility.deSerField "allow_experiment_self_approval" - var14 <- Io.Superposition.Utility.deSerField "workspace_schema_name" - var15 <- Io.Superposition.Utility.deSerField "metrics" - var16 <- Io.Superposition.Utility.deSerField "workspace_name" + var14 <- Io.Superposition.Utility.deSerField "change_reason" + var15 <- Io.Superposition.Utility.deSerField "workspace_schema_name" + var16 <- Io.Superposition.Utility.deSerField "metrics" + var17 <- Io.Superposition.Utility.deSerField "workspace_name" pure $ UpdateWorkspaceOutput { - workspace_name = var16, + workspace_name = var17, organisation_id = var12, organisation_name = var4, - workspace_schema_name = var14, + workspace_schema_name = var15, workspace_status = var10, workspace_admin_email = var0, config_version = var7, @@ -311,10 +325,11 @@ instance Io.Superposition.Utility.FromResponseParser UpdateWorkspaceOutput where last_modified_at = var11, created_at = var3, mandatory_dimensions = var8, - metrics = var15, + metrics = var16, allow_experiment_self_approval = var13, auto_populate_control = var1, enable_context_validation = var2, - enable_change_reason_validation = var9 + enable_change_reason_validation = var9, + change_reason = var14 } diff --git a/clients/haskell/sdk/Io/Superposition/Model/WorkspaceResponse.hs b/clients/haskell/sdk/Io/Superposition/Model/WorkspaceResponse.hs index 75925aa02..0229d8f01 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/WorkspaceResponse.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/WorkspaceResponse.hs @@ -16,6 +16,7 @@ module Io.Superposition.Model.WorkspaceResponse ( setAutoPopulateControl, setEnableContextValidation, setEnableChangeReasonValidation, + setChangeReason, build, WorkspaceResponseBuilder, WorkspaceResponse, @@ -35,7 +36,8 @@ module Io.Superposition.Model.WorkspaceResponse ( allow_experiment_self_approval, auto_populate_control, enable_context_validation, - enable_change_reason_validation + enable_change_reason_validation, + change_reason ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -68,7 +70,8 @@ data WorkspaceResponse = WorkspaceResponse { allow_experiment_self_approval :: Bool, auto_populate_control :: Bool, enable_context_validation :: Bool, - enable_change_reason_validation :: Bool + enable_change_reason_validation :: Bool, + change_reason :: Data.Text.Text } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -93,7 +96,8 @@ instance Data.Aeson.ToJSON WorkspaceResponse where "allow_experiment_self_approval" Data.Aeson..= allow_experiment_self_approval a, "auto_populate_control" Data.Aeson..= auto_populate_control a, "enable_context_validation" Data.Aeson..= enable_context_validation a, - "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a + "enable_change_reason_validation" Data.Aeson..= enable_change_reason_validation a, + "change_reason" Data.Aeson..= change_reason a ] @@ -118,6 +122,7 @@ instance Data.Aeson.FromJSON WorkspaceResponse where Control.Applicative.<*> (v Data.Aeson..: "auto_populate_control") Control.Applicative.<*> (v Data.Aeson..: "enable_context_validation") Control.Applicative.<*> (v Data.Aeson..: "enable_change_reason_validation") + Control.Applicative.<*> (v Data.Aeson..: "change_reason") @@ -139,7 +144,8 @@ data WorkspaceResponseBuilderState = WorkspaceResponseBuilderState { allow_experiment_self_approvalBuilderState :: Data.Maybe.Maybe Bool, auto_populate_controlBuilderState :: Data.Maybe.Maybe Bool, enable_context_validationBuilderState :: Data.Maybe.Maybe Bool, - enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool + enable_change_reason_validationBuilderState :: Data.Maybe.Maybe Bool, + change_reasonBuilderState :: Data.Maybe.Maybe Data.Text.Text } deriving ( GHC.Generics.Generic ) @@ -162,7 +168,8 @@ defaultBuilderState = WorkspaceResponseBuilderState { allow_experiment_self_approvalBuilderState = Data.Maybe.Nothing, auto_populate_controlBuilderState = Data.Maybe.Nothing, enable_context_validationBuilderState = Data.Maybe.Nothing, - enable_change_reason_validationBuilderState = Data.Maybe.Nothing + enable_change_reason_validationBuilderState = Data.Maybe.Nothing, + change_reasonBuilderState = Data.Maybe.Nothing } type WorkspaceResponseBuilder = Control.Monad.State.Strict.State WorkspaceResponseBuilderState @@ -235,6 +242,10 @@ setEnableChangeReasonValidation :: Bool -> WorkspaceResponseBuilder () setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = Data.Maybe.Just value })) +setChangeReason :: Data.Text.Text -> WorkspaceResponseBuilder () +setChangeReason value = + Control.Monad.State.Strict.modify (\s -> (s { change_reasonBuilderState = Data.Maybe.Just value })) + build :: WorkspaceResponseBuilder () -> Data.Either.Either Data.Text.Text WorkspaceResponse build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -255,6 +266,7 @@ build builder = do auto_populate_control' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.WorkspaceResponse.WorkspaceResponse.auto_populate_control is a required property.") Data.Either.Right (auto_populate_controlBuilderState st) enable_context_validation' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.WorkspaceResponse.WorkspaceResponse.enable_context_validation is a required property.") Data.Either.Right (enable_context_validationBuilderState st) enable_change_reason_validation' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.WorkspaceResponse.WorkspaceResponse.enable_change_reason_validation is a required property.") Data.Either.Right (enable_change_reason_validationBuilderState st) + change_reason' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.WorkspaceResponse.WorkspaceResponse.change_reason is a required property.") Data.Either.Right (change_reasonBuilderState st) Data.Either.Right (WorkspaceResponse { workspace_name = workspace_name', organisation_id = organisation_id', @@ -272,7 +284,8 @@ build builder = do allow_experiment_self_approval = allow_experiment_self_approval', auto_populate_control = auto_populate_control', enable_context_validation = enable_context_validation', - enable_change_reason_validation = enable_change_reason_validation' + enable_change_reason_validation = enable_change_reason_validation', + change_reason = change_reason' }) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java index 6a80e01ce..158b62686 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java @@ -1773,12 +1773,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); - private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); - private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); + private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); + private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); + private Builder() { configBuilder().putSupportedAuthSchemes(httpBasicAuthSchemeFactory.createAuthScheme(httpBasicAuthScheme), httpBearerAuthSchemeFactory.createAuthScheme(httpBearerAuthScheme)); } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java index e08d63e6d..f10194667 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java @@ -266,9 +266,9 @@ @SmithyGenerated final class SuperpositionAsyncClientImpl extends Client implements SuperpositionAsyncClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) .putType(MalformedRequestException.$ID, MalformedRequestException.class, MalformedRequestException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java index 7f3a64d31..583c5ef0c 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java @@ -1772,12 +1772,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); - private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); - private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); + private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); + private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); + private Builder() { configBuilder().putSupportedAuthSchemes(httpBasicAuthSchemeFactory.createAuthScheme(httpBasicAuthScheme), httpBearerAuthSchemeFactory.createAuthScheme(httpBearerAuthScheme)); } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java index 904ada31e..7b032e550 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java @@ -266,9 +266,9 @@ @SmithyGenerated final class SuperpositionClientImpl extends Client implements SuperpositionClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) .putType(MalformedRequestException.$ID, MalformedRequestException.class, MalformedRequestException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/CreateWorkspaceInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/CreateWorkspaceInput.java index 3121cd256..4b7d199d8 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/CreateWorkspaceInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/CreateWorkspaceInput.java @@ -35,6 +35,8 @@ public final class CreateWorkspaceInput implements SerializableStruct { .putMember("auto_populate_control", PreludeSchemas.BOOLEAN) .putMember("enable_context_validation", PreludeSchemas.BOOLEAN) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN) + .putMember("change_reason", PreludeSchemas.STRING, + new RequiredTrait()) .build(); private static final Schema $SCHEMA_ORG_ID = $SCHEMA.member("org_id"); @@ -46,6 +48,7 @@ public final class CreateWorkspaceInput implements SerializableStruct { private static final Schema $SCHEMA_AUTO_POPULATE_CONTROL = $SCHEMA.member("auto_populate_control"); private static final Schema $SCHEMA_ENABLE_CONTEXT_VALIDATION = $SCHEMA.member("enable_context_validation"); private static final Schema $SCHEMA_ENABLE_CHANGE_REASON_VALIDATION = $SCHEMA.member("enable_change_reason_validation"); + private static final Schema $SCHEMA_CHANGE_REASON = $SCHEMA.member("change_reason"); private final transient String orgId; private final transient String workspaceAdminEmail; @@ -56,6 +59,7 @@ public final class CreateWorkspaceInput implements SerializableStruct { private final transient Boolean autoPopulateControl; private final transient Boolean enableContextValidation; private final transient Boolean enableChangeReasonValidation; + private final transient String changeReason; private CreateWorkspaceInput(Builder builder) { this.orgId = builder.orgId; @@ -67,6 +71,7 @@ private CreateWorkspaceInput(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.changeReason = builder.changeReason; } public String orgId() { @@ -105,6 +110,10 @@ public Boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public String changeReason() { + return changeReason; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -127,12 +136,13 @@ public boolean equals(Object other) { && Objects.equals(this.allowExperimentSelfApproval, that.allowExperimentSelfApproval) && Objects.equals(this.autoPopulateControl, that.autoPopulateControl) && Objects.equals(this.enableContextValidation, that.enableContextValidation) - && Objects.equals(this.enableChangeReasonValidation, that.enableChangeReasonValidation); + && Objects.equals(this.enableChangeReasonValidation, that.enableChangeReasonValidation) + && Objects.equals(this.changeReason, that.changeReason); } @Override public int hashCode() { - return Objects.hash(orgId, workspaceAdminEmail, workspaceName, workspaceStatus, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation); + return Objects.hash(orgId, workspaceAdminEmail, workspaceName, workspaceStatus, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation, changeReason); } @Override @@ -163,6 +173,7 @@ public void serializeMembers(ShapeSerializer serializer) { if (enableChangeReasonValidation != null) { serializer.writeBoolean($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, enableChangeReasonValidation); } + serializer.writeString($SCHEMA_CHANGE_REASON, changeReason); } @Override @@ -172,12 +183,13 @@ public T getMemberValue(Schema member) { case 0 -> (T) SchemaUtils.validateSameMember($SCHEMA_ORG_ID, member, orgId); case 1 -> (T) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_ADMIN_EMAIL, member, workspaceAdminEmail); case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_NAME, member, workspaceName); - case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_STATUS, member, workspaceStatus); - case 4 -> (T) SchemaUtils.validateSameMember($SCHEMA_METRICS, member, metrics); - case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_ALLOW_EXPERIMENT_SELF_APPROVAL, member, allowExperimentSelfApproval); - case 6 -> (T) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, autoPopulateControl); - case 7 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, enableContextValidation); - case 8 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, enableChangeReasonValidation); + case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, changeReason); + case 4 -> (T) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_STATUS, member, workspaceStatus); + case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_METRICS, member, metrics); + case 6 -> (T) SchemaUtils.validateSameMember($SCHEMA_ALLOW_EXPERIMENT_SELF_APPROVAL, member, allowExperimentSelfApproval); + case 7 -> (T) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, autoPopulateControl); + case 8 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, enableContextValidation); + case 9 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, enableChangeReasonValidation); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -200,6 +212,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.changeReason(this.changeReason); return builder; } @@ -224,6 +237,7 @@ public static final class Builder implements ShapeBuilder private Boolean autoPopulateControl; private Boolean enableContextValidation; private Boolean enableChangeReasonValidation; + private String changeReason; private Builder() {} @@ -310,6 +324,16 @@ public Builder enableChangeReasonValidation(boolean enableChangeReasonValidation return this; } + /** + *

Required + * @return this builder. + */ + public Builder changeReason(String changeReason) { + this.changeReason = Objects.requireNonNull(changeReason, "changeReason cannot be null"); + tracker.setMember($SCHEMA_CHANGE_REASON); + return this; + } + @Override public CreateWorkspaceInput build() { tracker.validate(); @@ -323,12 +347,13 @@ public void setMemberValue(Schema member, Object value) { case 0 -> orgId((String) SchemaUtils.validateSameMember($SCHEMA_ORG_ID, member, value)); case 1 -> workspaceAdminEmail((String) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_ADMIN_EMAIL, member, value)); case 2 -> workspaceName((String) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_NAME, member, value)); - case 3 -> workspaceStatus((WorkspaceStatus) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_STATUS, member, value)); - case 4 -> metrics((Document) SchemaUtils.validateSameMember($SCHEMA_METRICS, member, value)); - case 5 -> allowExperimentSelfApproval((boolean) SchemaUtils.validateSameMember($SCHEMA_ALLOW_EXPERIMENT_SELF_APPROVAL, member, value)); - case 6 -> autoPopulateControl((boolean) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, value)); - case 7 -> enableContextValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, value)); - case 8 -> enableChangeReasonValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, value)); + case 3 -> changeReason((String) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, value)); + case 4 -> workspaceStatus((WorkspaceStatus) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_STATUS, member, value)); + case 5 -> metrics((Document) SchemaUtils.validateSameMember($SCHEMA_METRICS, member, value)); + case 6 -> allowExperimentSelfApproval((boolean) SchemaUtils.validateSameMember($SCHEMA_ALLOW_EXPERIMENT_SELF_APPROVAL, member, value)); + case 7 -> autoPopulateControl((boolean) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, value)); + case 8 -> enableContextValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, value)); + case 9 -> enableChangeReasonValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -347,6 +372,9 @@ public ShapeBuilder errorCorrection() { if (!tracker.checkMember($SCHEMA_WORKSPACE_NAME)) { workspaceName(""); } + if (!tracker.checkMember($SCHEMA_CHANGE_REASON)) { + changeReason(""); + } return this; } @@ -371,12 +399,13 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 0 -> builder.orgId(de.readString(member)); case 1 -> builder.workspaceAdminEmail(de.readString(member)); case 2 -> builder.workspaceName(de.readString(member)); - case 3 -> builder.workspaceStatus(WorkspaceStatus.builder().deserializeMember(de, member).build()); - case 4 -> builder.metrics(de.readDocument()); - case 5 -> builder.allowExperimentSelfApproval(de.readBoolean(member)); - case 6 -> builder.autoPopulateControl(de.readBoolean(member)); - case 7 -> builder.enableContextValidation(de.readBoolean(member)); - case 8 -> builder.enableChangeReasonValidation(de.readBoolean(member)); + case 3 -> builder.changeReason(de.readString(member)); + case 4 -> builder.workspaceStatus(WorkspaceStatus.builder().deserializeMember(de, member).build()); + case 5 -> builder.metrics(de.readDocument()); + case 6 -> builder.allowExperimentSelfApproval(de.readBoolean(member)); + case 7 -> builder.autoPopulateControl(de.readBoolean(member)); + case 8 -> builder.enableContextValidation(de.readBoolean(member)); + case 9 -> builder.enableChangeReasonValidation(de.readBoolean(member)); default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/CreateWorkspaceOutput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/CreateWorkspaceOutput.java index 1f4409bbe..73f4c0fda 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/CreateWorkspaceOutput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/CreateWorkspaceOutput.java @@ -56,6 +56,8 @@ public final class CreateWorkspaceOutput implements SerializableStruct { new RequiredTrait()) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN, new RequiredTrait()) + .putMember("change_reason", PreludeSchemas.STRING, + new RequiredTrait()) .build(); private static final Schema $SCHEMA_WORKSPACE_NAME = $SCHEMA.member("workspace_name"); @@ -75,6 +77,7 @@ public final class CreateWorkspaceOutput implements SerializableStruct { private static final Schema $SCHEMA_AUTO_POPULATE_CONTROL = $SCHEMA.member("auto_populate_control"); private static final Schema $SCHEMA_ENABLE_CONTEXT_VALIDATION = $SCHEMA.member("enable_context_validation"); private static final Schema $SCHEMA_ENABLE_CHANGE_REASON_VALIDATION = $SCHEMA.member("enable_change_reason_validation"); + private static final Schema $SCHEMA_CHANGE_REASON = $SCHEMA.member("change_reason"); private final transient String workspaceName; private final transient String organisationId; @@ -93,6 +96,7 @@ public final class CreateWorkspaceOutput implements SerializableStruct { private final transient boolean autoPopulateControl; private final transient boolean enableContextValidation; private final transient boolean enableChangeReasonValidation; + private final transient String changeReason; private CreateWorkspaceOutput(Builder builder) { this.workspaceName = builder.workspaceName; @@ -112,6 +116,7 @@ private CreateWorkspaceOutput(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.changeReason = builder.changeReason; } public String workspaceName() { @@ -189,6 +194,10 @@ public boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public String changeReason() { + return changeReason; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -219,12 +228,13 @@ public boolean equals(Object other) { && this.allowExperimentSelfApproval == that.allowExperimentSelfApproval && this.autoPopulateControl == that.autoPopulateControl && this.enableContextValidation == that.enableContextValidation - && this.enableChangeReasonValidation == that.enableChangeReasonValidation; + && this.enableChangeReasonValidation == that.enableChangeReasonValidation + && Objects.equals(this.changeReason, that.changeReason); } @Override public int hashCode() { - return Objects.hash(workspaceName, organisationId, organisationName, workspaceSchemaName, workspaceStatus, workspaceAdminEmail, configVersion, createdBy, lastModifiedBy, lastModifiedAt, createdAt, mandatoryDimensions, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation); + return Objects.hash(workspaceName, organisationId, organisationName, workspaceSchemaName, workspaceStatus, workspaceAdminEmail, configVersion, createdBy, lastModifiedBy, lastModifiedAt, createdAt, mandatoryDimensions, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation, changeReason); } @Override @@ -255,6 +265,7 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeBoolean($SCHEMA_AUTO_POPULATE_CONTROL, autoPopulateControl); serializer.writeBoolean($SCHEMA_ENABLE_CONTEXT_VALIDATION, enableContextValidation); serializer.writeBoolean($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, enableChangeReasonValidation); + serializer.writeString($SCHEMA_CHANGE_REASON, changeReason); } @Override @@ -276,8 +287,9 @@ public T getMemberValue(Schema member) { case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, autoPopulateControl); case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, enableContextValidation); case 14 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, enableChangeReasonValidation); - case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, configVersion); - case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, mandatoryDimensions); + case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, changeReason); + case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, configVersion); + case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, mandatoryDimensions); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -308,6 +320,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.changeReason(this.changeReason); return builder; } @@ -340,6 +353,7 @@ public static final class Builder implements ShapeBuilder private boolean autoPopulateControl; private boolean enableContextValidation; private boolean enableChangeReasonValidation; + private String changeReason; private Builder() {} @@ -514,6 +528,16 @@ public Builder enableChangeReasonValidation(boolean enableChangeReasonValidation return this; } + /** + *

Required + * @return this builder. + */ + public Builder changeReason(String changeReason) { + this.changeReason = Objects.requireNonNull(changeReason, "changeReason cannot be null"); + tracker.setMember($SCHEMA_CHANGE_REASON); + return this; + } + @Override public CreateWorkspaceOutput build() { tracker.validate(); @@ -539,8 +563,9 @@ public void setMemberValue(Schema member, Object value) { case 12 -> autoPopulateControl((boolean) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, value)); case 13 -> enableContextValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, value)); case 14 -> enableChangeReasonValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, value)); - case 15 -> configVersion((String) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, value)); - case 16 -> mandatoryDimensions((List) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, value)); + case 15 -> changeReason((String) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, value)); + case 16 -> configVersion((String) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, value)); + case 17 -> mandatoryDimensions((List) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -595,6 +620,9 @@ public ShapeBuilder errorCorrection() { if (!tracker.checkMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION)) { tracker.setMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION); } + if (!tracker.checkMember($SCHEMA_CHANGE_REASON)) { + changeReason(""); + } return this; } @@ -631,8 +659,9 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 12 -> builder.autoPopulateControl(de.readBoolean(member)); case 13 -> builder.enableContextValidation(de.readBoolean(member)); case 14 -> builder.enableChangeReasonValidation(de.readBoolean(member)); - case 15 -> builder.configVersion(de.readString(member)); - case 16 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); + case 15 -> builder.changeReason(de.readString(member)); + case 16 -> builder.configVersion(de.readString(member)); + case 17 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetWorkspaceOutput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetWorkspaceOutput.java index ab1c1dcac..dade6d154 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetWorkspaceOutput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetWorkspaceOutput.java @@ -56,6 +56,8 @@ public final class GetWorkspaceOutput implements SerializableStruct { new RequiredTrait()) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN, new RequiredTrait()) + .putMember("change_reason", PreludeSchemas.STRING, + new RequiredTrait()) .build(); private static final Schema $SCHEMA_WORKSPACE_NAME = $SCHEMA.member("workspace_name"); @@ -75,6 +77,7 @@ public final class GetWorkspaceOutput implements SerializableStruct { private static final Schema $SCHEMA_AUTO_POPULATE_CONTROL = $SCHEMA.member("auto_populate_control"); private static final Schema $SCHEMA_ENABLE_CONTEXT_VALIDATION = $SCHEMA.member("enable_context_validation"); private static final Schema $SCHEMA_ENABLE_CHANGE_REASON_VALIDATION = $SCHEMA.member("enable_change_reason_validation"); + private static final Schema $SCHEMA_CHANGE_REASON = $SCHEMA.member("change_reason"); private final transient String workspaceName; private final transient String organisationId; @@ -93,6 +96,7 @@ public final class GetWorkspaceOutput implements SerializableStruct { private final transient boolean autoPopulateControl; private final transient boolean enableContextValidation; private final transient boolean enableChangeReasonValidation; + private final transient String changeReason; private GetWorkspaceOutput(Builder builder) { this.workspaceName = builder.workspaceName; @@ -112,6 +116,7 @@ private GetWorkspaceOutput(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.changeReason = builder.changeReason; } public String workspaceName() { @@ -189,6 +194,10 @@ public boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public String changeReason() { + return changeReason; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -219,12 +228,13 @@ public boolean equals(Object other) { && this.allowExperimentSelfApproval == that.allowExperimentSelfApproval && this.autoPopulateControl == that.autoPopulateControl && this.enableContextValidation == that.enableContextValidation - && this.enableChangeReasonValidation == that.enableChangeReasonValidation; + && this.enableChangeReasonValidation == that.enableChangeReasonValidation + && Objects.equals(this.changeReason, that.changeReason); } @Override public int hashCode() { - return Objects.hash(workspaceName, organisationId, organisationName, workspaceSchemaName, workspaceStatus, workspaceAdminEmail, configVersion, createdBy, lastModifiedBy, lastModifiedAt, createdAt, mandatoryDimensions, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation); + return Objects.hash(workspaceName, organisationId, organisationName, workspaceSchemaName, workspaceStatus, workspaceAdminEmail, configVersion, createdBy, lastModifiedBy, lastModifiedAt, createdAt, mandatoryDimensions, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation, changeReason); } @Override @@ -255,6 +265,7 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeBoolean($SCHEMA_AUTO_POPULATE_CONTROL, autoPopulateControl); serializer.writeBoolean($SCHEMA_ENABLE_CONTEXT_VALIDATION, enableContextValidation); serializer.writeBoolean($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, enableChangeReasonValidation); + serializer.writeString($SCHEMA_CHANGE_REASON, changeReason); } @Override @@ -276,8 +287,9 @@ public T getMemberValue(Schema member) { case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, autoPopulateControl); case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, enableContextValidation); case 14 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, enableChangeReasonValidation); - case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, configVersion); - case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, mandatoryDimensions); + case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, changeReason); + case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, configVersion); + case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, mandatoryDimensions); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -308,6 +320,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.changeReason(this.changeReason); return builder; } @@ -340,6 +353,7 @@ public static final class Builder implements ShapeBuilder { private boolean autoPopulateControl; private boolean enableContextValidation; private boolean enableChangeReasonValidation; + private String changeReason; private Builder() {} @@ -514,6 +528,16 @@ public Builder enableChangeReasonValidation(boolean enableChangeReasonValidation return this; } + /** + *

Required + * @return this builder. + */ + public Builder changeReason(String changeReason) { + this.changeReason = Objects.requireNonNull(changeReason, "changeReason cannot be null"); + tracker.setMember($SCHEMA_CHANGE_REASON); + return this; + } + @Override public GetWorkspaceOutput build() { tracker.validate(); @@ -539,8 +563,9 @@ public void setMemberValue(Schema member, Object value) { case 12 -> autoPopulateControl((boolean) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, value)); case 13 -> enableContextValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, value)); case 14 -> enableChangeReasonValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, value)); - case 15 -> configVersion((String) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, value)); - case 16 -> mandatoryDimensions((List) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, value)); + case 15 -> changeReason((String) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, value)); + case 16 -> configVersion((String) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, value)); + case 17 -> mandatoryDimensions((List) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -595,6 +620,9 @@ public ShapeBuilder errorCorrection() { if (!tracker.checkMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION)) { tracker.setMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION); } + if (!tracker.checkMember($SCHEMA_CHANGE_REASON)) { + changeReason(""); + } return this; } @@ -631,8 +659,9 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 12 -> builder.autoPopulateControl(de.readBoolean(member)); case 13 -> builder.enableContextValidation(de.readBoolean(member)); case 14 -> builder.enableChangeReasonValidation(de.readBoolean(member)); - case 15 -> builder.configVersion(de.readString(member)); - case 16 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); + case 15 -> builder.changeReason(de.readString(member)); + case 16 -> builder.configVersion(de.readString(member)); + case 17 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/MigrateWorkspaceSchemaOutput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/MigrateWorkspaceSchemaOutput.java index 9ecbdc6b1..1a44f4cae 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/MigrateWorkspaceSchemaOutput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/MigrateWorkspaceSchemaOutput.java @@ -56,6 +56,8 @@ public final class MigrateWorkspaceSchemaOutput implements SerializableStruct { new RequiredTrait()) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN, new RequiredTrait()) + .putMember("change_reason", PreludeSchemas.STRING, + new RequiredTrait()) .build(); private static final Schema $SCHEMA_WORKSPACE_NAME = $SCHEMA.member("workspace_name"); @@ -75,6 +77,7 @@ public final class MigrateWorkspaceSchemaOutput implements SerializableStruct { private static final Schema $SCHEMA_AUTO_POPULATE_CONTROL = $SCHEMA.member("auto_populate_control"); private static final Schema $SCHEMA_ENABLE_CONTEXT_VALIDATION = $SCHEMA.member("enable_context_validation"); private static final Schema $SCHEMA_ENABLE_CHANGE_REASON_VALIDATION = $SCHEMA.member("enable_change_reason_validation"); + private static final Schema $SCHEMA_CHANGE_REASON = $SCHEMA.member("change_reason"); private final transient String workspaceName; private final transient String organisationId; @@ -93,6 +96,7 @@ public final class MigrateWorkspaceSchemaOutput implements SerializableStruct { private final transient boolean autoPopulateControl; private final transient boolean enableContextValidation; private final transient boolean enableChangeReasonValidation; + private final transient String changeReason; private MigrateWorkspaceSchemaOutput(Builder builder) { this.workspaceName = builder.workspaceName; @@ -112,6 +116,7 @@ private MigrateWorkspaceSchemaOutput(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.changeReason = builder.changeReason; } public String workspaceName() { @@ -189,6 +194,10 @@ public boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public String changeReason() { + return changeReason; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -219,12 +228,13 @@ public boolean equals(Object other) { && this.allowExperimentSelfApproval == that.allowExperimentSelfApproval && this.autoPopulateControl == that.autoPopulateControl && this.enableContextValidation == that.enableContextValidation - && this.enableChangeReasonValidation == that.enableChangeReasonValidation; + && this.enableChangeReasonValidation == that.enableChangeReasonValidation + && Objects.equals(this.changeReason, that.changeReason); } @Override public int hashCode() { - return Objects.hash(workspaceName, organisationId, organisationName, workspaceSchemaName, workspaceStatus, workspaceAdminEmail, configVersion, createdBy, lastModifiedBy, lastModifiedAt, createdAt, mandatoryDimensions, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation); + return Objects.hash(workspaceName, organisationId, organisationName, workspaceSchemaName, workspaceStatus, workspaceAdminEmail, configVersion, createdBy, lastModifiedBy, lastModifiedAt, createdAt, mandatoryDimensions, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation, changeReason); } @Override @@ -255,6 +265,7 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeBoolean($SCHEMA_AUTO_POPULATE_CONTROL, autoPopulateControl); serializer.writeBoolean($SCHEMA_ENABLE_CONTEXT_VALIDATION, enableContextValidation); serializer.writeBoolean($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, enableChangeReasonValidation); + serializer.writeString($SCHEMA_CHANGE_REASON, changeReason); } @Override @@ -276,8 +287,9 @@ public T getMemberValue(Schema member) { case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, autoPopulateControl); case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, enableContextValidation); case 14 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, enableChangeReasonValidation); - case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, configVersion); - case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, mandatoryDimensions); + case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, changeReason); + case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, configVersion); + case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, mandatoryDimensions); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -308,6 +320,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.changeReason(this.changeReason); return builder; } @@ -340,6 +353,7 @@ public static final class Builder implements ShapeBuilderRequired + * @return this builder. + */ + public Builder changeReason(String changeReason) { + this.changeReason = Objects.requireNonNull(changeReason, "changeReason cannot be null"); + tracker.setMember($SCHEMA_CHANGE_REASON); + return this; + } + @Override public MigrateWorkspaceSchemaOutput build() { tracker.validate(); @@ -539,8 +563,9 @@ public void setMemberValue(Schema member, Object value) { case 12 -> autoPopulateControl((boolean) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, value)); case 13 -> enableContextValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, value)); case 14 -> enableChangeReasonValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, value)); - case 15 -> configVersion((String) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, value)); - case 16 -> mandatoryDimensions((List) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, value)); + case 15 -> changeReason((String) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, value)); + case 16 -> configVersion((String) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, value)); + case 17 -> mandatoryDimensions((List) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -595,6 +620,9 @@ public ShapeBuilder errorCorrection() { if (!tracker.checkMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION)) { tracker.setMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION); } + if (!tracker.checkMember($SCHEMA_CHANGE_REASON)) { + changeReason(""); + } return this; } @@ -631,8 +659,9 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 12 -> builder.autoPopulateControl(de.readBoolean(member)); case 13 -> builder.enableContextValidation(de.readBoolean(member)); case 14 -> builder.enableChangeReasonValidation(de.readBoolean(member)); - case 15 -> builder.configVersion(de.readString(member)); - case 16 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); + case 15 -> builder.changeReason(de.readString(member)); + case 16 -> builder.configVersion(de.readString(member)); + case 17 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateWorkspaceInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateWorkspaceInput.java index 0a6684b65..eda6dfa56 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateWorkspaceInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateWorkspaceInput.java @@ -41,6 +41,7 @@ public final class UpdateWorkspaceInput implements SerializableStruct { .putMember("auto_populate_control", PreludeSchemas.BOOLEAN) .putMember("enable_context_validation", PreludeSchemas.BOOLEAN) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN) + .putMember("change_reason", PreludeSchemas.STRING) .build(); private static final Schema $SCHEMA_ORG_ID = $SCHEMA.member("org_id"); @@ -54,6 +55,7 @@ public final class UpdateWorkspaceInput implements SerializableStruct { private static final Schema $SCHEMA_AUTO_POPULATE_CONTROL = $SCHEMA.member("auto_populate_control"); private static final Schema $SCHEMA_ENABLE_CONTEXT_VALIDATION = $SCHEMA.member("enable_context_validation"); private static final Schema $SCHEMA_ENABLE_CHANGE_REASON_VALIDATION = $SCHEMA.member("enable_change_reason_validation"); + private static final Schema $SCHEMA_CHANGE_REASON = $SCHEMA.member("change_reason"); private final transient String orgId; private final transient String workspaceName; @@ -66,6 +68,7 @@ public final class UpdateWorkspaceInput implements SerializableStruct { private final transient Boolean autoPopulateControl; private final transient Boolean enableContextValidation; private final transient Boolean enableChangeReasonValidation; + private final transient String changeReason; private UpdateWorkspaceInput(Builder builder) { this.orgId = builder.orgId; @@ -79,6 +82,7 @@ private UpdateWorkspaceInput(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.changeReason = builder.changeReason; } public String orgId() { @@ -135,6 +139,10 @@ public Boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public String changeReason() { + return changeReason; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -159,12 +167,13 @@ public boolean equals(Object other) { && Objects.equals(this.allowExperimentSelfApproval, that.allowExperimentSelfApproval) && Objects.equals(this.autoPopulateControl, that.autoPopulateControl) && Objects.equals(this.enableContextValidation, that.enableContextValidation) - && Objects.equals(this.enableChangeReasonValidation, that.enableChangeReasonValidation); + && Objects.equals(this.enableChangeReasonValidation, that.enableChangeReasonValidation) + && Objects.equals(this.changeReason, that.changeReason); } @Override public int hashCode() { - return Objects.hash(orgId, workspaceName, workspaceAdminEmail, configVersion, mandatoryDimensions, workspaceStatus, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation); + return Objects.hash(orgId, workspaceName, workspaceAdminEmail, configVersion, mandatoryDimensions, workspaceStatus, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation, changeReason); } @Override @@ -201,6 +210,9 @@ public void serializeMembers(ShapeSerializer serializer) { if (enableChangeReasonValidation != null) { serializer.writeBoolean($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, enableChangeReasonValidation); } + if (changeReason != null) { + serializer.writeString($SCHEMA_CHANGE_REASON, changeReason); + } } @Override @@ -218,6 +230,7 @@ public T getMemberValue(Schema member) { case 8 -> (T) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, autoPopulateControl); case 9 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, enableContextValidation); case 10 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, enableChangeReasonValidation); + case 11 -> (T) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, changeReason); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -242,6 +255,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.changeReason(this.changeReason); return builder; } @@ -268,6 +282,7 @@ public static final class Builder implements ShapeBuilder private Boolean autoPopulateControl; private Boolean enableContextValidation; private Boolean enableChangeReasonValidation; + private String changeReason; private Builder() {} @@ -372,6 +387,14 @@ public Builder enableChangeReasonValidation(boolean enableChangeReasonValidation return this; } + /** + * @return this builder. + */ + public Builder changeReason(String changeReason) { + this.changeReason = changeReason; + return this; + } + @Override public UpdateWorkspaceInput build() { tracker.validate(); @@ -393,6 +416,7 @@ public void setMemberValue(Schema member, Object value) { case 8 -> autoPopulateControl((boolean) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, value)); case 9 -> enableContextValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, value)); case 10 -> enableChangeReasonValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, value)); + case 11 -> changeReason((String) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -443,6 +467,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 8 -> builder.autoPopulateControl(de.readBoolean(member)); case 9 -> builder.enableContextValidation(de.readBoolean(member)); case 10 -> builder.enableChangeReasonValidation(de.readBoolean(member)); + case 11 -> builder.changeReason(de.readString(member)); default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateWorkspaceOutput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateWorkspaceOutput.java index 6ff3d93eb..30db78997 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateWorkspaceOutput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateWorkspaceOutput.java @@ -56,6 +56,8 @@ public final class UpdateWorkspaceOutput implements SerializableStruct { new RequiredTrait()) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN, new RequiredTrait()) + .putMember("change_reason", PreludeSchemas.STRING, + new RequiredTrait()) .build(); private static final Schema $SCHEMA_WORKSPACE_NAME = $SCHEMA.member("workspace_name"); @@ -75,6 +77,7 @@ public final class UpdateWorkspaceOutput implements SerializableStruct { private static final Schema $SCHEMA_AUTO_POPULATE_CONTROL = $SCHEMA.member("auto_populate_control"); private static final Schema $SCHEMA_ENABLE_CONTEXT_VALIDATION = $SCHEMA.member("enable_context_validation"); private static final Schema $SCHEMA_ENABLE_CHANGE_REASON_VALIDATION = $SCHEMA.member("enable_change_reason_validation"); + private static final Schema $SCHEMA_CHANGE_REASON = $SCHEMA.member("change_reason"); private final transient String workspaceName; private final transient String organisationId; @@ -93,6 +96,7 @@ public final class UpdateWorkspaceOutput implements SerializableStruct { private final transient boolean autoPopulateControl; private final transient boolean enableContextValidation; private final transient boolean enableChangeReasonValidation; + private final transient String changeReason; private UpdateWorkspaceOutput(Builder builder) { this.workspaceName = builder.workspaceName; @@ -112,6 +116,7 @@ private UpdateWorkspaceOutput(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.changeReason = builder.changeReason; } public String workspaceName() { @@ -189,6 +194,10 @@ public boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public String changeReason() { + return changeReason; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -219,12 +228,13 @@ public boolean equals(Object other) { && this.allowExperimentSelfApproval == that.allowExperimentSelfApproval && this.autoPopulateControl == that.autoPopulateControl && this.enableContextValidation == that.enableContextValidation - && this.enableChangeReasonValidation == that.enableChangeReasonValidation; + && this.enableChangeReasonValidation == that.enableChangeReasonValidation + && Objects.equals(this.changeReason, that.changeReason); } @Override public int hashCode() { - return Objects.hash(workspaceName, organisationId, organisationName, workspaceSchemaName, workspaceStatus, workspaceAdminEmail, configVersion, createdBy, lastModifiedBy, lastModifiedAt, createdAt, mandatoryDimensions, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation); + return Objects.hash(workspaceName, organisationId, organisationName, workspaceSchemaName, workspaceStatus, workspaceAdminEmail, configVersion, createdBy, lastModifiedBy, lastModifiedAt, createdAt, mandatoryDimensions, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation, changeReason); } @Override @@ -255,6 +265,7 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeBoolean($SCHEMA_AUTO_POPULATE_CONTROL, autoPopulateControl); serializer.writeBoolean($SCHEMA_ENABLE_CONTEXT_VALIDATION, enableContextValidation); serializer.writeBoolean($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, enableChangeReasonValidation); + serializer.writeString($SCHEMA_CHANGE_REASON, changeReason); } @Override @@ -276,8 +287,9 @@ public T getMemberValue(Schema member) { case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, autoPopulateControl); case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, enableContextValidation); case 14 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, enableChangeReasonValidation); - case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, configVersion); - case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, mandatoryDimensions); + case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, changeReason); + case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, configVersion); + case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, mandatoryDimensions); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -308,6 +320,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.changeReason(this.changeReason); return builder; } @@ -340,6 +353,7 @@ public static final class Builder implements ShapeBuilder private boolean autoPopulateControl; private boolean enableContextValidation; private boolean enableChangeReasonValidation; + private String changeReason; private Builder() {} @@ -514,6 +528,16 @@ public Builder enableChangeReasonValidation(boolean enableChangeReasonValidation return this; } + /** + *

Required + * @return this builder. + */ + public Builder changeReason(String changeReason) { + this.changeReason = Objects.requireNonNull(changeReason, "changeReason cannot be null"); + tracker.setMember($SCHEMA_CHANGE_REASON); + return this; + } + @Override public UpdateWorkspaceOutput build() { tracker.validate(); @@ -539,8 +563,9 @@ public void setMemberValue(Schema member, Object value) { case 12 -> autoPopulateControl((boolean) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, value)); case 13 -> enableContextValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, value)); case 14 -> enableChangeReasonValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, value)); - case 15 -> configVersion((String) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, value)); - case 16 -> mandatoryDimensions((List) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, value)); + case 15 -> changeReason((String) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, value)); + case 16 -> configVersion((String) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, value)); + case 17 -> mandatoryDimensions((List) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -595,6 +620,9 @@ public ShapeBuilder errorCorrection() { if (!tracker.checkMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION)) { tracker.setMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION); } + if (!tracker.checkMember($SCHEMA_CHANGE_REASON)) { + changeReason(""); + } return this; } @@ -631,8 +659,9 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 12 -> builder.autoPopulateControl(de.readBoolean(member)); case 13 -> builder.enableContextValidation(de.readBoolean(member)); case 14 -> builder.enableChangeReasonValidation(de.readBoolean(member)); - case 15 -> builder.configVersion(de.readString(member)); - case 16 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); + case 15 -> builder.changeReason(de.readString(member)); + case 16 -> builder.configVersion(de.readString(member)); + case 17 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/Workspace.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/Workspace.java index d057dc483..88c858246 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/Workspace.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/Workspace.java @@ -30,6 +30,7 @@ public final class Workspace implements ApiResource { Map.entry("last_modified_at", SharedSchemas.DATE_TIME), Map.entry("organisation_id", PreludeSchemas.STRING), Map.entry("allow_experiment_self_approval", PreludeSchemas.BOOLEAN), + Map.entry("change_reason", PreludeSchemas.STRING), Map.entry("workspace_schema_name", PreludeSchemas.STRING), Map.entry("metrics", PreludeSchemas.DOCUMENT)); diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/WorkspaceResponse.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/WorkspaceResponse.java index 7ddbf49f5..d0e20b382 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/WorkspaceResponse.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/WorkspaceResponse.java @@ -56,6 +56,8 @@ public final class WorkspaceResponse implements SerializableStruct { new RequiredTrait()) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN, new RequiredTrait()) + .putMember("change_reason", PreludeSchemas.STRING, + new RequiredTrait()) .build(); private static final Schema $SCHEMA_WORKSPACE_NAME = $SCHEMA.member("workspace_name"); @@ -75,6 +77,7 @@ public final class WorkspaceResponse implements SerializableStruct { private static final Schema $SCHEMA_AUTO_POPULATE_CONTROL = $SCHEMA.member("auto_populate_control"); private static final Schema $SCHEMA_ENABLE_CONTEXT_VALIDATION = $SCHEMA.member("enable_context_validation"); private static final Schema $SCHEMA_ENABLE_CHANGE_REASON_VALIDATION = $SCHEMA.member("enable_change_reason_validation"); + private static final Schema $SCHEMA_CHANGE_REASON = $SCHEMA.member("change_reason"); private final transient String workspaceName; private final transient String organisationId; @@ -93,6 +96,7 @@ public final class WorkspaceResponse implements SerializableStruct { private final transient boolean autoPopulateControl; private final transient boolean enableContextValidation; private final transient boolean enableChangeReasonValidation; + private final transient String changeReason; private WorkspaceResponse(Builder builder) { this.workspaceName = builder.workspaceName; @@ -112,6 +116,7 @@ private WorkspaceResponse(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.changeReason = builder.changeReason; } public String workspaceName() { @@ -189,6 +194,10 @@ public boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public String changeReason() { + return changeReason; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -219,12 +228,13 @@ public boolean equals(Object other) { && this.allowExperimentSelfApproval == that.allowExperimentSelfApproval && this.autoPopulateControl == that.autoPopulateControl && this.enableContextValidation == that.enableContextValidation - && this.enableChangeReasonValidation == that.enableChangeReasonValidation; + && this.enableChangeReasonValidation == that.enableChangeReasonValidation + && Objects.equals(this.changeReason, that.changeReason); } @Override public int hashCode() { - return Objects.hash(workspaceName, organisationId, organisationName, workspaceSchemaName, workspaceStatus, workspaceAdminEmail, configVersion, createdBy, lastModifiedBy, lastModifiedAt, createdAt, mandatoryDimensions, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation); + return Objects.hash(workspaceName, organisationId, organisationName, workspaceSchemaName, workspaceStatus, workspaceAdminEmail, configVersion, createdBy, lastModifiedBy, lastModifiedAt, createdAt, mandatoryDimensions, metrics, allowExperimentSelfApproval, autoPopulateControl, enableContextValidation, enableChangeReasonValidation, changeReason); } @Override @@ -255,6 +265,7 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeBoolean($SCHEMA_AUTO_POPULATE_CONTROL, autoPopulateControl); serializer.writeBoolean($SCHEMA_ENABLE_CONTEXT_VALIDATION, enableContextValidation); serializer.writeBoolean($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, enableChangeReasonValidation); + serializer.writeString($SCHEMA_CHANGE_REASON, changeReason); } @Override @@ -276,8 +287,9 @@ public T getMemberValue(Schema member) { case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, autoPopulateControl); case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, enableContextValidation); case 14 -> (T) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, enableChangeReasonValidation); - case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, configVersion); - case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, mandatoryDimensions); + case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, changeReason); + case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, configVersion); + case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, mandatoryDimensions); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -308,6 +320,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.changeReason(this.changeReason); return builder; } @@ -340,6 +353,7 @@ public static final class Builder implements ShapeBuilder { private boolean autoPopulateControl; private boolean enableContextValidation; private boolean enableChangeReasonValidation; + private String changeReason; private Builder() {} @@ -514,6 +528,16 @@ public Builder enableChangeReasonValidation(boolean enableChangeReasonValidation return this; } + /** + *

Required + * @return this builder. + */ + public Builder changeReason(String changeReason) { + this.changeReason = Objects.requireNonNull(changeReason, "changeReason cannot be null"); + tracker.setMember($SCHEMA_CHANGE_REASON); + return this; + } + @Override public WorkspaceResponse build() { tracker.validate(); @@ -539,8 +563,9 @@ public void setMemberValue(Schema member, Object value) { case 12 -> autoPopulateControl((boolean) SchemaUtils.validateSameMember($SCHEMA_AUTO_POPULATE_CONTROL, member, value)); case 13 -> enableContextValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CONTEXT_VALIDATION, member, value)); case 14 -> enableChangeReasonValidation((boolean) SchemaUtils.validateSameMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION, member, value)); - case 15 -> configVersion((String) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, value)); - case 16 -> mandatoryDimensions((List) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, value)); + case 15 -> changeReason((String) SchemaUtils.validateSameMember($SCHEMA_CHANGE_REASON, member, value)); + case 16 -> configVersion((String) SchemaUtils.validateSameMember($SCHEMA_CONFIG_VERSION, member, value)); + case 17 -> mandatoryDimensions((List) SchemaUtils.validateSameMember($SCHEMA_MANDATORY_DIMENSIONS, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -595,6 +620,9 @@ public ShapeBuilder errorCorrection() { if (!tracker.checkMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION)) { tracker.setMember($SCHEMA_ENABLE_CHANGE_REASON_VALIDATION); } + if (!tracker.checkMember($SCHEMA_CHANGE_REASON)) { + changeReason(""); + } return this; } @@ -631,8 +659,9 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 12 -> builder.autoPopulateControl(de.readBoolean(member)); case 13 -> builder.enableContextValidation(de.readBoolean(member)); case 14 -> builder.enableChangeReasonValidation(de.readBoolean(member)); - case 15 -> builder.configVersion(de.readString(member)); - case 16 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); + case 15 -> builder.changeReason(de.readString(member)); + case 16 -> builder.configVersion(de.readString(member)); + case 17 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/javascript/sdk/src/commands/CreateWorkspaceCommand.ts b/clients/javascript/sdk/src/commands/CreateWorkspaceCommand.ts index e31d324f9..c07d9dc19 100644 --- a/clients/javascript/sdk/src/commands/CreateWorkspaceCommand.ts +++ b/clients/javascript/sdk/src/commands/CreateWorkspaceCommand.ts @@ -52,6 +52,7 @@ export interface CreateWorkspaceCommandOutput extends WorkspaceResponse, __Metad * auto_populate_control: true || false, * enable_context_validation: true || false, * enable_change_reason_validation: true || false, + * change_reason: "STRING_VALUE", // required * }; * const command = new CreateWorkspaceCommand(input); * const response = await client.send(command); @@ -75,6 +76,7 @@ export interface CreateWorkspaceCommandOutput extends WorkspaceResponse, __Metad * // auto_populate_control: true || false, // required * // enable_context_validation: true || false, // required * // enable_change_reason_validation: true || false, // required + * // change_reason: "STRING_VALUE", // required * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/GetWorkspaceCommand.ts b/clients/javascript/sdk/src/commands/GetWorkspaceCommand.ts index 20c937d06..13168befc 100644 --- a/clients/javascript/sdk/src/commands/GetWorkspaceCommand.ts +++ b/clients/javascript/sdk/src/commands/GetWorkspaceCommand.ts @@ -68,6 +68,7 @@ export interface GetWorkspaceCommandOutput extends WorkspaceResponse, __Metadata * // auto_populate_control: true || false, // required * // enable_context_validation: true || false, // required * // enable_change_reason_validation: true || false, // required + * // change_reason: "STRING_VALUE", // required * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/ListWorkspaceCommand.ts b/clients/javascript/sdk/src/commands/ListWorkspaceCommand.ts index 893ea54a4..b594e8e26 100644 --- a/clients/javascript/sdk/src/commands/ListWorkspaceCommand.ts +++ b/clients/javascript/sdk/src/commands/ListWorkspaceCommand.ts @@ -74,6 +74,7 @@ export interface ListWorkspaceCommandOutput extends ListWorkspaceOutput, __Metad * // auto_populate_control: true || false, // required * // enable_context_validation: true || false, // required * // enable_change_reason_validation: true || false, // required + * // change_reason: "STRING_VALUE", // required * // }, * // ], * // }; diff --git a/clients/javascript/sdk/src/commands/MigrateWorkspaceSchemaCommand.ts b/clients/javascript/sdk/src/commands/MigrateWorkspaceSchemaCommand.ts index 8240f8b98..87dc5224f 100644 --- a/clients/javascript/sdk/src/commands/MigrateWorkspaceSchemaCommand.ts +++ b/clients/javascript/sdk/src/commands/MigrateWorkspaceSchemaCommand.ts @@ -68,6 +68,7 @@ export interface MigrateWorkspaceSchemaCommandOutput extends WorkspaceResponse, * // auto_populate_control: true || false, // required * // enable_context_validation: true || false, // required * // enable_change_reason_validation: true || false, // required + * // change_reason: "STRING_VALUE", // required * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/UpdateWorkspaceCommand.ts b/clients/javascript/sdk/src/commands/UpdateWorkspaceCommand.ts index 74f9d181f..5f88f3d81 100644 --- a/clients/javascript/sdk/src/commands/UpdateWorkspaceCommand.ts +++ b/clients/javascript/sdk/src/commands/UpdateWorkspaceCommand.ts @@ -56,6 +56,7 @@ export interface UpdateWorkspaceCommandOutput extends WorkspaceResponse, __Metad * auto_populate_control: true || false, * enable_context_validation: true || false, * enable_change_reason_validation: true || false, + * change_reason: "STRING_VALUE", * }; * const command = new UpdateWorkspaceCommand(input); * const response = await client.send(command); @@ -79,6 +80,7 @@ export interface UpdateWorkspaceCommandOutput extends WorkspaceResponse, __Metad * // auto_populate_control: true || false, // required * // enable_context_validation: true || false, // required * // enable_change_reason_validation: true || false, // required + * // change_reason: "STRING_VALUE", // required * // }; * * ``` diff --git a/clients/javascript/sdk/src/models/models_0.ts b/clients/javascript/sdk/src/models/models_0.ts index 2469baefc..f3ed30e62 100644 --- a/clients/javascript/sdk/src/models/models_0.ts +++ b/clients/javascript/sdk/src/models/models_0.ts @@ -1589,6 +1589,7 @@ export interface CreateWorkspaceRequest { auto_populate_control?: boolean | undefined; enable_context_validation?: boolean | undefined; enable_change_reason_validation?: boolean | undefined; + change_reason: string | undefined; } /** @@ -1612,6 +1613,7 @@ export interface WorkspaceResponse { auto_populate_control: boolean | undefined; enable_context_validation: boolean | undefined; enable_change_reason_validation: boolean | undefined; + change_reason: string | undefined; } /** @@ -2794,4 +2796,5 @@ export interface UpdateWorkspaceRequest { auto_populate_control?: boolean | undefined; enable_context_validation?: boolean | undefined; enable_change_reason_validation?: boolean | undefined; + change_reason?: string | undefined; } diff --git a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts index 57d24f5a4..74196b819 100644 --- a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts +++ b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts @@ -846,6 +846,7 @@ export const se_CreateWorkspaceCommand = async( body = JSON.stringify(take(input, { 'allow_experiment_self_approval': [], 'auto_populate_control': [], + 'change_reason': [], 'enable_change_reason_validation': [], 'enable_context_validation': [], 'metrics': _ => se_Document(_, context), @@ -2488,6 +2489,7 @@ export const se_UpdateWorkspaceCommand = async( body = JSON.stringify(take(input, { 'allow_experiment_self_approval': [], 'auto_populate_control': [], + 'change_reason': [], 'config_version': [], 'enable_change_reason_validation': [], 'enable_context_validation': [], @@ -3034,6 +3036,7 @@ export const de_CreateWorkspaceCommand = async( const doc = take(data, { 'allow_experiment_self_approval': __expectBoolean, 'auto_populate_control': __expectBoolean, + 'change_reason': __expectString, 'config_version': __expectString, 'created_at': _ => __expectNonNull(__parseRfc3339DateTimeWithOffset(_)), 'created_by': __expectString, @@ -3875,6 +3878,7 @@ export const de_GetWorkspaceCommand = async( const doc = take(data, { 'allow_experiment_self_approval': __expectBoolean, 'auto_populate_control': __expectBoolean, + 'change_reason': __expectString, 'config_version': __expectString, 'created_at': _ => __expectNonNull(__parseRfc3339DateTimeWithOffset(_)), 'created_by': __expectString, @@ -4211,6 +4215,7 @@ export const de_MigrateWorkspaceSchemaCommand = async( const doc = take(data, { 'allow_experiment_self_approval': __expectBoolean, 'auto_populate_control': __expectBoolean, + 'change_reason': __expectString, 'config_version': __expectString, 'created_at': _ => __expectNonNull(__parseRfc3339DateTimeWithOffset(_)), 'created_by': __expectString, @@ -4887,6 +4892,7 @@ export const de_UpdateWorkspaceCommand = async( const doc = take(data, { 'allow_experiment_self_approval': __expectBoolean, 'auto_populate_control': __expectBoolean, + 'change_reason': __expectString, 'config_version': __expectString, 'created_at': _ => __expectNonNull(__parseRfc3339DateTimeWithOffset(_)), 'created_by': __expectString, @@ -6049,6 +6055,7 @@ const de_CommandError = async( return take(output, { 'allow_experiment_self_approval': __expectBoolean, 'auto_populate_control': __expectBoolean, + 'change_reason': __expectString, 'config_version': __expectString, 'created_at': (_: any) => __expectNonNull(__parseRfc3339DateTimeWithOffset(_)), 'created_by': __expectString, diff --git a/clients/python/sdk/superposition_sdk/_private/schemas.py b/clients/python/sdk/superposition_sdk/_private/schemas.py index b247654d1..a37fbd01b 100644 --- a/clients/python/sdk/superposition_sdk/_private/schemas.py +++ b/clients/python/sdk/superposition_sdk/_private/schemas.py @@ -6609,6 +6609,15 @@ "index": 8, }, + "change_reason": { + "target": STRING, + "index": 9, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + } ) @@ -6778,6 +6787,15 @@ ], }, + "change_reason": { + "target": STRING, + "index": 17, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + } ) @@ -14308,6 +14326,15 @@ ], }, + "change_reason": { + "target": STRING, + "index": 17, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + } ) @@ -15551,6 +15578,15 @@ ], }, + "change_reason": { + "target": STRING, + "index": 17, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + } ) @@ -15865,6 +15901,15 @@ ], }, + "change_reason": { + "target": STRING, + "index": 17, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + } ) @@ -16926,6 +16971,11 @@ "index": 10, }, + "change_reason": { + "target": STRING, + "index": 11, + }, + } ) @@ -17083,6 +17133,15 @@ ], }, + "change_reason": { + "target": STRING, + "index": 17, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + } ) diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index 701addca4..de50192e0 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -6802,6 +6802,7 @@ class CreateWorkspaceInput: auto_populate_control: bool | None = None enable_context_validation: bool | None = None enable_change_reason_validation: bool | None = None + change_reason: str | None = None def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_CREATE_WORKSPACE_INPUT, self) @@ -6831,6 +6832,9 @@ def serialize_members(self, serializer: ShapeSerializer): if self.enable_change_reason_validation is not None: serializer.write_boolean(_SCHEMA_CREATE_WORKSPACE_INPUT.members["enable_change_reason_validation"], self.enable_change_reason_validation) + if self.change_reason is not None: + serializer.write_string(_SCHEMA_CREATE_WORKSPACE_INPUT.members["change_reason"], self.change_reason) + @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: return cls(**cls.deserialize_kwargs(deserializer)) @@ -6868,6 +6872,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 8: kwargs["enable_change_reason_validation"] = de.read_boolean(_SCHEMA_CREATE_WORKSPACE_INPUT.members["enable_change_reason_validation"]) + case 9: + kwargs["change_reason"] = de.read_string(_SCHEMA_CREATE_WORKSPACE_INPUT.members["change_reason"]) + case _: logger.debug("Unexpected member schema: %s", schema) @@ -6925,6 +6932,8 @@ class CreateWorkspaceOutput: enable_change_reason_validation: bool + change_reason: str + config_version: str | None = None mandatory_dimensions: list[str] | None = None @@ -6953,6 +6962,7 @@ def serialize_members(self, serializer: ShapeSerializer): serializer.write_boolean(_SCHEMA_CREATE_WORKSPACE_OUTPUT.members["auto_populate_control"], self.auto_populate_control) serializer.write_boolean(_SCHEMA_CREATE_WORKSPACE_OUTPUT.members["enable_context_validation"], self.enable_context_validation) serializer.write_boolean(_SCHEMA_CREATE_WORKSPACE_OUTPUT.members["enable_change_reason_validation"], self.enable_change_reason_validation) + serializer.write_string(_SCHEMA_CREATE_WORKSPACE_OUTPUT.members["change_reason"], self.change_reason) @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: @@ -7015,6 +7025,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 16: kwargs["enable_change_reason_validation"] = de.read_boolean(_SCHEMA_CREATE_WORKSPACE_OUTPUT.members["enable_change_reason_validation"]) + case 17: + kwargs["change_reason"] = de.read_string(_SCHEMA_CREATE_WORKSPACE_OUTPUT.members["change_reason"]) + case _: logger.debug("Unexpected member schema: %s", schema) @@ -14096,6 +14109,8 @@ class GetWorkspaceOutput: enable_change_reason_validation: bool + change_reason: str + config_version: str | None = None mandatory_dimensions: list[str] | None = None @@ -14124,6 +14139,7 @@ def serialize_members(self, serializer: ShapeSerializer): serializer.write_boolean(_SCHEMA_GET_WORKSPACE_OUTPUT.members["auto_populate_control"], self.auto_populate_control) serializer.write_boolean(_SCHEMA_GET_WORKSPACE_OUTPUT.members["enable_context_validation"], self.enable_context_validation) serializer.write_boolean(_SCHEMA_GET_WORKSPACE_OUTPUT.members["enable_change_reason_validation"], self.enable_change_reason_validation) + serializer.write_string(_SCHEMA_GET_WORKSPACE_OUTPUT.members["change_reason"], self.change_reason) @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: @@ -14186,6 +14202,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 16: kwargs["enable_change_reason_validation"] = de.read_boolean(_SCHEMA_GET_WORKSPACE_OUTPUT.members["enable_change_reason_validation"]) + case 17: + kwargs["change_reason"] = de.read_string(_SCHEMA_GET_WORKSPACE_OUTPUT.members["change_reason"]) + case _: logger.debug("Unexpected member schema: %s", schema) @@ -15269,6 +15288,8 @@ class WorkspaceResponse: enable_change_reason_validation: bool + change_reason: str + config_version: str | None = None mandatory_dimensions: list[str] | None = None @@ -15297,6 +15318,7 @@ def serialize_members(self, serializer: ShapeSerializer): serializer.write_boolean(_SCHEMA_WORKSPACE_RESPONSE.members["auto_populate_control"], self.auto_populate_control) serializer.write_boolean(_SCHEMA_WORKSPACE_RESPONSE.members["enable_context_validation"], self.enable_context_validation) serializer.write_boolean(_SCHEMA_WORKSPACE_RESPONSE.members["enable_change_reason_validation"], self.enable_change_reason_validation) + serializer.write_string(_SCHEMA_WORKSPACE_RESPONSE.members["change_reason"], self.change_reason) @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: @@ -15359,6 +15381,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 16: kwargs["enable_change_reason_validation"] = de.read_boolean(_SCHEMA_WORKSPACE_RESPONSE.members["enable_change_reason_validation"]) + case 17: + kwargs["change_reason"] = de.read_string(_SCHEMA_WORKSPACE_RESPONSE.members["change_reason"]) + case _: logger.debug("Unexpected member schema: %s", schema) @@ -15583,6 +15608,8 @@ class MigrateWorkspaceSchemaOutput: enable_change_reason_validation: bool + change_reason: str + config_version: str | None = None mandatory_dimensions: list[str] | None = None @@ -15611,6 +15638,7 @@ def serialize_members(self, serializer: ShapeSerializer): serializer.write_boolean(_SCHEMA_MIGRATE_WORKSPACE_SCHEMA_OUTPUT.members["auto_populate_control"], self.auto_populate_control) serializer.write_boolean(_SCHEMA_MIGRATE_WORKSPACE_SCHEMA_OUTPUT.members["enable_context_validation"], self.enable_context_validation) serializer.write_boolean(_SCHEMA_MIGRATE_WORKSPACE_SCHEMA_OUTPUT.members["enable_change_reason_validation"], self.enable_change_reason_validation) + serializer.write_string(_SCHEMA_MIGRATE_WORKSPACE_SCHEMA_OUTPUT.members["change_reason"], self.change_reason) @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: @@ -15673,6 +15701,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 16: kwargs["enable_change_reason_validation"] = de.read_boolean(_SCHEMA_MIGRATE_WORKSPACE_SCHEMA_OUTPUT.members["enable_change_reason_validation"]) + case 17: + kwargs["change_reason"] = de.read_string(_SCHEMA_MIGRATE_WORKSPACE_SCHEMA_OUTPUT.members["change_reason"]) + case _: logger.debug("Unexpected member schema: %s", schema) @@ -16681,6 +16712,7 @@ class UpdateWorkspaceInput: auto_populate_control: bool | None = None enable_context_validation: bool | None = None enable_change_reason_validation: bool | None = None + change_reason: str | None = None def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_UPDATE_WORKSPACE_INPUT, self) @@ -16713,6 +16745,9 @@ def serialize_members(self, serializer: ShapeSerializer): if self.enable_change_reason_validation is not None: serializer.write_boolean(_SCHEMA_UPDATE_WORKSPACE_INPUT.members["enable_change_reason_validation"], self.enable_change_reason_validation) + if self.change_reason is not None: + serializer.write_string(_SCHEMA_UPDATE_WORKSPACE_INPUT.members["change_reason"], self.change_reason) + @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: return cls(**cls.deserialize_kwargs(deserializer)) @@ -16756,6 +16791,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 10: kwargs["enable_change_reason_validation"] = de.read_boolean(_SCHEMA_UPDATE_WORKSPACE_INPUT.members["enable_change_reason_validation"]) + case 11: + kwargs["change_reason"] = de.read_string(_SCHEMA_UPDATE_WORKSPACE_INPUT.members["change_reason"]) + case _: logger.debug("Unexpected member schema: %s", schema) @@ -16795,6 +16833,8 @@ class UpdateWorkspaceOutput: enable_change_reason_validation: bool + change_reason: str + config_version: str | None = None mandatory_dimensions: list[str] | None = None @@ -16823,6 +16863,7 @@ def serialize_members(self, serializer: ShapeSerializer): serializer.write_boolean(_SCHEMA_UPDATE_WORKSPACE_OUTPUT.members["auto_populate_control"], self.auto_populate_control) serializer.write_boolean(_SCHEMA_UPDATE_WORKSPACE_OUTPUT.members["enable_context_validation"], self.enable_context_validation) serializer.write_boolean(_SCHEMA_UPDATE_WORKSPACE_OUTPUT.members["enable_change_reason_validation"], self.enable_change_reason_validation) + serializer.write_string(_SCHEMA_UPDATE_WORKSPACE_OUTPUT.members["change_reason"], self.change_reason) @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: @@ -16885,6 +16926,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 16: kwargs["enable_change_reason_validation"] = de.read_boolean(_SCHEMA_UPDATE_WORKSPACE_OUTPUT.members["enable_change_reason_validation"]) + case 17: + kwargs["change_reason"] = de.read_string(_SCHEMA_UPDATE_WORKSPACE_OUTPUT.members["change_reason"]) + case _: logger.debug("Unexpected member schema: %s", schema) diff --git a/crates/frontend/src/api.rs b/crates/frontend/src/api.rs index 0d6a0a559..bd31978fc 100644 --- a/crates/frontend/src/api.rs +++ b/crates/frontend/src/api.rs @@ -465,6 +465,7 @@ pub async fn fetch_types( pub mod workspaces { use superposition_types::api::workspace::KeyRotationResponse; + use superposition_types::database::models::ChangeReason; use super::*; @@ -515,6 +516,7 @@ pub mod workspaces { auto_populate_control: bool, enable_context_validation: bool, enable_change_reason_validation: bool, + change_reason: String, ) -> Result { Ok(UpdateWorkspaceRequest { workspace_admin_email, @@ -529,6 +531,7 @@ pub mod workspaces { auto_populate_control: Some(auto_populate_control), enable_context_validation: Some(enable_context_validation), enable_change_reason_validation: Some(enable_change_reason_validation), + change_reason: ChangeReason::try_from(change_reason)?, }) } diff --git a/crates/frontend/src/components/workspace_form.rs b/crates/frontend/src/components/workspace_form.rs index bb4f93548..e2db434f4 100644 --- a/crates/frontend/src/components/workspace_form.rs +++ b/crates/frontend/src/components/workspace_form.rs @@ -4,9 +4,10 @@ pub mod utils; use leptos::*; use serde_json::{Value, to_string}; use superposition_types::api::workspace::CreateWorkspaceRequest; -use superposition_types::database::models::{Metrics, WorkspaceStatus}; +use superposition_types::database::models::{ChangeReason, Metrics, WorkspaceStatus}; use web_sys::MouseEvent; +use crate::components::change_form::ChangeForm; use crate::components::form::label::Label; use crate::components::metrics_form::MetricsForm; use crate::components::workspace_form::utils::string_to_vec; @@ -33,6 +34,7 @@ pub fn WorkspaceForm( #[prop(default = true)] auto_populate_control: bool, #[prop(default = false)] enable_context_validation: bool, #[prop(default = false)] enable_change_reason_validation: bool, + #[prop(default = String::new())] change_reason: String, #[prop(into)] handle_submit: Callback<(), ()>, ) -> impl IntoView { let (workspace_name_rs, workspace_name_ws) = create_signal(workspace_name); @@ -51,6 +53,7 @@ pub fn WorkspaceForm( create_signal(enable_context_validation); let (enable_change_reason_validation_rs, enable_change_reason_validation_ws) = create_signal(enable_change_reason_validation); + let (change_reason_rs, change_reason_ws) = create_signal(change_reason); let on_submit = move |ev: MouseEvent| { req_inprogress_ws.set(true); @@ -70,6 +73,7 @@ pub fn WorkspaceForm( auto_populate_control_rs.get_untracked(), enable_context_validation_rs.get_untracked(), enable_change_reason_validation_rs.get_untracked(), + change_reason_rs.get_untracked(), ); match update_payload { Ok(payload) => { @@ -83,6 +87,9 @@ pub fn WorkspaceForm( Err(e) => Err(e), } } else { + let change_reason_val = change_reason_rs.get_untracked(); + let change_reason_val = + ChangeReason::try_from(change_reason_val).unwrap_or_default(); let create_payload = CreateWorkspaceRequest { workspace_admin_email: workspace_admin_email_rs.get_untracked(), workspace_name: workspace_name_rs.get_untracked(), @@ -95,6 +102,7 @@ pub fn WorkspaceForm( .get_untracked(), enable_change_reason_validation: enable_change_reason_validation_rs.get_untracked(), + change_reason: change_reason_val, }; workspaces::create(create_payload, &org_id.get_untracked().0).await }; @@ -259,6 +267,13 @@ pub fn WorkspaceForm( /> + + impl IntoView { .as_bool() .unwrap_or_default(); + let change_reason = row["change_reason"] + .as_str() + .map(String::from) + .unwrap_or_default(); + let workspace_name_clone = workspace_name.clone(); let edit_click_handler = move |_| { @@ -117,6 +122,7 @@ pub fn Workspace() -> impl IntoView { auto_populate_control, enable_context_validation, enable_change_reason_validation, + change_reason: change_reason.clone(), }; logging::log!("{:?}", row_data); selected_workspace.set(Some(row_data)); @@ -217,6 +223,7 @@ pub fn Workspace() -> impl IntoView { .enable_context_validation enable_change_reason_validation=selected_workspace_data .enable_change_reason_validation + change_reason=selected_workspace_data.change_reason handle_submit=move |_| { workspace_resource.refetch(); selected_workspace.set(None); diff --git a/crates/service_utils/src/encryption.rs b/crates/service_utils/src/encryption.rs index 355a2bb37..fb98ce547 100644 --- a/crates/service_utils/src/encryption.rs +++ b/crates/service_utils/src/encryption.rs @@ -312,6 +312,7 @@ pub fn rotate_workspace_encryption_key_helper( workspaces::dsl::key_rotated_at.eq(Some(rotation_time)), workspaces::dsl::last_modified_at.eq(rotation_time), workspaces::dsl::last_modified_by.eq(user_email), + workspaces::dsl::change_reason.eq("Encryption key rotation"), )) .execute(conn)?; diff --git a/crates/superposition/src/workspace/handlers.rs b/crates/superposition/src/workspace/handlers.rs index 71f9b2257..b7b8b9242 100644 --- a/crates/superposition/src/workspace/handlers.rs +++ b/crates/superposition/src/workspace/handlers.rs @@ -151,6 +151,7 @@ async fn create_handler( enable_change_reason_validation: request.enable_change_reason_validation, encryption_key, key_rotated_at: None, + change_reason: request.change_reason, }; let created_workspace = @@ -336,7 +337,8 @@ async fn migrate_schema_handler( .set(( workspaces::encryption_key.eq(encrypted_key), workspaces::last_modified_by.eq(user.get_username()), - workspaces::last_modified_at.eq(Utc::now()) + workspaces::last_modified_at.eq(Utc::now()), + workspaces::change_reason.eq("Encryption key setup during schema migration"), )) .execute(transaction_conn)?; } diff --git a/crates/superposition_sdk/src/client/create_workspace.rs b/crates/superposition_sdk/src/client/create_workspace.rs index 011f0478d..4da8d62c3 100644 --- a/crates/superposition_sdk/src/client/create_workspace.rs +++ b/crates/superposition_sdk/src/client/create_workspace.rs @@ -12,6 +12,7 @@ impl super::Client { /// - [`auto_populate_control(bool)`](crate::operation::create_workspace::builders::CreateWorkspaceFluentBuilder::auto_populate_control) / [`set_auto_populate_control(Option)`](crate::operation::create_workspace::builders::CreateWorkspaceFluentBuilder::set_auto_populate_control):
required: **false**
(undocumented)
/// - [`enable_context_validation(bool)`](crate::operation::create_workspace::builders::CreateWorkspaceFluentBuilder::enable_context_validation) / [`set_enable_context_validation(Option)`](crate::operation::create_workspace::builders::CreateWorkspaceFluentBuilder::set_enable_context_validation):
required: **false**
(undocumented)
/// - [`enable_change_reason_validation(bool)`](crate::operation::create_workspace::builders::CreateWorkspaceFluentBuilder::enable_change_reason_validation) / [`set_enable_change_reason_validation(Option)`](crate::operation::create_workspace::builders::CreateWorkspaceFluentBuilder::set_enable_change_reason_validation):
required: **false**
(undocumented)
+ /// - [`change_reason(impl Into)`](crate::operation::create_workspace::builders::CreateWorkspaceFluentBuilder::change_reason) / [`set_change_reason(Option)`](crate::operation::create_workspace::builders::CreateWorkspaceFluentBuilder::set_change_reason):
required: **true**
(undocumented)
/// - On success, responds with [`CreateWorkspaceOutput`](crate::operation::create_workspace::CreateWorkspaceOutput) with field(s): /// - [`workspace_name(String)`](crate::operation::create_workspace::CreateWorkspaceOutput::workspace_name): (undocumented) /// - [`organisation_id(String)`](crate::operation::create_workspace::CreateWorkspaceOutput::organisation_id): (undocumented) @@ -30,6 +31,7 @@ impl super::Client { /// - [`auto_populate_control(bool)`](crate::operation::create_workspace::CreateWorkspaceOutput::auto_populate_control): (undocumented) /// - [`enable_context_validation(bool)`](crate::operation::create_workspace::CreateWorkspaceOutput::enable_context_validation): (undocumented) /// - [`enable_change_reason_validation(bool)`](crate::operation::create_workspace::CreateWorkspaceOutput::enable_change_reason_validation): (undocumented) + /// - [`change_reason(String)`](crate::operation::create_workspace::CreateWorkspaceOutput::change_reason): (undocumented) /// - On failure, responds with [`SdkError`](crate::operation::create_workspace::CreateWorkspaceError) pub fn create_workspace(&self) -> crate::operation::create_workspace::builders::CreateWorkspaceFluentBuilder { crate::operation::create_workspace::builders::CreateWorkspaceFluentBuilder::new(self.handle.clone()) diff --git a/crates/superposition_sdk/src/client/get_workspace.rs b/crates/superposition_sdk/src/client/get_workspace.rs index 5f2d59c76..6c9a3a9b9 100644 --- a/crates/superposition_sdk/src/client/get_workspace.rs +++ b/crates/superposition_sdk/src/client/get_workspace.rs @@ -23,6 +23,7 @@ impl super::Client { /// - [`auto_populate_control(bool)`](crate::operation::get_workspace::GetWorkspaceOutput::auto_populate_control): (undocumented) /// - [`enable_context_validation(bool)`](crate::operation::get_workspace::GetWorkspaceOutput::enable_context_validation): (undocumented) /// - [`enable_change_reason_validation(bool)`](crate::operation::get_workspace::GetWorkspaceOutput::enable_change_reason_validation): (undocumented) + /// - [`change_reason(String)`](crate::operation::get_workspace::GetWorkspaceOutput::change_reason): (undocumented) /// - On failure, responds with [`SdkError`](crate::operation::get_workspace::GetWorkspaceError) pub fn get_workspace(&self) -> crate::operation::get_workspace::builders::GetWorkspaceFluentBuilder { crate::operation::get_workspace::builders::GetWorkspaceFluentBuilder::new(self.handle.clone()) diff --git a/crates/superposition_sdk/src/client/migrate_workspace_schema.rs b/crates/superposition_sdk/src/client/migrate_workspace_schema.rs index bc0651acb..2295b6247 100644 --- a/crates/superposition_sdk/src/client/migrate_workspace_schema.rs +++ b/crates/superposition_sdk/src/client/migrate_workspace_schema.rs @@ -23,6 +23,7 @@ impl super::Client { /// - [`auto_populate_control(bool)`](crate::operation::migrate_workspace_schema::MigrateWorkspaceSchemaOutput::auto_populate_control): (undocumented) /// - [`enable_context_validation(bool)`](crate::operation::migrate_workspace_schema::MigrateWorkspaceSchemaOutput::enable_context_validation): (undocumented) /// - [`enable_change_reason_validation(bool)`](crate::operation::migrate_workspace_schema::MigrateWorkspaceSchemaOutput::enable_change_reason_validation): (undocumented) + /// - [`change_reason(String)`](crate::operation::migrate_workspace_schema::MigrateWorkspaceSchemaOutput::change_reason): (undocumented) /// - On failure, responds with [`SdkError`](crate::operation::migrate_workspace_schema::MigrateWorkspaceSchemaError) pub fn migrate_workspace_schema(&self) -> crate::operation::migrate_workspace_schema::builders::MigrateWorkspaceSchemaFluentBuilder { crate::operation::migrate_workspace_schema::builders::MigrateWorkspaceSchemaFluentBuilder::new(self.handle.clone()) diff --git a/crates/superposition_sdk/src/client/update_workspace.rs b/crates/superposition_sdk/src/client/update_workspace.rs index 0b45fb330..f8376cd71 100644 --- a/crates/superposition_sdk/src/client/update_workspace.rs +++ b/crates/superposition_sdk/src/client/update_workspace.rs @@ -14,6 +14,7 @@ impl super::Client { /// - [`auto_populate_control(bool)`](crate::operation::update_workspace::builders::UpdateWorkspaceFluentBuilder::auto_populate_control) / [`set_auto_populate_control(Option)`](crate::operation::update_workspace::builders::UpdateWorkspaceFluentBuilder::set_auto_populate_control):
required: **false**
(undocumented)
/// - [`enable_context_validation(bool)`](crate::operation::update_workspace::builders::UpdateWorkspaceFluentBuilder::enable_context_validation) / [`set_enable_context_validation(Option)`](crate::operation::update_workspace::builders::UpdateWorkspaceFluentBuilder::set_enable_context_validation):
required: **false**
(undocumented)
/// - [`enable_change_reason_validation(bool)`](crate::operation::update_workspace::builders::UpdateWorkspaceFluentBuilder::enable_change_reason_validation) / [`set_enable_change_reason_validation(Option)`](crate::operation::update_workspace::builders::UpdateWorkspaceFluentBuilder::set_enable_change_reason_validation):
required: **false**
(undocumented)
+ /// - [`change_reason(impl Into)`](crate::operation::update_workspace::builders::UpdateWorkspaceFluentBuilder::change_reason) / [`set_change_reason(Option)`](crate::operation::update_workspace::builders::UpdateWorkspaceFluentBuilder::set_change_reason):
required: **false**
(undocumented)
/// - On success, responds with [`UpdateWorkspaceOutput`](crate::operation::update_workspace::UpdateWorkspaceOutput) with field(s): /// - [`workspace_name(String)`](crate::operation::update_workspace::UpdateWorkspaceOutput::workspace_name): (undocumented) /// - [`organisation_id(String)`](crate::operation::update_workspace::UpdateWorkspaceOutput::organisation_id): (undocumented) @@ -32,6 +33,7 @@ impl super::Client { /// - [`auto_populate_control(bool)`](crate::operation::update_workspace::UpdateWorkspaceOutput::auto_populate_control): (undocumented) /// - [`enable_context_validation(bool)`](crate::operation::update_workspace::UpdateWorkspaceOutput::enable_context_validation): (undocumented) /// - [`enable_change_reason_validation(bool)`](crate::operation::update_workspace::UpdateWorkspaceOutput::enable_change_reason_validation): (undocumented) + /// - [`change_reason(String)`](crate::operation::update_workspace::UpdateWorkspaceOutput::change_reason): (undocumented) /// - On failure, responds with [`SdkError`](crate::operation::update_workspace::UpdateWorkspaceError) pub fn update_workspace(&self) -> crate::operation::update_workspace::builders::UpdateWorkspaceFluentBuilder { crate::operation::update_workspace::builders::UpdateWorkspaceFluentBuilder::new(self.handle.clone()) diff --git a/crates/superposition_sdk/src/operation/create_workspace/_create_workspace_input.rs b/crates/superposition_sdk/src/operation/create_workspace/_create_workspace_input.rs index dbe153b96..e565779fd 100644 --- a/crates/superposition_sdk/src/operation/create_workspace/_create_workspace_input.rs +++ b/crates/superposition_sdk/src/operation/create_workspace/_create_workspace_input.rs @@ -21,6 +21,8 @@ pub struct CreateWorkspaceInput { pub enable_context_validation: ::std::option::Option, #[allow(missing_docs)] // documentation missing in model pub enable_change_reason_validation: ::std::option::Option, + #[allow(missing_docs)] // documentation missing in model + pub change_reason: ::std::option::Option<::std::string::String>, } impl CreateWorkspaceInput { #[allow(missing_docs)] // documentation missing in model @@ -59,6 +61,10 @@ impl CreateWorkspaceInput { pub fn enable_change_reason_validation(&self) -> ::std::option::Option { self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + pub fn change_reason(&self) -> ::std::option::Option<&str> { + self.change_reason.as_deref() + } } impl CreateWorkspaceInput { /// Creates a new builder-style object to manufacture [`CreateWorkspaceInput`](crate::operation::create_workspace::CreateWorkspaceInput). @@ -80,6 +86,7 @@ pub struct CreateWorkspaceInputBuilder { pub(crate) auto_populate_control: ::std::option::Option, pub(crate) enable_context_validation: ::std::option::Option, pub(crate) enable_change_reason_validation: ::std::option::Option, + pub(crate) change_reason: ::std::option::Option<::std::string::String>, } impl CreateWorkspaceInputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -202,6 +209,20 @@ impl CreateWorkspaceInputBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + /// This field is required. + pub fn change_reason(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.change_reason = ::std::option::Option::Some(input.into()); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn set_change_reason(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.change_reason = input; self + } + #[allow(missing_docs)] // documentation missing in model + pub fn get_change_reason(&self) -> &::std::option::Option<::std::string::String> { + &self.change_reason + } /// Consumes the builder and constructs a [`CreateWorkspaceInput`](crate::operation::create_workspace::CreateWorkspaceInput). pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( @@ -224,6 +245,8 @@ impl CreateWorkspaceInputBuilder { , enable_change_reason_validation: self.enable_change_reason_validation , + change_reason: self.change_reason + , } ) } diff --git a/crates/superposition_sdk/src/operation/create_workspace/_create_workspace_output.rs b/crates/superposition_sdk/src/operation/create_workspace/_create_workspace_output.rs index 349b8ceb4..457b26704 100644 --- a/crates/superposition_sdk/src/operation/create_workspace/_create_workspace_output.rs +++ b/crates/superposition_sdk/src/operation/create_workspace/_create_workspace_output.rs @@ -37,6 +37,8 @@ pub struct CreateWorkspaceOutput { pub enable_context_validation: bool, #[allow(missing_docs)] // documentation missing in model pub enable_change_reason_validation: bool, + #[allow(missing_docs)] // documentation missing in model + pub change_reason: ::std::string::String, } impl CreateWorkspaceOutput { #[allow(missing_docs)] // documentation missing in model @@ -110,6 +112,10 @@ impl CreateWorkspaceOutput { pub fn enable_change_reason_validation(&self) -> bool { self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + pub fn change_reason(&self) -> &str { + use std::ops::Deref; self.change_reason.deref() + } } impl CreateWorkspaceOutput { /// Creates a new builder-style object to manufacture [`CreateWorkspaceOutput`](crate::operation::create_workspace::CreateWorkspaceOutput). @@ -139,6 +145,7 @@ pub struct CreateWorkspaceOutputBuilder { pub(crate) auto_populate_control: ::std::option::Option, pub(crate) enable_context_validation: ::std::option::Option, pub(crate) enable_change_reason_validation: ::std::option::Option, + pub(crate) change_reason: ::std::option::Option<::std::string::String>, } impl CreateWorkspaceOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -382,6 +389,20 @@ impl CreateWorkspaceOutputBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + /// This field is required. + pub fn change_reason(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.change_reason = ::std::option::Option::Some(input.into()); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn set_change_reason(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.change_reason = input; self + } + #[allow(missing_docs)] // documentation missing in model + pub fn get_change_reason(&self) -> &::std::option::Option<::std::string::String> { + &self.change_reason + } /// Consumes the builder and constructs a [`CreateWorkspaceOutput`](crate::operation::create_workspace::CreateWorkspaceOutput). /// This method will fail if any of the following fields are not set: /// - [`workspace_name`](crate::operation::create_workspace::builders::CreateWorkspaceOutputBuilder::workspace_name) @@ -399,6 +420,7 @@ impl CreateWorkspaceOutputBuilder { /// - [`auto_populate_control`](crate::operation::create_workspace::builders::CreateWorkspaceOutputBuilder::auto_populate_control) /// - [`enable_context_validation`](crate::operation::create_workspace::builders::CreateWorkspaceOutputBuilder::enable_context_validation) /// - [`enable_change_reason_validation`](crate::operation::create_workspace::builders::CreateWorkspaceOutputBuilder::enable_change_reason_validation) + /// - [`change_reason`](crate::operation::create_workspace::builders::CreateWorkspaceOutputBuilder::change_reason) pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( crate::operation::create_workspace::CreateWorkspaceOutput { @@ -481,6 +503,11 @@ impl CreateWorkspaceOutputBuilder { ::aws_smithy_types::error::operation::BuildError::missing_field("enable_change_reason_validation", "enable_change_reason_validation was not specified but it is required when building CreateWorkspaceOutput") )? , + change_reason: self.change_reason + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("change_reason", "change_reason was not specified but it is required when building CreateWorkspaceOutput") + )? + , } ) } diff --git a/crates/superposition_sdk/src/operation/create_workspace/builders.rs b/crates/superposition_sdk/src/operation/create_workspace/builders.rs index 6136c5472..dfadbba75 100644 --- a/crates/superposition_sdk/src/operation/create_workspace/builders.rs +++ b/crates/superposition_sdk/src/operation/create_workspace/builders.rs @@ -222,5 +222,19 @@ impl CreateWorkspaceFluentBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { self.inner.get_enable_change_reason_validation() } + #[allow(missing_docs)] // documentation missing in model + pub fn change_reason(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.inner = self.inner.change_reason(input.into()); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn set_change_reason(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.inner = self.inner.set_change_reason(input); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn get_change_reason(&self) -> &::std::option::Option<::std::string::String> { + self.inner.get_change_reason() + } } diff --git a/crates/superposition_sdk/src/operation/get_workspace/_get_workspace_output.rs b/crates/superposition_sdk/src/operation/get_workspace/_get_workspace_output.rs index 531a25cdc..635062f4a 100644 --- a/crates/superposition_sdk/src/operation/get_workspace/_get_workspace_output.rs +++ b/crates/superposition_sdk/src/operation/get_workspace/_get_workspace_output.rs @@ -37,6 +37,8 @@ pub struct GetWorkspaceOutput { pub enable_context_validation: bool, #[allow(missing_docs)] // documentation missing in model pub enable_change_reason_validation: bool, + #[allow(missing_docs)] // documentation missing in model + pub change_reason: ::std::string::String, } impl GetWorkspaceOutput { #[allow(missing_docs)] // documentation missing in model @@ -110,6 +112,10 @@ impl GetWorkspaceOutput { pub fn enable_change_reason_validation(&self) -> bool { self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + pub fn change_reason(&self) -> &str { + use std::ops::Deref; self.change_reason.deref() + } } impl GetWorkspaceOutput { /// Creates a new builder-style object to manufacture [`GetWorkspaceOutput`](crate::operation::get_workspace::GetWorkspaceOutput). @@ -139,6 +145,7 @@ pub struct GetWorkspaceOutputBuilder { pub(crate) auto_populate_control: ::std::option::Option, pub(crate) enable_context_validation: ::std::option::Option, pub(crate) enable_change_reason_validation: ::std::option::Option, + pub(crate) change_reason: ::std::option::Option<::std::string::String>, } impl GetWorkspaceOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -382,6 +389,20 @@ impl GetWorkspaceOutputBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + /// This field is required. + pub fn change_reason(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.change_reason = ::std::option::Option::Some(input.into()); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn set_change_reason(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.change_reason = input; self + } + #[allow(missing_docs)] // documentation missing in model + pub fn get_change_reason(&self) -> &::std::option::Option<::std::string::String> { + &self.change_reason + } /// Consumes the builder and constructs a [`GetWorkspaceOutput`](crate::operation::get_workspace::GetWorkspaceOutput). /// This method will fail if any of the following fields are not set: /// - [`workspace_name`](crate::operation::get_workspace::builders::GetWorkspaceOutputBuilder::workspace_name) @@ -399,6 +420,7 @@ impl GetWorkspaceOutputBuilder { /// - [`auto_populate_control`](crate::operation::get_workspace::builders::GetWorkspaceOutputBuilder::auto_populate_control) /// - [`enable_context_validation`](crate::operation::get_workspace::builders::GetWorkspaceOutputBuilder::enable_context_validation) /// - [`enable_change_reason_validation`](crate::operation::get_workspace::builders::GetWorkspaceOutputBuilder::enable_change_reason_validation) + /// - [`change_reason`](crate::operation::get_workspace::builders::GetWorkspaceOutputBuilder::change_reason) pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( crate::operation::get_workspace::GetWorkspaceOutput { @@ -481,6 +503,11 @@ impl GetWorkspaceOutputBuilder { ::aws_smithy_types::error::operation::BuildError::missing_field("enable_change_reason_validation", "enable_change_reason_validation was not specified but it is required when building GetWorkspaceOutput") )? , + change_reason: self.change_reason + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("change_reason", "change_reason was not specified but it is required when building GetWorkspaceOutput") + )? + , } ) } diff --git a/crates/superposition_sdk/src/operation/migrate_workspace_schema/_migrate_workspace_schema_output.rs b/crates/superposition_sdk/src/operation/migrate_workspace_schema/_migrate_workspace_schema_output.rs index cd382e67b..f6699b5ff 100644 --- a/crates/superposition_sdk/src/operation/migrate_workspace_schema/_migrate_workspace_schema_output.rs +++ b/crates/superposition_sdk/src/operation/migrate_workspace_schema/_migrate_workspace_schema_output.rs @@ -37,6 +37,8 @@ pub struct MigrateWorkspaceSchemaOutput { pub enable_context_validation: bool, #[allow(missing_docs)] // documentation missing in model pub enable_change_reason_validation: bool, + #[allow(missing_docs)] // documentation missing in model + pub change_reason: ::std::string::String, } impl MigrateWorkspaceSchemaOutput { #[allow(missing_docs)] // documentation missing in model @@ -110,6 +112,10 @@ impl MigrateWorkspaceSchemaOutput { pub fn enable_change_reason_validation(&self) -> bool { self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + pub fn change_reason(&self) -> &str { + use std::ops::Deref; self.change_reason.deref() + } } impl MigrateWorkspaceSchemaOutput { /// Creates a new builder-style object to manufacture [`MigrateWorkspaceSchemaOutput`](crate::operation::migrate_workspace_schema::MigrateWorkspaceSchemaOutput). @@ -139,6 +145,7 @@ pub struct MigrateWorkspaceSchemaOutputBuilder { pub(crate) auto_populate_control: ::std::option::Option, pub(crate) enable_context_validation: ::std::option::Option, pub(crate) enable_change_reason_validation: ::std::option::Option, + pub(crate) change_reason: ::std::option::Option<::std::string::String>, } impl MigrateWorkspaceSchemaOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -382,6 +389,20 @@ impl MigrateWorkspaceSchemaOutputBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + /// This field is required. + pub fn change_reason(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.change_reason = ::std::option::Option::Some(input.into()); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn set_change_reason(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.change_reason = input; self + } + #[allow(missing_docs)] // documentation missing in model + pub fn get_change_reason(&self) -> &::std::option::Option<::std::string::String> { + &self.change_reason + } /// Consumes the builder and constructs a [`MigrateWorkspaceSchemaOutput`](crate::operation::migrate_workspace_schema::MigrateWorkspaceSchemaOutput). /// This method will fail if any of the following fields are not set: /// - [`workspace_name`](crate::operation::migrate_workspace_schema::builders::MigrateWorkspaceSchemaOutputBuilder::workspace_name) @@ -399,6 +420,7 @@ impl MigrateWorkspaceSchemaOutputBuilder { /// - [`auto_populate_control`](crate::operation::migrate_workspace_schema::builders::MigrateWorkspaceSchemaOutputBuilder::auto_populate_control) /// - [`enable_context_validation`](crate::operation::migrate_workspace_schema::builders::MigrateWorkspaceSchemaOutputBuilder::enable_context_validation) /// - [`enable_change_reason_validation`](crate::operation::migrate_workspace_schema::builders::MigrateWorkspaceSchemaOutputBuilder::enable_change_reason_validation) + /// - [`change_reason`](crate::operation::migrate_workspace_schema::builders::MigrateWorkspaceSchemaOutputBuilder::change_reason) pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( crate::operation::migrate_workspace_schema::MigrateWorkspaceSchemaOutput { @@ -481,6 +503,11 @@ impl MigrateWorkspaceSchemaOutputBuilder { ::aws_smithy_types::error::operation::BuildError::missing_field("enable_change_reason_validation", "enable_change_reason_validation was not specified but it is required when building MigrateWorkspaceSchemaOutput") )? , + change_reason: self.change_reason + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("change_reason", "change_reason was not specified but it is required when building MigrateWorkspaceSchemaOutput") + )? + , } ) } diff --git a/crates/superposition_sdk/src/operation/update_workspace/_update_workspace_input.rs b/crates/superposition_sdk/src/operation/update_workspace/_update_workspace_input.rs index f28ece713..9f7df4d49 100644 --- a/crates/superposition_sdk/src/operation/update_workspace/_update_workspace_input.rs +++ b/crates/superposition_sdk/src/operation/update_workspace/_update_workspace_input.rs @@ -25,6 +25,8 @@ pub struct UpdateWorkspaceInput { pub enable_context_validation: ::std::option::Option, #[allow(missing_docs)] // documentation missing in model pub enable_change_reason_validation: ::std::option::Option, + #[allow(missing_docs)] // documentation missing in model + pub change_reason: ::std::option::Option<::std::string::String>, } impl UpdateWorkspaceInput { #[allow(missing_docs)] // documentation missing in model @@ -74,6 +76,10 @@ impl UpdateWorkspaceInput { pub fn enable_change_reason_validation(&self) -> ::std::option::Option { self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + pub fn change_reason(&self) -> ::std::option::Option<&str> { + self.change_reason.as_deref() + } } impl UpdateWorkspaceInput { /// Creates a new builder-style object to manufacture [`UpdateWorkspaceInput`](crate::operation::update_workspace::UpdateWorkspaceInput). @@ -97,6 +103,7 @@ pub struct UpdateWorkspaceInputBuilder { pub(crate) auto_populate_control: ::std::option::Option, pub(crate) enable_context_validation: ::std::option::Option, pub(crate) enable_change_reason_validation: ::std::option::Option, + pub(crate) change_reason: ::std::option::Option<::std::string::String>, } impl UpdateWorkspaceInputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -250,6 +257,19 @@ impl UpdateWorkspaceInputBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + pub fn change_reason(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.change_reason = ::std::option::Option::Some(input.into()); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn set_change_reason(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.change_reason = input; self + } + #[allow(missing_docs)] // documentation missing in model + pub fn get_change_reason(&self) -> &::std::option::Option<::std::string::String> { + &self.change_reason + } /// Consumes the builder and constructs a [`UpdateWorkspaceInput`](crate::operation::update_workspace::UpdateWorkspaceInput). pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( @@ -276,6 +296,8 @@ impl UpdateWorkspaceInputBuilder { , enable_change_reason_validation: self.enable_change_reason_validation , + change_reason: self.change_reason + , } ) } diff --git a/crates/superposition_sdk/src/operation/update_workspace/_update_workspace_output.rs b/crates/superposition_sdk/src/operation/update_workspace/_update_workspace_output.rs index fba7f574a..247b8008b 100644 --- a/crates/superposition_sdk/src/operation/update_workspace/_update_workspace_output.rs +++ b/crates/superposition_sdk/src/operation/update_workspace/_update_workspace_output.rs @@ -37,6 +37,8 @@ pub struct UpdateWorkspaceOutput { pub enable_context_validation: bool, #[allow(missing_docs)] // documentation missing in model pub enable_change_reason_validation: bool, + #[allow(missing_docs)] // documentation missing in model + pub change_reason: ::std::string::String, } impl UpdateWorkspaceOutput { #[allow(missing_docs)] // documentation missing in model @@ -110,6 +112,10 @@ impl UpdateWorkspaceOutput { pub fn enable_change_reason_validation(&self) -> bool { self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + pub fn change_reason(&self) -> &str { + use std::ops::Deref; self.change_reason.deref() + } } impl UpdateWorkspaceOutput { /// Creates a new builder-style object to manufacture [`UpdateWorkspaceOutput`](crate::operation::update_workspace::UpdateWorkspaceOutput). @@ -139,6 +145,7 @@ pub struct UpdateWorkspaceOutputBuilder { pub(crate) auto_populate_control: ::std::option::Option, pub(crate) enable_context_validation: ::std::option::Option, pub(crate) enable_change_reason_validation: ::std::option::Option, + pub(crate) change_reason: ::std::option::Option<::std::string::String>, } impl UpdateWorkspaceOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -382,6 +389,20 @@ impl UpdateWorkspaceOutputBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + /// This field is required. + pub fn change_reason(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.change_reason = ::std::option::Option::Some(input.into()); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn set_change_reason(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.change_reason = input; self + } + #[allow(missing_docs)] // documentation missing in model + pub fn get_change_reason(&self) -> &::std::option::Option<::std::string::String> { + &self.change_reason + } /// Consumes the builder and constructs a [`UpdateWorkspaceOutput`](crate::operation::update_workspace::UpdateWorkspaceOutput). /// This method will fail if any of the following fields are not set: /// - [`workspace_name`](crate::operation::update_workspace::builders::UpdateWorkspaceOutputBuilder::workspace_name) @@ -399,6 +420,7 @@ impl UpdateWorkspaceOutputBuilder { /// - [`auto_populate_control`](crate::operation::update_workspace::builders::UpdateWorkspaceOutputBuilder::auto_populate_control) /// - [`enable_context_validation`](crate::operation::update_workspace::builders::UpdateWorkspaceOutputBuilder::enable_context_validation) /// - [`enable_change_reason_validation`](crate::operation::update_workspace::builders::UpdateWorkspaceOutputBuilder::enable_change_reason_validation) + /// - [`change_reason`](crate::operation::update_workspace::builders::UpdateWorkspaceOutputBuilder::change_reason) pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( crate::operation::update_workspace::UpdateWorkspaceOutput { @@ -481,6 +503,11 @@ impl UpdateWorkspaceOutputBuilder { ::aws_smithy_types::error::operation::BuildError::missing_field("enable_change_reason_validation", "enable_change_reason_validation was not specified but it is required when building UpdateWorkspaceOutput") )? , + change_reason: self.change_reason + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("change_reason", "change_reason was not specified but it is required when building UpdateWorkspaceOutput") + )? + , } ) } diff --git a/crates/superposition_sdk/src/operation/update_workspace/builders.rs b/crates/superposition_sdk/src/operation/update_workspace/builders.rs index 442ff1ceb..72fd0e39b 100644 --- a/crates/superposition_sdk/src/operation/update_workspace/builders.rs +++ b/crates/superposition_sdk/src/operation/update_workspace/builders.rs @@ -255,5 +255,19 @@ impl UpdateWorkspaceFluentBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { self.inner.get_enable_change_reason_validation() } + #[allow(missing_docs)] // documentation missing in model + pub fn change_reason(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.inner = self.inner.change_reason(input.into()); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn set_change_reason(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.inner = self.inner.set_change_reason(input); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn get_change_reason(&self) -> &::std::option::Option<::std::string::String> { + self.inner.get_change_reason() + } } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_create_workspace.rs b/crates/superposition_sdk/src/protocol_serde/shape_create_workspace.rs index 0fbc52b87..cded516dc 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_create_workspace.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_create_workspace.rs @@ -87,6 +87,15 @@ pub(crate) fn de_create_workspace(value: &[u8], mut builder: crate::operation::c ::aws_smithy_json::deserialize::token::expect_bool_or_null(tokens.next())? ); } + "change_reason" => { + builder = builder.set_change_reason( + ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| + s.to_unescaped().map(|u| + u.into_owned() + ) + ).transpose()? + ); + } "config_version" => { builder = builder.set_config_version( ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| diff --git a/crates/superposition_sdk/src/protocol_serde/shape_create_workspace_input.rs b/crates/superposition_sdk/src/protocol_serde/shape_create_workspace_input.rs index 0ced974a8..63c30fe3e 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_create_workspace_input.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_create_workspace_input.rs @@ -9,23 +9,26 @@ pub fn ser_create_workspace_input_input( if let Some(var_2) = &input.auto_populate_control { object.key("auto_populate_control").boolean(*var_2); } - if let Some(var_3) = &input.enable_change_reason_validation { - object.key("enable_change_reason_validation").boolean(*var_3); + if let Some(var_3) = &input.change_reason { + object.key("change_reason").string(var_3.as_str()); } - if let Some(var_4) = &input.enable_context_validation { - object.key("enable_context_validation").boolean(*var_4); + if let Some(var_4) = &input.enable_change_reason_validation { + object.key("enable_change_reason_validation").boolean(*var_4); } - if let Some(var_5) = &input.metrics { - object.key("metrics").document(var_5); + if let Some(var_5) = &input.enable_context_validation { + object.key("enable_context_validation").boolean(*var_5); } - if let Some(var_6) = &input.workspace_admin_email { - object.key("workspace_admin_email").string(var_6.as_str()); + if let Some(var_6) = &input.metrics { + object.key("metrics").document(var_6); } - if let Some(var_7) = &input.workspace_name { - object.key("workspace_name").string(var_7.as_str()); + if let Some(var_7) = &input.workspace_admin_email { + object.key("workspace_admin_email").string(var_7.as_str()); } - if let Some(var_8) = &input.workspace_status { - object.key("workspace_status").string(var_8.as_str()); + if let Some(var_8) = &input.workspace_name { + object.key("workspace_name").string(var_8.as_str()); + } + if let Some(var_9) = &input.workspace_status { + object.key("workspace_status").string(var_9.as_str()); } Ok(()) } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_get_workspace.rs b/crates/superposition_sdk/src/protocol_serde/shape_get_workspace.rs index 2213d4510..31eb21556 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_get_workspace.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_get_workspace.rs @@ -95,6 +95,15 @@ pub(crate) fn de_get_workspace(value: &[u8], mut builder: crate::operation::get_ ::aws_smithy_json::deserialize::token::expect_bool_or_null(tokens.next())? ); } + "change_reason" => { + builder = builder.set_change_reason( + ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| + s.to_unescaped().map(|u| + u.into_owned() + ) + ).transpose()? + ); + } "config_version" => { builder = builder.set_config_version( ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| diff --git a/crates/superposition_sdk/src/protocol_serde/shape_migrate_workspace_schema.rs b/crates/superposition_sdk/src/protocol_serde/shape_migrate_workspace_schema.rs index d9ecb92a1..564ced0f1 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_migrate_workspace_schema.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_migrate_workspace_schema.rs @@ -95,6 +95,15 @@ pub(crate) fn de_migrate_workspace_schema(value: &[u8], mut builder: crate::oper ::aws_smithy_json::deserialize::token::expect_bool_or_null(tokens.next())? ); } + "change_reason" => { + builder = builder.set_change_reason( + ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| + s.to_unescaped().map(|u| + u.into_owned() + ) + ).transpose()? + ); + } "config_version" => { builder = builder.set_config_version( ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| diff --git a/crates/superposition_sdk/src/protocol_serde/shape_update_workspace.rs b/crates/superposition_sdk/src/protocol_serde/shape_update_workspace.rs index a14f881da..de94da674 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_update_workspace.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_update_workspace.rs @@ -103,6 +103,15 @@ pub(crate) fn de_update_workspace(value: &[u8], mut builder: crate::operation::u ::aws_smithy_json::deserialize::token::expect_bool_or_null(tokens.next())? ); } + "change_reason" => { + builder = builder.set_change_reason( + ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| + s.to_unescaped().map(|u| + u.into_owned() + ) + ).transpose()? + ); + } "config_version" => { builder = builder.set_config_version( ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| diff --git a/crates/superposition_sdk/src/protocol_serde/shape_update_workspace_input.rs b/crates/superposition_sdk/src/protocol_serde/shape_update_workspace_input.rs index d6aa90329..e7d6cbc3f 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_update_workspace_input.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_update_workspace_input.rs @@ -9,32 +9,35 @@ pub fn ser_update_workspace_input_input( if let Some(var_2) = &input.auto_populate_control { object.key("auto_populate_control").boolean(*var_2); } - if let Some(var_3) = &input.config_version { - object.key("config_version").string(var_3.as_str()); + if let Some(var_3) = &input.change_reason { + object.key("change_reason").string(var_3.as_str()); } - if let Some(var_4) = &input.enable_change_reason_validation { - object.key("enable_change_reason_validation").boolean(*var_4); + if let Some(var_4) = &input.config_version { + object.key("config_version").string(var_4.as_str()); } - if let Some(var_5) = &input.enable_context_validation { - object.key("enable_context_validation").boolean(*var_5); + if let Some(var_5) = &input.enable_change_reason_validation { + object.key("enable_change_reason_validation").boolean(*var_5); } - if let Some(var_6) = &input.mandatory_dimensions { - let mut array_7 = object.key("mandatory_dimensions").start_array(); - for item_8 in var_6 { + if let Some(var_6) = &input.enable_context_validation { + object.key("enable_context_validation").boolean(*var_6); + } + if let Some(var_7) = &input.mandatory_dimensions { + let mut array_8 = object.key("mandatory_dimensions").start_array(); + for item_9 in var_7 { { - array_7.value().string(item_8.as_str()); + array_8.value().string(item_9.as_str()); } } - array_7.finish(); + array_8.finish(); } - if let Some(var_9) = &input.metrics { - object.key("metrics").document(var_9); + if let Some(var_10) = &input.metrics { + object.key("metrics").document(var_10); } - if let Some(var_10) = &input.workspace_admin_email { - object.key("workspace_admin_email").string(var_10.as_str()); + if let Some(var_11) = &input.workspace_admin_email { + object.key("workspace_admin_email").string(var_11.as_str()); } - if let Some(var_11) = &input.workspace_status { - object.key("workspace_status").string(var_11.as_str()); + if let Some(var_12) = &input.workspace_status { + object.key("workspace_status").string(var_12.as_str()); } Ok(()) } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_workspace_response.rs b/crates/superposition_sdk/src/protocol_serde/shape_workspace_response.rs index 21635fc1a..8b8a261b4 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_workspace_response.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_workspace_response.rs @@ -132,6 +132,15 @@ pub(crate) fn de_workspace_response<'a, I>(tokens: &mut ::std::iter::Peekable ::aws_smithy_json::deserialize::token::expect_bool_or_null(tokens.next())? ); } + "change_reason" => { + builder = builder.set_change_reason( + ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| + s.to_unescaped().map(|u| + u.into_owned() + ) + ).transpose()? + ); + } _ => ::aws_smithy_json::deserialize::token::skip_value(tokens)? } } diff --git a/crates/superposition_sdk/src/serde_util.rs b/crates/superposition_sdk/src/serde_util.rs index 49422bac9..5d374387d 100644 --- a/crates/superposition_sdk/src/serde_util.rs +++ b/crates/superposition_sdk/src/serde_util.rs @@ -219,6 +219,7 @@ if builder.allow_experiment_self_approval.is_none() { builder.allow_experiment_s if builder.auto_populate_control.is_none() { builder.auto_populate_control = Some(Default::default()) } if builder.enable_context_validation.is_none() { builder.enable_context_validation = Some(Default::default()) } if builder.enable_change_reason_validation.is_none() { builder.enable_change_reason_validation = Some(Default::default()) } +if builder.change_reason.is_none() { builder.change_reason = Some(Default::default()) } builder } @@ -539,6 +540,7 @@ if builder.allow_experiment_self_approval.is_none() { builder.allow_experiment_s if builder.auto_populate_control.is_none() { builder.auto_populate_control = Some(Default::default()) } if builder.enable_context_validation.is_none() { builder.enable_context_validation = Some(Default::default()) } if builder.enable_change_reason_validation.is_none() { builder.enable_change_reason_validation = Some(Default::default()) } +if builder.change_reason.is_none() { builder.change_reason = Some(Default::default()) } builder } @@ -649,6 +651,7 @@ if builder.allow_experiment_self_approval.is_none() { builder.allow_experiment_s if builder.auto_populate_control.is_none() { builder.auto_populate_control = Some(Default::default()) } if builder.enable_context_validation.is_none() { builder.enable_context_validation = Some(Default::default()) } if builder.enable_change_reason_validation.is_none() { builder.enable_change_reason_validation = Some(Default::default()) } +if builder.change_reason.is_none() { builder.change_reason = Some(Default::default()) } builder } @@ -945,6 +948,7 @@ if builder.allow_experiment_self_approval.is_none() { builder.allow_experiment_s if builder.auto_populate_control.is_none() { builder.auto_populate_control = Some(Default::default()) } if builder.enable_context_validation.is_none() { builder.enable_context_validation = Some(Default::default()) } if builder.enable_change_reason_validation.is_none() { builder.enable_change_reason_validation = Some(Default::default()) } +if builder.change_reason.is_none() { builder.change_reason = Some(Default::default()) } builder } @@ -1178,6 +1182,7 @@ if builder.allow_experiment_self_approval.is_none() { builder.allow_experiment_s if builder.auto_populate_control.is_none() { builder.auto_populate_control = Some(Default::default()) } if builder.enable_context_validation.is_none() { builder.enable_context_validation = Some(Default::default()) } if builder.enable_change_reason_validation.is_none() { builder.enable_change_reason_validation = Some(Default::default()) } +if builder.change_reason.is_none() { builder.change_reason = Some(Default::default()) } builder } diff --git a/crates/superposition_sdk/src/types/_workspace_response.rs b/crates/superposition_sdk/src/types/_workspace_response.rs index acf8585a4..a26aecf0d 100644 --- a/crates/superposition_sdk/src/types/_workspace_response.rs +++ b/crates/superposition_sdk/src/types/_workspace_response.rs @@ -37,6 +37,8 @@ pub struct WorkspaceResponse { pub enable_context_validation: bool, #[allow(missing_docs)] // documentation missing in model pub enable_change_reason_validation: bool, + #[allow(missing_docs)] // documentation missing in model + pub change_reason: ::std::string::String, } impl WorkspaceResponse { #[allow(missing_docs)] // documentation missing in model @@ -110,6 +112,10 @@ impl WorkspaceResponse { pub fn enable_change_reason_validation(&self) -> bool { self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + pub fn change_reason(&self) -> &str { + use std::ops::Deref; self.change_reason.deref() + } } impl WorkspaceResponse { /// Creates a new builder-style object to manufacture [`WorkspaceResponse`](crate::types::WorkspaceResponse). @@ -139,6 +145,7 @@ pub struct WorkspaceResponseBuilder { pub(crate) auto_populate_control: ::std::option::Option, pub(crate) enable_context_validation: ::std::option::Option, pub(crate) enable_change_reason_validation: ::std::option::Option, + pub(crate) change_reason: ::std::option::Option<::std::string::String>, } impl WorkspaceResponseBuilder { #[allow(missing_docs)] // documentation missing in model @@ -382,6 +389,20 @@ impl WorkspaceResponseBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + #[allow(missing_docs)] // documentation missing in model + /// This field is required. + pub fn change_reason(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.change_reason = ::std::option::Option::Some(input.into()); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn set_change_reason(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.change_reason = input; self + } + #[allow(missing_docs)] // documentation missing in model + pub fn get_change_reason(&self) -> &::std::option::Option<::std::string::String> { + &self.change_reason + } /// Consumes the builder and constructs a [`WorkspaceResponse`](crate::types::WorkspaceResponse). /// This method will fail if any of the following fields are not set: /// - [`workspace_name`](crate::types::builders::WorkspaceResponseBuilder::workspace_name) @@ -399,6 +420,7 @@ impl WorkspaceResponseBuilder { /// - [`auto_populate_control`](crate::types::builders::WorkspaceResponseBuilder::auto_populate_control) /// - [`enable_context_validation`](crate::types::builders::WorkspaceResponseBuilder::enable_context_validation) /// - [`enable_change_reason_validation`](crate::types::builders::WorkspaceResponseBuilder::enable_change_reason_validation) + /// - [`change_reason`](crate::types::builders::WorkspaceResponseBuilder::change_reason) pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( crate::types::WorkspaceResponse { @@ -481,6 +503,11 @@ impl WorkspaceResponseBuilder { ::aws_smithy_types::error::operation::BuildError::missing_field("enable_change_reason_validation", "enable_change_reason_validation was not specified but it is required when building WorkspaceResponse") )? , + change_reason: self.change_reason + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("change_reason", "change_reason was not specified but it is required when building WorkspaceResponse") + )? + , } ) } diff --git a/crates/superposition_types/migrations/2026-02-03-100000_workspace_change_reason/down.sql b/crates/superposition_types/migrations/2026-02-03-100000_workspace_change_reason/down.sql new file mode 100644 index 000000000..99030a5cb --- /dev/null +++ b/crates/superposition_types/migrations/2026-02-03-100000_workspace_change_reason/down.sql @@ -0,0 +1 @@ +ALTER TABLE superposition.workspaces DROP COLUMN IF EXISTS change_reason; diff --git a/crates/superposition_types/migrations/2026-02-03-100000_workspace_change_reason/up.sql b/crates/superposition_types/migrations/2026-02-03-100000_workspace_change_reason/up.sql new file mode 100644 index 000000000..7ba497a97 --- /dev/null +++ b/crates/superposition_types/migrations/2026-02-03-100000_workspace_change_reason/up.sql @@ -0,0 +1 @@ +ALTER TABLE superposition.workspaces ADD COLUMN IF NOT EXISTS change_reason TEXT DEFAULT '' NOT NULL; diff --git a/crates/superposition_types/src/api/workspace.rs b/crates/superposition_types/src/api/workspace.rs index 6308de7db..e8c6815ed 100644 --- a/crates/superposition_types/src/api/workspace.rs +++ b/crates/superposition_types/src/api/workspace.rs @@ -3,7 +3,9 @@ use chrono::{DateTime, Utc}; use diesel::AsChangeset; use serde::{Deserialize, Serialize}; -use crate::database::models::{Metrics, NonEmptyString, Workspace, WorkspaceStatus}; +use crate::database::models::{ + ChangeReason, Metrics, NonEmptyString, Workspace, WorkspaceStatus, +}; #[cfg(feature = "diesel_derives")] use crate::database::superposition_schema::superposition::workspaces; @@ -28,6 +30,7 @@ pub struct WorkspaceResponse { pub auto_populate_control: bool, pub enable_context_validation: bool, pub enable_change_reason_validation: bool, + pub change_reason: ChangeReason, } impl From for WorkspaceResponse { @@ -50,6 +53,7 @@ impl From for WorkspaceResponse { auto_populate_control: workspace.auto_populate_control, enable_context_validation: workspace.enable_context_validation, enable_change_reason_validation: workspace.enable_change_reason_validation, + change_reason: workspace.change_reason, } } } @@ -68,6 +72,7 @@ pub struct CreateWorkspaceRequest { pub enable_context_validation: bool, #[serde(default)] pub enable_change_reason_validation: bool, + pub change_reason: ChangeReason, } #[derive(Debug, Deserialize, Serialize)] @@ -84,6 +89,7 @@ pub struct UpdateWorkspaceRequest { pub auto_populate_control: Option, pub enable_context_validation: Option, pub enable_change_reason_validation: Option, + pub change_reason: ChangeReason, } #[derive(Deserialize, Debug)] diff --git a/crates/superposition_types/src/database/models.rs b/crates/superposition_types/src/database/models.rs index b16da2a83..08f7e9ea1 100644 --- a/crates/superposition_types/src/database/models.rs +++ b/crates/superposition_types/src/database/models.rs @@ -281,6 +281,7 @@ pub struct Workspace { pub enable_change_reason_validation: bool, pub encryption_key: String, pub key_rotated_at: Option>, + pub change_reason: ChangeReason, } #[derive(Clone, Serialize, Deserialize, Debug)] diff --git a/crates/superposition_types/src/database/superposition_schema.rs b/crates/superposition_types/src/database/superposition_schema.rs index 6005dbe38..386be328b 100644 --- a/crates/superposition_types/src/database/superposition_schema.rs +++ b/crates/superposition_types/src/database/superposition_schema.rs @@ -62,6 +62,7 @@ pub mod superposition { enable_change_reason_validation -> Bool, encryption_key -> Text, key_rotated_at -> Nullable, + change_reason -> Text, } } diff --git a/docker-compose/postgres/db_init.sql b/docker-compose/postgres/db_init.sql index 583fd612a..3a0d4c916 100644 --- a/docker-compose/postgres/db_init.sql +++ b/docker-compose/postgres/db_init.sql @@ -1771,4 +1771,7 @@ ALTER TABLE superposition.workspaces ADD COLUMN IF NOT EXISTS encryption_key TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS key_rotated_at TIMESTAMPTZ; +ALTER TABLE superposition.workspaces +ADD COLUMN IF NOT EXISTS change_reason TEXT NOT NULL DEFAULT 'workspace created'; + COMMIT; diff --git a/docs/docs/api/Superposition.openapi.json b/docs/docs/api/Superposition.openapi.json index 7d37618b2..4daa5b2d4 100644 --- a/docs/docs/api/Superposition.openapi.json +++ b/docs/docs/api/Superposition.openapi.json @@ -7333,9 +7333,13 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "change_reason": { + "type": "string" } }, "required": [ + "change_reason", "workspace_admin_email", "workspace_name" ] @@ -7396,11 +7400,15 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "change_reason": { + "type": "string" } }, "required": [ "allow_experiment_self_approval", "auto_populate_control", + "change_reason", "created_at", "created_by", "enable_change_reason_validation", @@ -9156,11 +9164,15 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "change_reason": { + "type": "string" } }, "required": [ "allow_experiment_self_approval", "auto_populate_control", + "change_reason", "created_at", "created_by", "enable_change_reason_validation", @@ -9580,11 +9592,15 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "change_reason": { + "type": "string" } }, "required": [ "allow_experiment_self_approval", "auto_populate_control", + "change_reason", "created_at", "created_by", "enable_change_reason_validation", @@ -11270,6 +11286,9 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "change_reason": { + "type": "string" } }, "required": [ @@ -11332,11 +11351,15 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "change_reason": { + "type": "string" } }, "required": [ "allow_experiment_self_approval", "auto_populate_control", + "change_reason", "created_at", "created_by", "enable_change_reason_validation", @@ -11668,11 +11691,15 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "change_reason": { + "type": "string" } }, "required": [ "allow_experiment_self_approval", "auto_populate_control", + "change_reason", "created_at", "created_by", "enable_change_reason_validation", diff --git a/docs/docs/api/create-workspace.api.mdx b/docs/docs/api/create-workspace.api.mdx index 208a06151..1a11deb7e 100644 --- a/docs/docs/api/create-workspace.api.mdx +++ b/docs/docs/api/create-workspace.api.mdx @@ -5,7 +5,7 @@ description: "Creates a new workspace within an organisation, including database sidebar_label: "CreateWorkspace" hide_title: true hide_table_of_contents: true -api: eJzdV91v2zYQ/1cIPW2AnQQt8pK3pA3QAF1XxBn2EATCWTpbbCWSI6k4huH/fXekLMuxJKfAhmHNgyOR9/3xu9MmydFlVhovtUqukg8WwaMTIBSuxErb785AhmIlfSGVACW0XYKSDphhIqTKyjqXaily8DAHh8JlBVYgHPraEEMupNMlCc0FqmdptapQebHQVmRaLeRSVKBgieGU1QhnMJMLSQyQV0FpztI8aXFnySTRBm1Qf5e3Fv+5s5TuLf5Vo/M3Ol8nV5uEtHiSzY9gTCmzwHv+zbHDmySay09+bZAE6vk3zDzJMZY1eYmOb9tYpMGqlJhk2WFz3pKByXbSoVRQ4QkS58HX7phokqCqq+TqMbn9cn3z+fYjnXy8m8XHp0nipS+ZvHV8FgWR8ApJRMYy6QXKUq9SfCFPJIc4dVguUgqE1c/QtX+udYmgWADUXqdGm5rTlnL8rB4gRQXzMtLgi09JpMwh1tIYeQFqiSlljpJwgmkbEyot5hyN/jQcBb0ToVcFch+r40NTFdtDBd7WSAcGLEnxaCmKj5sk5jF5mVLxT2VO6iQ3S4GQo6W3oxraZ/qV6Cc+cUYrF6vq3cUF/+trwtZiQURix0Xa/vGCHizTbq+n5PdJmrcUfDDvP2qNtzdxxKb0mUrgsDA7JCFNeTpf916X4Hxa6TxA2duIwPd5S1BZ8U1CTYJTT23c1f4jPIS09K7tOs0ZDNizbnzBWlhzcXuseuK+/dmx5YQ/Q8Yf5OKgLE4bNeZlT3X0VNU+J8f92tedQ01wBKFDTdvTomNoG2GrA7cU9Ms+1LsjCqugnKGlrru1ljaEy38F+Sp0jjaO/grfOdJjTp8zzAFLHhN7vBG/tRsNh4byU2heVYx2wRjwBb2dt2Hk1DnMaiv9OswbV9EetD4DI88K780NOJld18z1+LSdHN8jWLQtwdNe2owjEp0eltlGgc/JlMO0fHp4+CoCtaDyL8inJuy7uRc6iu+5CUcse4uaQD6mJxCEPHHS7/eb3u0LVKbEkU1tD46vJ1/fzW74dGbMD2EfT/tBtIuXI/h2SDCIaM22ItVCh/g2pTurySoqNtmErx1itG68u5xevJ9eXHKyuB5pJDBrE4jYvaK7TR+kqbNN/y8+FZqK4/iemxJkGBS1DQMntmFnoww4VnCP0ulmwxb+Ycvtlo+pziz3Jj0+g5Wcl9iMuyWQ2zYnX+mCWn0BpcOR2P1y34ydX8WQld9xfbhyUuJrJksYAeJtA0TTBxawpzjCxj3HdZah8aO0XcT6+vvsgYjnzacUzR3msbDizyz6JWv4e8zvFolwtqEhpZZ1QNgkyuS/vwEFjiqB +api: eJztV91v2zYQ/1cIPm2AnQQt8pK3pA3QAF1XxBn2EATCWTrbbCWSI6k4huH/fXekbMu2ZLvAhmFA8+BI5H1//O60lAX63CkblNHyRn5wCAG9AKFxLubGffcWchRzFWZKC9DCuClo5YEZBkLpvKwLpaeigABj8Ch8PsMKhMdQW2IohPKmJKGFQP2qnNEV6iAmxonc6Imaigo0TDGeshrhLeZqoogBiioqLVhaIC3+Qg6kseii+odiY/Gfa0vp3uFfNfpwZ4qFvFlK0hJINj+CtaXKI+/lN88OL2Uyl5/CwiIJNONvmAeSYx1rCgo9325ikUWrMmJSZYvNB0cGytWgRamhwhMkPkCo/SHRQKKuK3nzLO+/3N59vv9IJx8fRunxZSCDCiWTbxwfJUEkvEISkbNMeoGyNPMM38gTxSHOPJaTjALhzCu07R8bUyJoFgB1MJk1tua0ZRw/Z3pIUcO4TDT4FjISqQpItXSMfAZ6ihlljpJwkmmHuiOcq5Ry5bDgeO2SD3oSd5CmVkz3Suox1dOHpo5WuwqDq5EOLDiSEtBR3J+XMmVevg2pXYaqIHWK22uGUKCjt4Oq29bGnugXPvHWaJ/q8N3VFf/ratuNxYKIxJqLtP3jLdBb2G10yMjvkzTntEg07z9qpvPbPqFZ9koloDrrlEhimopsvOi8LsGHrDJFBL/ziCB0eUvgWvGNpLbCYaDGb2v/ER7CZno3bpEVDB/sWTu+4BwsuLgDVh1xX/1EoxMe97m3r2cnezuFdNqNY3HpqKeOOtxm8bDDu/r5bNDta/OOpj6GzwnoWgBNSbjuwskHonAayhE66tN752gLuf5XsLJC72mr6S6QtSMd5nQ5wxww5cGyRSjx22Zr4tBQfmaG1yFrfDQGwozeLjdh5NR5zGunwiJOKF/RrrW4AKsuZiHYO/Aqv62Z6/llNTi8R3DoNgQvW2kjjkhyul/mJgp8TqbspuXT09NXEakFtcOMfGrCvp6UsQf5njvwiGXnqInkx/REgpgnTvrjdpu8f4PKlnhkG9zC6f6s7LpZj6vWVPohtOT9oBcf0+URRNwl6MXARLaHeq15pPTExMA3NT2qyVyqQtXEdTMPaXN5dz28ej+8umY+LlSaLszaRCi1tWiv8jv5a63y/4vvlKYUOfCXtgQVx0ft4uxK/fksW/1JLTXj5qXT5ZIt/MOVqxUfUwE6blp6fAWnOGGpS9f7JPdzQb7SBWHABEqPR2L3y2Mzn34VfVZ+x8Xu9koVUTOZZGhItw1CDZ9YwJbiADS3HLd5jjYcpW1D2dffR09EPG6+42ggMY+DOX/j0S9Zwx+DYb2TxLMlTS89rSP0yiST//4GdM5W4Q== sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null @@ -54,7 +54,7 @@ Creates a new workspace within an organisation, including database schema setup @@ -62,7 +62,7 @@ Creates a new workspace within an organisation, including database schema setup diff --git a/docs/docs/api/get-workspace.api.mdx b/docs/docs/api/get-workspace.api.mdx index fd369bae8..9fde5944d 100644 --- a/docs/docs/api/get-workspace.api.mdx +++ b/docs/docs/api/get-workspace.api.mdx @@ -5,7 +5,7 @@ description: "Retrieves detailed information about a specific workspace includin sidebar_label: "GetWorkspace" hide_title: true hide_table_of_contents: true -api: eJy9VlFv2zYQ/iuEnjbAToyuefFbuqZdgK0Y4gx9CALhLJ0tthLJksc0hqH/vjtJtqVYTlJg3ZNl8rvj3Xd3H7lNcgyZ1460Nck8uUHyGh8wqBwJdIm50mZlfQUCULC0kRSo4DDTK52p79Z/DQ4yZFhWxlybtdIUVGbNSq+j78xMrir2lwPBWTJJrMN25zrnMz8ifd654U0HHhiMPiTzu21i+A+D9gelzcIk0RKuAyr4O2QFVpDMtwltnKADZ2HWST1JPH6L2iOfQz5iPdk7fJxav57qfOeqQMjR/5Cze1kJzpqAQfBvZjP5GTLaz04xQu1M+ChmidCQGIFzpc4aUs6/BLHcHkdil18wI+HIC4Wk23OfcDMWOecKRofGf8pJv4g56elwWBveq5AEFMMxaJKgiRWXObn6dPnuz6v3vPL+etF+MrukqRT4nsBF62jgHPJKm5Qj0eVoGG0rpg/cULrl9RjiEQjzdLkZ3S4hUFrZnDv+tSCgsWzbQeIVHgSckmbieqf/iE3FIwVk/SbNecVIZn1+wXvYSGcTViO81+JBJj2TTf4DZWm/p/jITSXuKA1YrlLuSW8foE/r0toSwUgIEMmmzrpYcmCptLK3J6BoYFm2GHyklF3qHGhYjRF4AWaNKbPD8/CC0WA4717K51Twg1oM2uLloJ7LcqQ7RrrqUJPjeR2bzlNDMDkWy/GhHRnR3tD1heum06zfO8Gqa2H87eztsd4x1Eaf4SdLH2xk4WfUQfPY6mJMJa/ZrzdQLtDzoF55b726+CliWWEIsB5TrPqQ+0g4YxSIBazlnjpIlPoLDPuXrhM2uaSFlVtujU0scmHNk/M98eF8O6xWLVcQZtFr2jQXYKg0FZszcPqsIHLvIOjsMoqbu3u5z57uI3j0e8D9wdtCGGpJOO1zz4qscyjDMv1xe/u3atCKJ6jgHLsy7O7NZihlXyr9TGSvOaaBP3dOA2jqJm+UxmlXv0XkijsbdGezF3++o99cTGe/TWcXEiFDiKVUTLtnAXe96r9GBoFtD034P72UOpZEUM5dCbrRx+gbnW176e4wxCIc8yezz/UvOEnBbbdcGfzHl3Uty98ieukw/nwAr0W7mn7LWWT4m3t2BWXAZyj45aaT3F/VqVB395EReWNFjPKPP7/i5vhRV3M/795h/3kk7Ym9V98+Ghmidvcyy9BRb+9IaOr+SH+8uuXu+xeSJ/90 +api: eJy9Vktv2zgQ/iuETruAnRjd5uJbuk2zAbZFEWfRQxAIY2lssZVIlhylMQz9985IsiXFch5AuyfL5Devb17cRimGxGtH2ppoHl0jeY33GFSKBDrHVGmzsr4AAShY2pIUqOAw0SudqB/WfwsOEmRYkpepNmulKajEmpVel74VM6kqWF8KBCfRJLIOm5urlG1eIn3ZqeFLBx4YjD5E89ttZPgPg/aG4vpgEmlx1wFl/B2SDAuI5tuINk7QgaMw66iaRB6/l9oj2yFfYjXZK3yYWr+e6nSnKkNI0b9K2Z2cBGdNwCD4N7OZ/AwZ7UenGKF2ImyKWSI0JELgXK6TmpTTr0Ekt4ee2OVXTEg48kIh6cbuI27GPOdYwehQ64856GcxRzV1xhr3XoQkoDIcgiYRmrLgNEcXn87f/Xvxnk/eXy2aT2aXNOUC3xO4aBQNlENaaBOzJzofdaMpxfieC0o3vB5CPAJhGi83o9c5BIoLm3LFvxQENBZt00h8wo2AU9JMXM/6a2QKbikg6zdxyidGIuvzC97DRiqbsBjhvRIN0umJXPIfyHP7I8YHLipRR3HAfBVzTXp7D31al9bmCEZcgJJs7Kwrc3YsllL29ggUDSzzBoMPFLNKnQINszECz8CsMWZ2uB+eFRqgx0Pu2vf2uYiPhffYziB7g0J6PoyneBmpp5E67LJ42OFj/XysbSaH43W8zUeautem/VF33U65v9sRV1WSgbezt4cTkqG29Al+svTBlrwqGNVNSZY6G5urV6zXG8gX6Lm1L7y3Xp39lvFaYAiwHptxVRf7iDtjFIgErGWzdUNNfQTD+qUKhU1OaWZlL66x9kVW3Dw63RMfTrfDbFWytDApvaZNvTJDoSnbnIDTJxmRewdBJ+elqLm9kw34+B7Bo98D7jptC2GoIeG4zj0rcs6uDNP0z83NZ1WjFXdUxjG2adht2rqN5V4y/YRnLzFTw5+yUwPqvMmrplba5m9RcsadDbqV2a8L3upvzqazv6azM/GQIcTDV0TbhwRXveq/XwaObbsi/J/eVi1LMlBOXQ66Ho6lrydzU0u3XRPL4Jg/6n3Of8ZBCm675czgfz6vKjn+XqKXCuPPe/BaZlddbykPGf7mml1BHvAJCv64bkfwn+qYq7sNZmS88UQs5R9/fsPN4TOw4nrevdx+uSeNxd47ce+NNFFze54k6Kh3dzBoqn5LX17ccPX9BJ/cEUo= sidebar_class_name: "get api-method" info_path: docs/api/superposition custom_edit_url: null @@ -62,7 +62,7 @@ Retrieves detailed information about a specific workspace including its configur diff --git a/docs/docs/api/list-workspace.api.mdx b/docs/docs/api/list-workspace.api.mdx index ee0b58675..f3bc7ee9e 100644 --- a/docs/docs/api/list-workspace.api.mdx +++ b/docs/docs/api/list-workspace.api.mdx @@ -5,7 +5,7 @@ description: "Retrieves a paginated list of all workspaces with optional filteri sidebar_label: "ListWorkspace" hide_title: true hide_table_of_contents: true -api: eJzVV0tv20YQ/isLnlpAst0UvvjmNEZrIA0Cy0UPhkGMyJG4yXKXnV3aFgT9984sKYm0KFlKkAI9Sdydxzevj8NlkqPPSFdBO5tcJXcYSOMTegWqgrm2EDBXRvug3EyBMerZ0VdfQcYizzoUykVVMGqmTUDSdq6mi62UslDiSGmbmTqXy1CgJuUDhNqPVObsTM9VjgG04WewuYK81JY9EgT9hKw6c1SCeDlLRomrkOLDbc54P7Lc32tffFsBsT/G4ZOrh2Uizlkqc7UNfKslxH9qpAU/9AP/VJdTJAlSByy9Ck5NURGGmixnQFuFkBWSExQUPiuwhORqmYRFJS5s1P8+s6vVaANZTg4j/swSqnErZqmt3EhyS0FSPSNXql9OgXu8zS5WbovDUG9nKlDNZprAfWwkQhb20l4xNdwjc+ti/7SNx7pqW8+Yo9gfsZqDUU2dMwj2v/HfzcDL2NF8rPN1GgqEPKZ3ByK3NbtIVqNE/GtC7mLBtnqUE18569GL/LuLC/npB9Jrd8Uiaq3DvniWAnKfsxZUldFZDOH8ixfV5S4UN/2CmYxFRTJUQTeOgwtgUonW7zYM427uY84G73MIXS9ABNIRrxX2eN8QR9qkdiBxnGpgfojRpZzzN2X2Wto6a5JzlGRkrl2hUYKcA2ad5ObT9fuPNx/45MPtpPnLxQ06GBHflG/SGOoZj9SXMhJtBmE0dJk+cT/qpqq7IoTC2el0MXhtwIe0dLme6WOFIAxF25Ayn3C9cRw0J67j/RSdkocKgqNFmvOJlcj8EQ20hisWhKcyueQHnm33nOILN5WYC6lHM0t5Isg9gRlgC9Gpg0srV9WGgaUySOT2iKKFqWlk8CWkbFLnEPrVGBAvwM4x5ezwNL6h1OOGh7fi2Qe+V4teW7wN6lCUA90x0FXbmuzO69B07huC0WtC2De0AyM6NHR3a7pcvU5zpK0+u416XNgx16PhtcnfWvpdRdOXQ/R9yxLEu9IEiUf4hsiRuvwhJF6i97JBDI7LOowBOEPBiAbMZaHa5lH9CZbtSz9KYrjYhZN9bI4RC4SCH863u6K8CjGrSYdFXMx8ybvj4gwqfVaEUL0Hr7PrWrQeHuW9+voegZA2Ao9baxNJSBPzfpubJMj5znbwx/39ZxWlFY9SwSG1WV+/v+N0yr0M9AFkx7iJ4of8RIFYJll8o9G2XJOaC1w5r1udzVuAd4V3l+OLX8cXl4KQRQJzqqi264n0q+quyT1ky23T/Q/2/zbFQkvnlQEdWbamyNZN3z0knb7jVik4H3K6XHIR8S8yq5UcN6uqNGPOVMRsx/07A+PxQHpO/EoYxPoVF51PEmbWWmQS6frjgZyy/B9A0X5lfCOIH7TWH8DbfGls4T7KA2nB2zDHevM+raw/3bUvgp/VYf+dPb+Xs+b2Osuw6hZ1h8FXXa78/eae5/xfrMN80w== +api: eJzVV01v2zgQ/SuETruAnaRd5JJbug22AdqiiLPYQxAIY2lssaVILUklMQz/952hZEuyacdu0QV6SkTO55uZ5+EyydFlVlZeGp1cJXforcQndAJEBXOpwWMulHRemJkApcSzsd9cBRmJPEtfCBNUQYmZVB6t1HMxXXRSQkOJIyF1puqcL32B0grnwdduJDKjZ3IucvQgFX2DzgXkpdTk0YKXT0iqM2NLYC9nySgxFdrwcZtTvB9J7p+1L7qtwJI/isMlVw/LhJ2TVGZq7elWcor/1mgX9DFM/HNdTtFyktJj6YQ3YorCoq+tJgSkFghZwZggR+GyAktIrpaJX1TsQgf9HzO7Wo02IfPJ4Yi/kIRo3LJZ21ZuxNhaz1DPrCnFm1PCPd5mP1Zqi8Oh3s6EtzWZaRJ3oZEskrDj9grQUI/MtQn90zYe6YqungGj0B+hmtGspsYoBP3/+O8j8DI2dj6W+RqGAiEP8O6ESG1NLpLVKGH/0iJ1Mce2euQTVxnt0LH824sL/jNMZNDugkTEWod80Sx5pD4nLagqJbOQwvlXx6rL3VDM9CtmPBaV5aHysnHsjQeVcrZut2Eo7uY+YBa9z8H3vYC1wB2xrbDH+4Y40gbaCHAENRA/hOxSwvxVmb2WOmcNOEdJBubaFRolSBgQ6yQ3n6/ffbx5TyfvbyfNv1RcL71i8U35Jo2hgfFAfSlFIlU0jIYu0yfqR9lUdVfEInN2Ol1ErxU4n5YmlzN5rBD4WLYNKdMJ1RvHXhJwPe+n6JQ0VOCNXaQ5nWjOzB3RQOtw2QLzVMaX9EGzbZ5TfKGmYnM+dahmKU2ENU+gImzBOrU3aWWqWlFgKQ+SNXtEUcNUNTL44lMyKXPww2pExAvQc0wJHZrGV5UG0vGUO/Z4eC3jfelt+xlUb9BIr6dxCJdIP0X6sKvi7oTH5nnf2Iy2KWTfmEeGOjamd2uCXW3DHohuyIejAXv2zA2Ie23yz5awV8H0ZYzwb0nC0nY1QUtDf2OtseLyp9B+ic7xzhHttnUakXBiybAGzHkF63AUn0CTfe5PBoaKXRje4OYYYgFf0Md5t13yjydmtZV+EVY5V9K2uTiDSp4V3lfvwMnsumath0f+Jd6+R7BoNwKPnbUJA9LkvN/mBgQ+39knPtzffxFBWtBoFZRSi/r6Fz/MM9/zNB+I7Bg3QfyQnyAQysSrcjDalmtSU4Er42Srs/ndoO3i7eX44o/xxSVHSCKeWJhV24WG+1X0F+tBZMuu6X6BF0MLMdPSeaVABoqtbeD3pu8ekl7fUasUhAefLpdURPzbqtWKj5vllpsxJyoitqP+nYFyeACeE98V0Vi/4aL3iCFmrVkm4a4/PpBTngsHomjfJd8ZxE96CByIt3mbdOE+8oeVHG/DHOtd/bSy/nbX/hD8Lg77770MBpg1t9dZhlW/qDsMvupz5V839zTn/wF9to6a sidebar_class_name: "get api-method" info_path: docs/api/superposition custom_edit_url: null @@ -62,7 +62,7 @@ Retrieves a paginated list of all workspaces with optional filtering by workspac diff --git a/docs/docs/api/migrate-workspace-schema.api.mdx b/docs/docs/api/migrate-workspace-schema.api.mdx index 35ed8ccb6..485544bae 100644 --- a/docs/docs/api/migrate-workspace-schema.api.mdx +++ b/docs/docs/api/migrate-workspace-schema.api.mdx @@ -5,7 +5,7 @@ description: "Migrates the workspace database schema to the new version of the t sidebar_label: "MigrateWorkspaceSchema" hide_title: true hide_table_of_contents: true -api: eJy1Vt9P2zAQ/leiPG1SSytGX/oGg2lIgyHKtIcKRdfk2hgSO9gOUFX533fnpE1L3RYk9hTH/vz5fD++8yJM0MRaFFYoGQ7DKzHTYNEENsXgRelHU0CMQQIWJmAwMHGKOQRWOYDEl+AZtaG9gZq6KYt5kRFD2AlVgcRFa5dJy/x3yTlyTAQrQEOOlmjC4XgRSvoh+OrsyE10QsHmFWBTGtdWhMNFaOcFo43VQs7CqhNqfCqFRjrR6hKrzorwtav0rCuSJVWKkKD+ENk9z5hCSYOG8cf9Pn+8Hnxzz4CwwXIzHRoraVFa3g5FkYnYOar3YJhjsW2TmjxgbNlbmt1qRW3BGy/57kC3BimM44/o+gcxO5naw2rz3oW0YEuzDeqEKMucAh5eXJ+e/bo4p5nzy1E9JD9bYTOGt26siTbIIcmFjMgSkXnNICdPxSxqMtQP0UjBSqLJ3LucgbFRrhIxFe8FgfXddqp0zishVRJ2rSDHrZ3+kT05SPpXeh4lNCP5Zuv+Ba1hzjlOhejxe8UMSOOYF+kHsky9RPhKScV0NjKYTSPKSa2eYd2tE6UyBMkmQGlVVKii5EKPOJW12gFFCZOsxuCrjYhSJGA3o+GBpyBnGJF3qB4ObNoo0/Gh++wyfiMWG2lx2Kh9t/Rkhyer2phs16uvOncVQWdbNv1F6ynRtaLzS9hto17fG+mqKvb9Sf9kWwMJqkod47WyP1Qpk4BQrfrRroFPOS+JV0vIRqipZC+0VjoY/BfZzNEYmPm0q2q94DHH5wLeATPuXa1YBVcgiZ/zj/1KwU0V98BCGWcMd7Fh2FvFwPQWm4Gresmkl9dh4BaFcamFnbsGaXJh0/kRFOIotbY4AyPi05IZx/fc796uI2jUK8B9y+bCWjtkN+fKQzxPpmyG7Ofd3U3g0AHVVUr3bUKy7KuuVHmdo77Hsvcc4+D7znEAF0Mhp8qRNrEclRR98r5o9qxaAvXw40G3/63bH7CFHCASWN7aPBuaWgja2K4eLhs2Ltrc/NRHVOMW1pUezQknk6V2clvn0bitZdaP4ZYEJBMWmCaZKP4pZyFtWyzYmj86qyqefipRc4bR8Bm0YEVz+ZaQ9NCY8ncKmcE99/5y2wjx12CX5csuJVn0SCdL/qPhI863H30V5fPynfbpltQnrr0KV9ZwEdWrp3GMhV1b2xKdar28b36P7ij9/gGbTAQd +api: eJy1Vl1P2zAU/StRnjappRWDl77BYBrSYIgy7aFC0W1y2xgSO9gOUFX577vXSZt+uC1I7CmOfXx8P489DxM0sRaFFUqGg/BaTDVYNIFNMXhV+skUEGOQgIUxGAxMnGIOgVUOIPE1eEFtaG+gJm7KYl5kxBB2QlUgcdHaVdIy/11wDh0TwQrQkKMlmnAwmoeSfgi+PDtyE51QsHkF2JTGtRXhYB7aWcFoY7WQ07DqhBqfS6GRTrS6xKqzJHzrKj3timRBlSIkqD9E9sAzplDSoGH8cb/PH28EN/wMCBssNtOhsZIWpeXtUBSZiF2geo+GOebbNqnxI8aWo6U5rFbUFmxEyecDeQ1SGMcfkfsHMTuZ2sNq896FtGBLsw3qhCjLnBIeXt6cnf+6vKCZi6thPaQ4W2EzhrdhrInWyCHJhYzIEpF5zaAgT8Q0airUD9FIyUqi8cy7nIGxUa4SMRHvBYH1eTtROueVkDoJu1ZQ4FZO/8ieHCT9Kz2LEpqR7NlqfEFrmHGNUyN64l4xA9I45kX6gSxTrxG+UVExnY0MZpOIalKrF1gN61ipDEGyCVBaFRWqKLnRIy5lrXZAUcI4qzH4ZiOiFAnY9Wx44CnIKUYUHeqHg5vW0H6X20YeHfJ4l3ub56xlb62QDruxLy6eevLUYZvF7Q739fOutulsC62/zT1NvdKmftG7a/TueyN2VcW5OOmfbKsmQVWpY7xR9ocqZRIQqtVL2nXq09or4tUSsiFqavJLrZUOTv+L0OZoDEx9ale1UfCY4wsB74Ap33atvAXXIImf65HjSslNFd+ahTLOGL73BmFvmQPTm68nruol415ep4EvNYxLLezMXakmFzadHUEhjlJri3MwIj4rmXH0wDfk5jqCRr0EPLRsLq11QHZzLiPE82TKesp+3t/fBg4dUJ+l5G+TksVN7Jqb1znreyx7zzEOvu8cB3A5FHKiHGmTy2FJ2afoi2bP8hKhW//4tNv/1u2fsoWcIJJk3to8NJpeCNrcLp86azbO29r81GdXExbWlR7NCaeRpXYCXdfRqO1l1o/BlgQkYxaYppgo/ylXIW2bz9maPzqrKp5+LlFzhdHwBbRgRXP1lpD00JjqdwKZwT1+f7lrhPlrsMvyxb0mWfRIJ0v+o+ETzrafiRXV8+Jl9+mW1CeuvCOX1nAT1atncYyFXVnbEp1qtb1vfw/vqfz+AcOTFeQ= sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null @@ -62,7 +62,7 @@ Migrates the workspace database schema to the new version of the template diff --git a/docs/docs/api/update-workspace.api.mdx b/docs/docs/api/update-workspace.api.mdx index 711315a6e..f5e871b72 100644 --- a/docs/docs/api/update-workspace.api.mdx +++ b/docs/docs/api/update-workspace.api.mdx @@ -5,7 +5,7 @@ description: "Updates an existing workspace configuration, allowing modification sidebar_label: "UpdateWorkspace" hide_title: true hide_table_of_contents: true -api: eJzdV1Fv2zYQ/isEnzZAdoysefFb0qZogK0oYnd7SA2Bls42W4nkSCqxYfi/746ULdmWnQRLH7Y+pDR5d7z77u47as1zcJmVxkut+JB/Nbnw4JhQDJbSeanm7EnbH86IDFim1UzOKytIOmGiKPQTSZQ6lzOZhW2mZ0zkpVTMgSd9l7BSKDSr7YrlsgTlUAx3cbNl21htwHoJrs/+FIWMfsQb2SNYUoo+gUJxOSONR5lD3ucJJ91w/V2+i+KvrW08t/B3Bc7f6HzFh2uOZtGMp6Uwpqhdv/juCIQ1d9kCSkErvzKABvX0O2Qe7TRe0unO+zREnKKSLFpqzlsEgG8SHuNI6ziORZKDPIw1qxQCeABAwoxwjn3jqiqKb5xF7T7dsMM4bTBu3SOsFSu8RnooXYeLaKGJxnnhqw6phIOqSj584Lefr29+v/2AOx/uRnE5SbiXviDxHfKjaIjcAzSRkU38EQonhSVCSb761EExSzETmFHRBnCqdQFCkQFReZ0abaoCU5tSAq0+IQpKTIsoA0ufPsZq2se9Q3wh1BxSCwKr4BmlTawoaSEnNLrroAXIQUHex2p8X1fhZt+etxXghhFWIGqYeLxizRX+QEvNVWEDE0rlYoRf4PqobpsCPDS/M7jsaTvvyXxragEiB/sqYxPacQYLLrbF5WBA/3Uxyw4ChkJsq8WTt+/IGF6H8xiuUNIF+ynG/azMSUuthgnuvUjy7Vvr7ViIRLD+PeTpdNV5XAjn00j3LxUSvivambYlnXCqip5HGmjf/hqdf098/2tueiaeU87v5WKvLJ536lyUHdXRUVVNTo77tas7TzVBcsyX3U3b0aLn6DvSVou/EfR3g3fHrIeiurIZfNb+o67wwYNSDe2h1lUXV96hXatEMQKLvXprrbbs6qfwZQnOiXkXaW2a8Dvc6YKANMScplXDUuwPodA+FR4Billd6DwOrIwmVhhcQ36xQ99drPdTtqFRBFllpV+FQehK6RervjCyv/De3Agns+uKzDxMaK4dnoOwYHcCk8baiDCKMJy2ucOF9o+eaZ/G4y8sSDNsowVGWSdiOz9DZ9I55fqMZy+5JoifuycIhMxRGdw3T97bpShNAWeerA3JHs6I5qSbaB+2ApOuMdeaZq9iWXpXnOTVeHiGSfcFTnJn/dCSaqZDBupyH1XoldFO1gA3UFwOLq96g996gytKJ4p4xIRU67dU5AnW/vDYS2Trw+M/+6VV1ylhfmEKIcOYqmwYd7GbW+9h4u/hAQVjnSwQOZJbr7E34KstNhvaxnq11OO4fBRWUvZCx+fI9bhG3piJwsEZUH+5ryffr+yUq9tngaIpg9VQ0S9c/oDV8fN6g4yyfRG/uSfxxtb7e+cN0Vg8rfm1NyYDjcQR5Tca11kGxp+VbRPxl+vx+08oPa2/jLHASMmKJ/pqxr8BHB0iDFQZ9tY4stW8CpODR6P07x+RuNXG +api: eJzlV99v2zYQ/lcIPm2A7RhZ8+K3pE3RAFtRxO72kBoCLZ1tthKpkVRiw/D/vjtSlmSbdhIsfRjWh5Qmvzvez++oDc/ApkaWTmrFR/xrmQkHlgnFYCWtk2rBnrT5YUuRAku1mstFZQShe0zkuX4iRKEzOZep32Z6zkRWSMUsOJK3PVYIhWq1WbNMFqAswnAXNzu6S6NLME6CHbA/RS6DHeFG9giGhIJNoBAu5yTxKDPIBrzHSdZff5c1Xvy1043nBv6uwLobna35aMNRLapxtBRlmdemX3y3FIQNt+kSCkErty4BFerZd0gd6mmtpNPG+sR7nKCQzDti1hkMAN/2ePAjqf04hvQO8jDRrFIYwIMA9FgprGXfuKry/BtnQXpANzQxTtoYd+4Rxog1XiMdFDZiImpovbFOuCqC6nFQVcFHD/z28/XN77cfcOfD3Tgspz3upMsJ3kR+HBSReYAqUtKJP3zhJLDCUJKtLrGQzxPMBGZUdAM40zoHoUiBqJxOSl1WOaY2oQQafQIKSszygIGVSx5DNe3HPQJfCrWAxIDAKnhWaA8djyfVnDSQUbzildIJ2UHJ3od6fV/X6XZfnzMV4EYpjMC4YmngFRuu8Adqaq/yG5hyKqhSuCWujyq7LdFD9Y3CVV+bRV9mO1VLEBmYVymb0o4tsSRD41wOh/RfjHuaEDAEsZ0U7719zwb3Isaju0JJ6/Un6PezmJOaOi3lzXsR8u2b7+14iiBY8w6yZLaOHufCuiQMhJeChIt5O9emoBNOVdF3SBTd218j8++p8X/OXs94fMq9w3v2srdXSM+7cS4ukXqK1GGbxeMOj/XzqbbpHTNsvM0jTX2O8APRdRgfk/Bu+O6YJxGqK5PCZ+0+6gofUYhqiRKlrmLseod6jRL5GAx2960x2rCrn8KwBVgrFjGa27buR8yJhYAkxILmW8tr7A+hUD8VIgUUs7rUWRhxKc04P+pG/KKJvr3Y7KdsS8ML0spIt/aj0xbSLdcDUcrB0rnyRliZXlek5mFKk/DwHIQB0wCmrbYxxSiE4bTOJi60f/T0+zSZfGEezbCtluhlnYjdxPW9TOeU6zOWveQaDz93jwf4zFEZ3LfP6NuVKMoczjyDW1o+nCrtSZyaH3aAaWwwdubfq3iZXiInmTgcnuHefcBJtg2wA37tTD6p5tqnpu6DcYXmltrKOvJtjC6Hl1f94W/94RXJIcRhsEi0fpYFAmHdr5y9DHe+cv6zn3V1AVMyLspcSD+8KuMnZ2jzztOaiH10wM1YQEuMHOE2G2wa+Gry7Za2sZANNT8uH4WRlFZPBRkOAVwjocxFbuFMUH+5r0fkr+yUqbsXhqLxg2VS0S9c/oD18Ut9i1Sze1y/uSXhxs5TvrGG+C2c1sTbn5CCFnE0C1qJ6zSF0p3Fdhn6y/Xk/SdEz+rPcCwwEjLiiT7R8a8PjvYeeg71exuc5WpR+ZHCg1L69w+1BPxp sidebar_class_name: "patch api-method" info_path: docs/api/superposition custom_edit_url: null @@ -54,7 +54,7 @@ Updates an existing workspace configuration, allowing modification of admin sett @@ -62,7 +62,7 @@ Updates an existing workspace configuration, allowing modification of admin sett diff --git a/smithy/models/workspace.smithy b/smithy/models/workspace.smithy index 03424ff5c..ac89b1032 100644 --- a/smithy/models/workspace.smithy +++ b/smithy/models/workspace.smithy @@ -24,6 +24,7 @@ resource Workspace { auto_populate_control: Boolean enable_context_validation: Boolean enable_change_reason_validation: Boolean + change_reason: String } list: ListWorkspace update: UpdateWorkspace @@ -62,6 +63,9 @@ structure CreateWorkspaceRequest for Workspace with [OrganisationMixin] { $enable_context_validation $enable_change_reason_validation + + @required + $change_reason } structure UpdateWorkspaceRequest for Workspace with [OrganisationMixin] { @@ -88,6 +92,8 @@ structure UpdateWorkspaceRequest for Workspace with [OrganisationMixin] { $enable_context_validation $enable_change_reason_validation + + $change_reason } structure WorkspaceSelectorRequest for Workspace with [OrganisationMixin] { @@ -145,6 +151,9 @@ structure WorkspaceResponse for Workspace { @required $enable_change_reason_validation + + @required + $change_reason } list WorkspaceList { diff --git a/smithy/patches/java.patch b/smithy/patches/java.patch index 912f9a64e..ea52a8bc3 100644 --- a/smithy/patches/java.patch +++ b/smithy/patches/java.patch @@ -257,6 +257,7 @@ index a1dfbada..589784f9 100644 - "last_modified_at", SharedSchemas.DATE_TIME, - "organisation_id", PreludeSchemas.STRING, - "allow_experiment_self_approval", PreludeSchemas.BOOLEAN, +- "change_reason", PreludeSchemas.STRING, - "workspace_schema_name", PreludeSchemas.STRING, - "metrics", PreludeSchemas.DOCUMENT); + private static final Map $PROPERTIES = Map.ofEntries( @@ -274,6 +275,7 @@ index a1dfbada..589784f9 100644 + Map.entry("last_modified_at", SharedSchemas.DATE_TIME), + Map.entry("organisation_id", PreludeSchemas.STRING), + Map.entry("allow_experiment_self_approval", PreludeSchemas.BOOLEAN), ++ Map.entry("change_reason", PreludeSchemas.STRING), + Map.entry("workspace_schema_name", PreludeSchemas.STRING), + Map.entry("metrics", PreludeSchemas.DOCUMENT)); diff --git a/superposition.sql b/superposition.sql index 0a3f0fefd..a545ca9ae 100644 --- a/superposition.sql +++ b/superposition.sql @@ -147,3 +147,6 @@ ALTER TABLE superposition.workspaces DROP COLUMN IF EXISTS strict_mode; ALTER TABLE superposition.workspaces ADD COLUMN IF NOT EXISTS encryption_key TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS key_rotated_at TIMESTAMPTZ; + +ALTER TABLE superposition.workspaces +ADD COLUMN IF NOT EXISTS change_reason TEXT NOT NULL DEFAULT 'workspace created'; \ No newline at end of file diff --git a/tests/index.ts b/tests/index.ts index 1477e1c7c..714ee1d16 100644 --- a/tests/index.ts +++ b/tests/index.ts @@ -32,6 +32,7 @@ async function setupWorkspace() { auto_populate_control: false, enable_context_validation: true, enable_change_reason_validation: true, + change_reason: "Creating test workspace for integration tests", }); console.info(`Create test workspace as ${TEST_WORKSPACE}`); diff --git a/tests/src/config.test.ts b/tests/src/config.test.ts index 63b360d37..c453361b4 100644 --- a/tests/src/config.test.ts +++ b/tests/src/config.test.ts @@ -82,6 +82,7 @@ describe("Config API - GetConfig and GetConfigFast", () => { workspace_name: ENV.workspace_id, workspace_admin_email: "admin@example.com", config_version: configVersionId, + change_reason: "Setting config version for tests", }); const resp_c = await superpositionClient.send(cmd_c); @@ -122,6 +123,7 @@ describe("Config API - GetConfig and GetConfigFast", () => { workspace_admin_email: "updated-admin@example.com", description: "Unset config version", config_version: "null", + change_reason: "Unsetting config version for tests", }; const cmd_2 = new UpdateWorkspaceCommand(input_2); diff --git a/tests/src/context.test.ts b/tests/src/context.test.ts index c4f57bda6..c9db390f3 100644 --- a/tests/src/context.test.ts +++ b/tests/src/context.test.ts @@ -129,6 +129,7 @@ describe("Context API Integration Tests", () => { workspace_admin_email: "updated-admin@example.com", workspace_status: WorkspaceStatus.ENABLED, mandatory_dimensions: ["clientId"], + change_reason: "Adding mandatory dimension for context tests", }; const cmd = new UpdateWorkspaceCommand(input); diff --git a/tests/src/experiment_groups.test.ts b/tests/src/experiment_groups.test.ts index 412912a10..f4185fa29 100644 --- a/tests/src/experiment_groups.test.ts +++ b/tests/src/experiment_groups.test.ts @@ -218,6 +218,7 @@ describe("Experiment Groups API Integration Tests", () => { workspace_admin_email: "updated-admin@example.com", workspace_status: WorkspaceStatus.ENABLED, mandatory_dimensions: ["clientId"], + change_reason: "Adding mandatory dimension for experiment group tests", }; const cmd = new UpdateWorkspaceCommand(input); @@ -231,6 +232,7 @@ describe("Experiment Groups API Integration Tests", () => { workspace_admin_email: "updated-admin@example.com", workspace_status: WorkspaceStatus.ENABLED, mandatory_dimensions: [], + change_reason: "Removing mandatory dimension for experiment group tests", }; const cmd = new UpdateWorkspaceCommand(input); diff --git a/tests/src/experiments.test.ts b/tests/src/experiments.test.ts index b033de0f6..49defc753 100644 --- a/tests/src/experiments.test.ts +++ b/tests/src/experiments.test.ts @@ -216,6 +216,7 @@ describe("Experiments API", () => { auto_populate_control: true, enable_context_validation: true, enable_change_reason_validation: true, + change_reason: "Creating test workspace for auto-populate control experiments", }); await superpositionClient.send(createWorkspaceCmd); @@ -381,6 +382,7 @@ describe("Experiments API", () => { workspace_admin_email: "updated-admin@example.com", workspace_status: WorkspaceStatus.ENABLED, mandatory_dimensions: ["clientId"], + change_reason: "Adding mandatory dimension for experiment tests", }; const cmd = new UpdateWorkspaceCommand(input); @@ -394,6 +396,7 @@ describe("Experiments API", () => { workspace_admin_email: "updated-admin@example.com", workspace_status: WorkspaceStatus.ENABLED, mandatory_dimensions: [], + change_reason: "Removing mandatory dimension for experiment tests", }; const cmd = new UpdateWorkspaceCommand(input); diff --git a/tests/src/workspace.test.ts b/tests/src/workspace.test.ts index 5a63a8b95..4792ed152 100644 --- a/tests/src/workspace.test.ts +++ b/tests/src/workspace.test.ts @@ -53,6 +53,7 @@ describe("Workspace API", () => { auto_populate_control: false, enable_context_validation: true, enable_change_reason_validation: true, + change_reason: "created workspace for test" }; const cmd = new CreateWorkspaceCommand(input); @@ -129,7 +130,7 @@ describe("Workspace API", () => { // Find our workspace in the list const workspace = response.data?.find( - (w) => w.workspace_name === testWorkspaceName + (w: any) => w.workspace_name === testWorkspaceName ); expect(workspace).toBeDefined(); expect(workspace?.workspace_name).toBe(testWorkspaceName); @@ -157,6 +158,7 @@ describe("Workspace API", () => { workspace_admin_email: "updated-admin@example.com", workspace_status: WorkspaceStatus.ENABLED, mandatory_dimensions: ["os", "client", "version"], + change_reason: "Updating workspace for automated tests", }; const cmd = new UpdateWorkspaceCommand(input); @@ -226,7 +228,7 @@ describe("Workspace API", () => { // Find our workspace in the list const workspace = response.data?.find( - (w) => w.workspace_name === testWorkspaceName + (w: any) => w.workspace_name === testWorkspaceName ); expect(workspace).toBeDefined(); expect(workspace?.workspace_admin_email).toBe( @@ -297,6 +299,7 @@ describe("Workspace API", () => { auto_populate_control: false, enable_context_validation: true, enable_change_reason_validation: true, + change_reason: "test-with-invalid-data" }; const cmd = new CreateWorkspaceCommand(input); @@ -322,6 +325,7 @@ describe("Workspace API", () => { auto_populate_control: false, enable_context_validation: true, enable_change_reason_validation: true, + change_reason: "creating workspace with special characters" }; const cmd = new CreateWorkspaceCommand(input);