diff --git a/clients/haskell/sdk/Io/Superposition/Command/CreateDefaultConfig.hs b/clients/haskell/sdk/Io/Superposition/Command/CreateDefaultConfig.hs index 21bde23c7..52147a5c4 100644 --- a/clients/haskell/sdk/Io/Superposition/Command/CreateDefaultConfig.hs +++ b/clients/haskell/sdk/Io/Superposition/Command/CreateDefaultConfig.hs @@ -11,11 +11,13 @@ import qualified Io.Superposition.Model.CreateDefaultConfigInput import qualified Io.Superposition.Model.CreateDefaultConfigOutput import qualified Io.Superposition.Model.InternalServerError import qualified Io.Superposition.Model.WebhookFailed +import qualified Io.Superposition.Model.WorkspaceLockConflict import qualified Io.Superposition.SuperpositionClient import qualified Io.Superposition.Utility data CreateDefaultConfigError = WebhookFailed Io.Superposition.Model.WebhookFailed.WebhookFailed + | WorkspaceLockConflict Io.Superposition.Model.WorkspaceLockConflict.WorkspaceLockConflict | InternalServerError Io.Superposition.Model.InternalServerError.InternalServerError | BuilderError Data.Text.Text | DeSerializationError Io.Superposition.Utility.HttpMetadata Data.Text.Text @@ -30,6 +32,7 @@ instance Io.Superposition.Utility.OperationError CreateDefaultConfigError where getErrorParser status | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.WebhookFailed.WebhookFailed) = Just (fmap WebhookFailed (Io.Superposition.Utility.responseParser @Io.Superposition.Model.WebhookFailed.WebhookFailed)) + | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.WorkspaceLockConflict.WorkspaceLockConflict) = Just (fmap WorkspaceLockConflict (Io.Superposition.Utility.responseParser @Io.Superposition.Model.WorkspaceLockConflict.WorkspaceLockConflict)) | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.InternalServerError.InternalServerError) = Just (fmap InternalServerError (Io.Superposition.Utility.responseParser @Io.Superposition.Model.InternalServerError.InternalServerError)) | otherwise = Nothing diff --git a/clients/haskell/sdk/Io/Superposition/Command/DeleteDefaultConfig.hs b/clients/haskell/sdk/Io/Superposition/Command/DeleteDefaultConfig.hs index 4d223c869..7c0ba5180 100644 --- a/clients/haskell/sdk/Io/Superposition/Command/DeleteDefaultConfig.hs +++ b/clients/haskell/sdk/Io/Superposition/Command/DeleteDefaultConfig.hs @@ -12,12 +12,14 @@ import qualified Io.Superposition.Model.DeleteDefaultConfigOutput import qualified Io.Superposition.Model.InternalServerError import qualified Io.Superposition.Model.ResourceNotFound import qualified Io.Superposition.Model.WebhookFailed +import qualified Io.Superposition.Model.WorkspaceLockConflict import qualified Io.Superposition.SuperpositionClient import qualified Io.Superposition.Utility data DeleteDefaultConfigError = ResourceNotFound Io.Superposition.Model.ResourceNotFound.ResourceNotFound | WebhookFailed Io.Superposition.Model.WebhookFailed.WebhookFailed + | WorkspaceLockConflict Io.Superposition.Model.WorkspaceLockConflict.WorkspaceLockConflict | InternalServerError Io.Superposition.Model.InternalServerError.InternalServerError | BuilderError Data.Text.Text | DeSerializationError Io.Superposition.Utility.HttpMetadata Data.Text.Text @@ -33,6 +35,7 @@ instance Io.Superposition.Utility.OperationError DeleteDefaultConfigError where getErrorParser status | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.ResourceNotFound.ResourceNotFound) = Just (fmap ResourceNotFound (Io.Superposition.Utility.responseParser @Io.Superposition.Model.ResourceNotFound.ResourceNotFound)) | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.WebhookFailed.WebhookFailed) = Just (fmap WebhookFailed (Io.Superposition.Utility.responseParser @Io.Superposition.Model.WebhookFailed.WebhookFailed)) + | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.WorkspaceLockConflict.WorkspaceLockConflict) = Just (fmap WorkspaceLockConflict (Io.Superposition.Utility.responseParser @Io.Superposition.Model.WorkspaceLockConflict.WorkspaceLockConflict)) | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.InternalServerError.InternalServerError) = Just (fmap InternalServerError (Io.Superposition.Utility.responseParser @Io.Superposition.Model.InternalServerError.InternalServerError)) | otherwise = Nothing diff --git a/clients/haskell/sdk/Io/Superposition/Command/UpdateDefaultConfig.hs b/clients/haskell/sdk/Io/Superposition/Command/UpdateDefaultConfig.hs index 4f8c5172e..6987e7fca 100644 --- a/clients/haskell/sdk/Io/Superposition/Command/UpdateDefaultConfig.hs +++ b/clients/haskell/sdk/Io/Superposition/Command/UpdateDefaultConfig.hs @@ -12,12 +12,14 @@ import qualified Io.Superposition.Model.ResourceNotFound import qualified Io.Superposition.Model.UpdateDefaultConfigInput import qualified Io.Superposition.Model.UpdateDefaultConfigOutput import qualified Io.Superposition.Model.WebhookFailed +import qualified Io.Superposition.Model.WorkspaceLockConflict import qualified Io.Superposition.SuperpositionClient import qualified Io.Superposition.Utility data UpdateDefaultConfigError = ResourceNotFound Io.Superposition.Model.ResourceNotFound.ResourceNotFound | WebhookFailed Io.Superposition.Model.WebhookFailed.WebhookFailed + | WorkspaceLockConflict Io.Superposition.Model.WorkspaceLockConflict.WorkspaceLockConflict | InternalServerError Io.Superposition.Model.InternalServerError.InternalServerError | BuilderError Data.Text.Text | DeSerializationError Io.Superposition.Utility.HttpMetadata Data.Text.Text @@ -33,6 +35,7 @@ instance Io.Superposition.Utility.OperationError UpdateDefaultConfigError where getErrorParser status | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.ResourceNotFound.ResourceNotFound) = Just (fmap ResourceNotFound (Io.Superposition.Utility.responseParser @Io.Superposition.Model.ResourceNotFound.ResourceNotFound)) | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.WebhookFailed.WebhookFailed) = Just (fmap WebhookFailed (Io.Superposition.Utility.responseParser @Io.Superposition.Model.WebhookFailed.WebhookFailed)) + | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.WorkspaceLockConflict.WorkspaceLockConflict) = Just (fmap WorkspaceLockConflict (Io.Superposition.Utility.responseParser @Io.Superposition.Model.WorkspaceLockConflict.WorkspaceLockConflict)) | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.InternalServerError.InternalServerError) = Just (fmap InternalServerError (Io.Superposition.Utility.responseParser @Io.Superposition.Model.InternalServerError.InternalServerError)) | otherwise = Nothing diff --git a/clients/haskell/sdk/Io/Superposition/Model/CreateWorkspaceOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/CreateWorkspaceOutput.hs index 4eea23ba2..5fa2b0a0c 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, + setWorkspaceLock, 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, + workspace_lock ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -48,6 +50,7 @@ import qualified Data.Text import qualified Data.Time import qualified GHC.Generics import qualified GHC.Show +import qualified Io.Superposition.Model.WorkspaceLock import qualified Io.Superposition.Model.WorkspaceStatus import qualified Io.Superposition.Utility import qualified Network.HTTP.Types @@ -69,7 +72,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, + workspace_lock :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -94,7 +98,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, + "workspace_lock" Data.Aeson..= workspace_lock a ] @@ -119,6 +124,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..:? "workspace_lock") @@ -140,7 +146,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, + workspace_lockBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock } deriving ( GHC.Generics.Generic ) @@ -163,7 +170,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, + workspace_lockBuilderState = Data.Maybe.Nothing } type CreateWorkspaceOutputBuilder = Control.Monad.State.Strict.State CreateWorkspaceOutputBuilderState @@ -236,6 +244,10 @@ setEnableChangeReasonValidation :: Bool -> CreateWorkspaceOutputBuilder () setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = Data.Maybe.Just value })) +setWorkspaceLock :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock -> CreateWorkspaceOutputBuilder () +setWorkspaceLock value = + Control.Monad.State.Strict.modify (\s -> (s { workspace_lockBuilderState = value })) + build :: CreateWorkspaceOutputBuilder () -> Data.Either.Either Data.Text.Text CreateWorkspaceOutput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -256,6 +268,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) + workspace_lock' <- Data.Either.Right (workspace_lockBuilderState st) Data.Either.Right (CreateWorkspaceOutput { workspace_name = workspace_name', organisation_id = organisation_id', @@ -273,7 +286,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', + workspace_lock = workspace_lock' }) @@ -298,6 +312,7 @@ instance Io.Superposition.Utility.FromResponseParser CreateWorkspaceOutput where var14 <- Io.Superposition.Utility.deSerField "workspace_schema_name" var15 <- Io.Superposition.Utility.deSerField "metrics" var16 <- Io.Superposition.Utility.deSerField "workspace_name" + var17 <- Io.Superposition.Utility.deSerField "workspace_lock" pure $ CreateWorkspaceOutput { workspace_name = var16, organisation_id = var12, @@ -315,6 +330,7 @@ instance Io.Superposition.Utility.FromResponseParser CreateWorkspaceOutput where allow_experiment_self_approval = var13, auto_populate_control = var1, enable_context_validation = var2, - enable_change_reason_validation = var9 + enable_change_reason_validation = var9, + workspace_lock = var17 } diff --git a/clients/haskell/sdk/Io/Superposition/Model/GetWorkspaceOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/GetWorkspaceOutput.hs index 08d873f02..c3a2972be 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, + setWorkspaceLock, 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, + workspace_lock ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -48,6 +50,7 @@ import qualified Data.Text import qualified Data.Time import qualified GHC.Generics import qualified GHC.Show +import qualified Io.Superposition.Model.WorkspaceLock import qualified Io.Superposition.Model.WorkspaceStatus import qualified Io.Superposition.Utility import qualified Network.HTTP.Types @@ -69,7 +72,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, + workspace_lock :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -94,7 +98,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, + "workspace_lock" Data.Aeson..= workspace_lock a ] @@ -119,6 +124,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..:? "workspace_lock") @@ -140,7 +146,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, + workspace_lockBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock } deriving ( GHC.Generics.Generic ) @@ -163,7 +170,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, + workspace_lockBuilderState = Data.Maybe.Nothing } type GetWorkspaceOutputBuilder = Control.Monad.State.Strict.State GetWorkspaceOutputBuilderState @@ -236,6 +244,10 @@ setEnableChangeReasonValidation :: Bool -> GetWorkspaceOutputBuilder () setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = Data.Maybe.Just value })) +setWorkspaceLock :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock -> GetWorkspaceOutputBuilder () +setWorkspaceLock value = + Control.Monad.State.Strict.modify (\s -> (s { workspace_lockBuilderState = value })) + build :: GetWorkspaceOutputBuilder () -> Data.Either.Either Data.Text.Text GetWorkspaceOutput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -256,6 +268,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) + workspace_lock' <- Data.Either.Right (workspace_lockBuilderState st) Data.Either.Right (GetWorkspaceOutput { workspace_name = workspace_name', organisation_id = organisation_id', @@ -273,7 +286,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', + workspace_lock = workspace_lock' }) @@ -298,6 +312,7 @@ instance Io.Superposition.Utility.FromResponseParser GetWorkspaceOutput where var14 <- Io.Superposition.Utility.deSerField "workspace_schema_name" var15 <- Io.Superposition.Utility.deSerField "metrics" var16 <- Io.Superposition.Utility.deSerField "workspace_name" + var17 <- Io.Superposition.Utility.deSerField "workspace_lock" pure $ GetWorkspaceOutput { workspace_name = var16, organisation_id = var12, @@ -315,6 +330,7 @@ instance Io.Superposition.Utility.FromResponseParser GetWorkspaceOutput where allow_experiment_self_approval = var13, auto_populate_control = var1, enable_context_validation = var2, - enable_change_reason_validation = var9 + enable_change_reason_validation = var9, + workspace_lock = var17 } diff --git a/clients/haskell/sdk/Io/Superposition/Model/MigrateWorkspaceSchemaOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/MigrateWorkspaceSchemaOutput.hs index 56057b6c6..e9b759d5d 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, + setWorkspaceLock, 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, + workspace_lock ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -48,6 +50,7 @@ import qualified Data.Text import qualified Data.Time import qualified GHC.Generics import qualified GHC.Show +import qualified Io.Superposition.Model.WorkspaceLock import qualified Io.Superposition.Model.WorkspaceStatus import qualified Io.Superposition.Utility import qualified Network.HTTP.Types @@ -69,7 +72,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, + workspace_lock :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -94,7 +98,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, + "workspace_lock" Data.Aeson..= workspace_lock a ] @@ -119,6 +124,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..:? "workspace_lock") @@ -140,7 +146,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, + workspace_lockBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock } deriving ( GHC.Generics.Generic ) @@ -163,7 +170,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, + workspace_lockBuilderState = Data.Maybe.Nothing } type MigrateWorkspaceSchemaOutputBuilder = Control.Monad.State.Strict.State MigrateWorkspaceSchemaOutputBuilderState @@ -236,6 +244,10 @@ setEnableChangeReasonValidation :: Bool -> MigrateWorkspaceSchemaOutputBuilder ( setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = Data.Maybe.Just value })) +setWorkspaceLock :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock -> MigrateWorkspaceSchemaOutputBuilder () +setWorkspaceLock value = + Control.Monad.State.Strict.modify (\s -> (s { workspace_lockBuilderState = value })) + build :: MigrateWorkspaceSchemaOutputBuilder () -> Data.Either.Either Data.Text.Text MigrateWorkspaceSchemaOutput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -256,6 +268,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) + workspace_lock' <- Data.Either.Right (workspace_lockBuilderState st) Data.Either.Right (MigrateWorkspaceSchemaOutput { workspace_name = workspace_name', organisation_id = organisation_id', @@ -273,7 +286,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', + workspace_lock = workspace_lock' }) @@ -298,6 +312,7 @@ instance Io.Superposition.Utility.FromResponseParser MigrateWorkspaceSchemaOutpu var14 <- Io.Superposition.Utility.deSerField "workspace_schema_name" var15 <- Io.Superposition.Utility.deSerField "metrics" var16 <- Io.Superposition.Utility.deSerField "workspace_name" + var17 <- Io.Superposition.Utility.deSerField "workspace_lock" pure $ MigrateWorkspaceSchemaOutput { workspace_name = var16, organisation_id = var12, @@ -315,6 +330,7 @@ instance Io.Superposition.Utility.FromResponseParser MigrateWorkspaceSchemaOutpu allow_experiment_self_approval = var13, auto_populate_control = var1, enable_context_validation = var2, - enable_change_reason_validation = var9 + enable_change_reason_validation = var9, + workspace_lock = var17 } diff --git a/clients/haskell/sdk/Io/Superposition/Model/UpdateWorkspaceOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/UpdateWorkspaceOutput.hs index ec6693695..22c9ef33d 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, + setWorkspaceLock, 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, + workspace_lock ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -48,6 +50,7 @@ import qualified Data.Text import qualified Data.Time import qualified GHC.Generics import qualified GHC.Show +import qualified Io.Superposition.Model.WorkspaceLock import qualified Io.Superposition.Model.WorkspaceStatus import qualified Io.Superposition.Utility import qualified Network.HTTP.Types @@ -69,7 +72,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, + workspace_lock :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -94,7 +98,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, + "workspace_lock" Data.Aeson..= workspace_lock a ] @@ -119,6 +124,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..:? "workspace_lock") @@ -140,7 +146,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, + workspace_lockBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock } deriving ( GHC.Generics.Generic ) @@ -163,7 +170,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, + workspace_lockBuilderState = Data.Maybe.Nothing } type UpdateWorkspaceOutputBuilder = Control.Monad.State.Strict.State UpdateWorkspaceOutputBuilderState @@ -236,6 +244,10 @@ setEnableChangeReasonValidation :: Bool -> UpdateWorkspaceOutputBuilder () setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = Data.Maybe.Just value })) +setWorkspaceLock :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock -> UpdateWorkspaceOutputBuilder () +setWorkspaceLock value = + Control.Monad.State.Strict.modify (\s -> (s { workspace_lockBuilderState = value })) + build :: UpdateWorkspaceOutputBuilder () -> Data.Either.Either Data.Text.Text UpdateWorkspaceOutput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -256,6 +268,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) + workspace_lock' <- Data.Either.Right (workspace_lockBuilderState st) Data.Either.Right (UpdateWorkspaceOutput { workspace_name = workspace_name', organisation_id = organisation_id', @@ -273,7 +286,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', + workspace_lock = workspace_lock' }) @@ -298,6 +312,7 @@ instance Io.Superposition.Utility.FromResponseParser UpdateWorkspaceOutput where var14 <- Io.Superposition.Utility.deSerField "workspace_schema_name" var15 <- Io.Superposition.Utility.deSerField "metrics" var16 <- Io.Superposition.Utility.deSerField "workspace_name" + var17 <- Io.Superposition.Utility.deSerField "workspace_lock" pure $ UpdateWorkspaceOutput { workspace_name = var16, organisation_id = var12, @@ -315,6 +330,7 @@ instance Io.Superposition.Utility.FromResponseParser UpdateWorkspaceOutput where allow_experiment_self_approval = var13, auto_populate_control = var1, enable_context_validation = var2, - enable_change_reason_validation = var9 + enable_change_reason_validation = var9, + workspace_lock = var17 } diff --git a/clients/haskell/sdk/Io/Superposition/Model/WorkspaceLock.hs b/clients/haskell/sdk/Io/Superposition/Model/WorkspaceLock.hs new file mode 100644 index 000000000..52a5df446 --- /dev/null +++ b/clients/haskell/sdk/Io/Superposition/Model/WorkspaceLock.hs @@ -0,0 +1,121 @@ +module Io.Superposition.Model.WorkspaceLock ( + setLockId, + setOperation, + setLockedBy, + setAcquiredAt, + setExpiresAt, + build, + WorkspaceLockBuilder, + WorkspaceLock, + lock_id, + operation, + locked_by, + acquired_at, + expires_at +) where +import qualified Control.Applicative +import qualified Control.Monad.State.Strict +import qualified Data.Aeson +import qualified Data.Either +import qualified Data.Eq +import qualified Data.Functor +import qualified Data.Maybe +import qualified Data.Text +import qualified Data.Time +import qualified GHC.Generics +import qualified GHC.Show +import qualified Io.Superposition.Utility + +data WorkspaceLock = WorkspaceLock { + lock_id :: Data.Text.Text, + operation :: Data.Text.Text, + locked_by :: Data.Text.Text, + acquired_at :: Data.Time.UTCTime, + expires_at :: Data.Time.UTCTime +} deriving ( + GHC.Show.Show, + Data.Eq.Eq, + GHC.Generics.Generic + ) + +instance Data.Aeson.ToJSON WorkspaceLock where + toJSON a = Data.Aeson.object [ + "lock_id" Data.Aeson..= lock_id a, + "operation" Data.Aeson..= operation a, + "locked_by" Data.Aeson..= locked_by a, + "acquired_at" Data.Aeson..= acquired_at a, + "expires_at" Data.Aeson..= expires_at a + ] + + +instance Io.Superposition.Utility.SerializeBody WorkspaceLock + +instance Data.Aeson.FromJSON WorkspaceLock where + parseJSON = Data.Aeson.withObject "WorkspaceLock" $ \v -> WorkspaceLock + Data.Functor.<$> (v Data.Aeson..: "lock_id") + Control.Applicative.<*> (v Data.Aeson..: "operation") + Control.Applicative.<*> (v Data.Aeson..: "locked_by") + Control.Applicative.<*> (v Data.Aeson..: "acquired_at") + Control.Applicative.<*> (v Data.Aeson..: "expires_at") + + + + +data WorkspaceLockBuilderState = WorkspaceLockBuilderState { + lock_idBuilderState :: Data.Maybe.Maybe Data.Text.Text, + operationBuilderState :: Data.Maybe.Maybe Data.Text.Text, + locked_byBuilderState :: Data.Maybe.Maybe Data.Text.Text, + acquired_atBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime, + expires_atBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime +} deriving ( + GHC.Generics.Generic + ) + +defaultBuilderState :: WorkspaceLockBuilderState +defaultBuilderState = WorkspaceLockBuilderState { + lock_idBuilderState = Data.Maybe.Nothing, + operationBuilderState = Data.Maybe.Nothing, + locked_byBuilderState = Data.Maybe.Nothing, + acquired_atBuilderState = Data.Maybe.Nothing, + expires_atBuilderState = Data.Maybe.Nothing +} + +type WorkspaceLockBuilder = Control.Monad.State.Strict.State WorkspaceLockBuilderState + +setLockId :: Data.Text.Text -> WorkspaceLockBuilder () +setLockId value = + Control.Monad.State.Strict.modify (\s -> (s { lock_idBuilderState = Data.Maybe.Just value })) + +setOperation :: Data.Text.Text -> WorkspaceLockBuilder () +setOperation value = + Control.Monad.State.Strict.modify (\s -> (s { operationBuilderState = Data.Maybe.Just value })) + +setLockedBy :: Data.Text.Text -> WorkspaceLockBuilder () +setLockedBy value = + Control.Monad.State.Strict.modify (\s -> (s { locked_byBuilderState = Data.Maybe.Just value })) + +setAcquiredAt :: Data.Time.UTCTime -> WorkspaceLockBuilder () +setAcquiredAt value = + Control.Monad.State.Strict.modify (\s -> (s { acquired_atBuilderState = Data.Maybe.Just value })) + +setExpiresAt :: Data.Time.UTCTime -> WorkspaceLockBuilder () +setExpiresAt value = + Control.Monad.State.Strict.modify (\s -> (s { expires_atBuilderState = Data.Maybe.Just value })) + +build :: WorkspaceLockBuilder () -> Data.Either.Either Data.Text.Text WorkspaceLock +build builder = do + let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState + lock_id' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.WorkspaceLock.WorkspaceLock.lock_id is a required property.") Data.Either.Right (lock_idBuilderState st) + operation' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.WorkspaceLock.WorkspaceLock.operation is a required property.") Data.Either.Right (operationBuilderState st) + locked_by' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.WorkspaceLock.WorkspaceLock.locked_by is a required property.") Data.Either.Right (locked_byBuilderState st) + acquired_at' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.WorkspaceLock.WorkspaceLock.acquired_at is a required property.") Data.Either.Right (acquired_atBuilderState st) + expires_at' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.WorkspaceLock.WorkspaceLock.expires_at is a required property.") Data.Either.Right (expires_atBuilderState st) + Data.Either.Right (WorkspaceLock { + lock_id = lock_id', + operation = operation', + locked_by = locked_by', + acquired_at = acquired_at', + expires_at = expires_at' + }) + + diff --git a/clients/haskell/sdk/Io/Superposition/Model/WorkspaceLockConflict.hs b/clients/haskell/sdk/Io/Superposition/Model/WorkspaceLockConflict.hs new file mode 100644 index 000000000..48c966fd8 --- /dev/null +++ b/clients/haskell/sdk/Io/Superposition/Model/WorkspaceLockConflict.hs @@ -0,0 +1,94 @@ +module Io.Superposition.Model.WorkspaceLockConflict ( + setMessage, + setLock, + build, + WorkspaceLockConflictBuilder, + WorkspaceLockConflict, + message, + lock +) where +import qualified Control.Applicative +import qualified Control.Monad.State.Strict +import qualified Data.Aeson +import qualified Data.Either +import qualified Data.Eq +import qualified Data.Functor +import qualified Data.Maybe +import qualified Data.Text +import qualified GHC.Generics +import qualified GHC.Show +import qualified Io.Superposition.Model.WorkspaceLock +import qualified Io.Superposition.Utility +import qualified Network.HTTP.Types + +data WorkspaceLockConflict = WorkspaceLockConflict { + message :: Data.Text.Text, + lock :: Io.Superposition.Model.WorkspaceLock.WorkspaceLock +} deriving ( + GHC.Show.Show, + Data.Eq.Eq, + GHC.Generics.Generic + ) + +instance Data.Aeson.ToJSON WorkspaceLockConflict where + toJSON a = Data.Aeson.object [ + "message" Data.Aeson..= message a, + "lock" Data.Aeson..= lock a + ] + + +instance Io.Superposition.Utility.SerializeBody WorkspaceLockConflict + +instance Data.Aeson.FromJSON WorkspaceLockConflict where + parseJSON = Data.Aeson.withObject "WorkspaceLockConflict" $ \v -> WorkspaceLockConflict + Data.Functor.<$> (v Data.Aeson..: "message") + Control.Applicative.<*> (v Data.Aeson..: "lock") + + + + +data WorkspaceLockConflictBuilderState = WorkspaceLockConflictBuilderState { + messageBuilderState :: Data.Maybe.Maybe Data.Text.Text, + lockBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock +} deriving ( + GHC.Generics.Generic + ) + +defaultBuilderState :: WorkspaceLockConflictBuilderState +defaultBuilderState = WorkspaceLockConflictBuilderState { + messageBuilderState = Data.Maybe.Nothing, + lockBuilderState = Data.Maybe.Nothing +} + +type WorkspaceLockConflictBuilder = Control.Monad.State.Strict.State WorkspaceLockConflictBuilderState + +setMessage :: Data.Text.Text -> WorkspaceLockConflictBuilder () +setMessage value = + Control.Monad.State.Strict.modify (\s -> (s { messageBuilderState = Data.Maybe.Just value })) + +setLock :: Io.Superposition.Model.WorkspaceLock.WorkspaceLock -> WorkspaceLockConflictBuilder () +setLock value = + Control.Monad.State.Strict.modify (\s -> (s { lockBuilderState = Data.Maybe.Just value })) + +build :: WorkspaceLockConflictBuilder () -> Data.Either.Either Data.Text.Text WorkspaceLockConflict +build builder = do + let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState + message' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.WorkspaceLockConflict.WorkspaceLockConflict.message is a required property.") Data.Either.Right (messageBuilderState st) + lock' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.WorkspaceLockConflict.WorkspaceLockConflict.lock is a required property.") Data.Either.Right (lockBuilderState st) + Data.Either.Right (WorkspaceLockConflict { + message = message', + lock = lock' + }) + + +instance Io.Superposition.Utility.FromResponseParser WorkspaceLockConflict where + expectedStatus = (Network.HTTP.Types.mkStatus 409 "") + responseParser = do + + var0 <- Io.Superposition.Utility.deSerField "lock" + var1 <- Io.Superposition.Utility.deSerField "message" + pure $ WorkspaceLockConflict { + message = var1, + lock = var0 + } + diff --git a/clients/haskell/sdk/Io/Superposition/Model/WorkspaceResponse.hs b/clients/haskell/sdk/Io/Superposition/Model/WorkspaceResponse.hs index 75925aa02..04d747310 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, + setWorkspaceLock, 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, + workspace_lock ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -48,6 +50,7 @@ import qualified Data.Text import qualified Data.Time import qualified GHC.Generics import qualified GHC.Show +import qualified Io.Superposition.Model.WorkspaceLock import qualified Io.Superposition.Model.WorkspaceStatus import qualified Io.Superposition.Utility @@ -68,7 +71,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, + workspace_lock :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -93,7 +97,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, + "workspace_lock" Data.Aeson..= workspace_lock a ] @@ -118,6 +123,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..:? "workspace_lock") @@ -139,7 +145,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, + workspace_lockBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock } deriving ( GHC.Generics.Generic ) @@ -162,7 +169,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, + workspace_lockBuilderState = Data.Maybe.Nothing } type WorkspaceResponseBuilder = Control.Monad.State.Strict.State WorkspaceResponseBuilderState @@ -235,6 +243,10 @@ setEnableChangeReasonValidation :: Bool -> WorkspaceResponseBuilder () setEnableChangeReasonValidation value = Control.Monad.State.Strict.modify (\s -> (s { enable_change_reason_validationBuilderState = Data.Maybe.Just value })) +setWorkspaceLock :: Data.Maybe.Maybe Io.Superposition.Model.WorkspaceLock.WorkspaceLock -> WorkspaceResponseBuilder () +setWorkspaceLock value = + Control.Monad.State.Strict.modify (\s -> (s { workspace_lockBuilderState = value })) + build :: WorkspaceResponseBuilder () -> Data.Either.Either Data.Text.Text WorkspaceResponse build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -255,6 +267,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) + workspace_lock' <- Data.Either.Right (workspace_lockBuilderState st) Data.Either.Right (WorkspaceResponse { workspace_name = workspace_name', organisation_id = organisation_id', @@ -272,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', + workspace_lock = workspace_lock' }) diff --git a/clients/haskell/sdk/SuperpositionSDK.cabal b/clients/haskell/sdk/SuperpositionSDK.cabal index 7489f8004..159c61bba 100644 --- a/clients/haskell/sdk/SuperpositionSDK.cabal +++ b/clients/haskell/sdk/SuperpositionSDK.cabal @@ -30,6 +30,7 @@ library Io.Superposition.Model.GetSecretInput, Io.Superposition.Command.DeleteDefaultConfig, Io.Superposition.Model.MigrateWorkspaceSchemaInput, + Io.Superposition.Model.WorkspaceLock, Io.Superposition.Model.ListWebhookInput, Io.Superposition.Model.HttpMethod, Io.Superposition.Model.ContextAction, @@ -207,6 +208,7 @@ library Io.Superposition.Command.UpdateWebhook, Io.Superposition.SuperpositionClient, Io.Superposition.Model.UpdateContextOverrideRequest, + Io.Superposition.Model.WorkspaceLockConflict, Io.Superposition.Model.TestOutput, Io.Superposition.Model.DeleteTypeTemplatesOutput, Io.Superposition.Model.Variant, 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 22959bdb6..762fec9a9 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 @@ -174,6 +174,7 @@ import io.juspay.superposition.model.WebhookFailed; import io.juspay.superposition.model.WeightRecomputeInput; import io.juspay.superposition.model.WeightRecomputeOutput; +import io.juspay.superposition.model.WorkspaceLockConflict; import java.util.concurrent.CompletableFuture; import software.amazon.smithy.aws.traits.protocols.RestJson1Trait; import software.amazon.smithy.java.aws.client.restjson.RestJsonClientProtocol; @@ -300,6 +301,7 @@ default CompletableFuture createContext(CreateContextInput * serve as fallback values when no specific context matches. * * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ default CompletableFuture createDefaultConfig(CreateDefaultConfigInput input) { @@ -311,6 +313,7 @@ default CompletableFuture createDefaultConfig(CreateD * serve as fallback values when no specific context matches. * * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ CompletableFuture createDefaultConfig(CreateDefaultConfigInput input, RequestOverrideConfig overrideConfig); @@ -523,6 +526,7 @@ default CompletableFuture deleteContext(DeleteContextInput * * @throws ResourceNotFound * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ default CompletableFuture deleteDefaultConfig(DeleteDefaultConfigInput input) { @@ -535,6 +539,7 @@ default CompletableFuture deleteDefaultConfig(DeleteD * * @throws ResourceNotFound * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ CompletableFuture deleteDefaultConfig(DeleteDefaultConfigInput input, RequestOverrideConfig overrideConfig); @@ -1551,6 +1556,7 @@ default CompletableFuture test(TestInput input) { * * @throws ResourceNotFound * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ default CompletableFuture updateDefaultConfig(UpdateDefaultConfigInput input) { @@ -1563,6 +1569,7 @@ default CompletableFuture updateDefaultConfig(UpdateD * * @throws ResourceNotFound * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ CompletableFuture updateDefaultConfig(UpdateDefaultConfigInput input, RequestOverrideConfig overrideConfig); @@ -1858,12 +1865,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - 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 static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); + private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.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 62a24718c..79b07bff2 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 @@ -272,9 +272,9 @@ @SmithyGenerated final class SuperpositionAsyncClientImpl extends Client implements SuperpositionAsyncClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() - .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) + .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::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 fce19e121..fd5dbe4ab 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 @@ -174,6 +174,7 @@ import io.juspay.superposition.model.WebhookFailed; import io.juspay.superposition.model.WeightRecomputeInput; import io.juspay.superposition.model.WeightRecomputeOutput; +import io.juspay.superposition.model.WorkspaceLockConflict; import software.amazon.smithy.aws.traits.protocols.RestJson1Trait; import software.amazon.smithy.java.aws.client.restjson.RestJsonClientProtocol; import software.amazon.smithy.java.client.core.Client; @@ -299,6 +300,7 @@ default CreateContextOutput createContext(CreateContextInput input) { * serve as fallback values when no specific context matches. * * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ default CreateDefaultConfigOutput createDefaultConfig(CreateDefaultConfigInput input) { @@ -310,6 +312,7 @@ default CreateDefaultConfigOutput createDefaultConfig(CreateDefaultConfigInput i * serve as fallback values when no specific context matches. * * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ CreateDefaultConfigOutput createDefaultConfig(CreateDefaultConfigInput input, RequestOverrideConfig overrideConfig); @@ -522,6 +525,7 @@ default DeleteContextOutput deleteContext(DeleteContextInput input) { * * @throws ResourceNotFound * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ default DeleteDefaultConfigOutput deleteDefaultConfig(DeleteDefaultConfigInput input) { @@ -534,6 +538,7 @@ default DeleteDefaultConfigOutput deleteDefaultConfig(DeleteDefaultConfigInput i * * @throws ResourceNotFound * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ DeleteDefaultConfigOutput deleteDefaultConfig(DeleteDefaultConfigInput input, RequestOverrideConfig overrideConfig); @@ -1550,6 +1555,7 @@ default TestOutput test(TestInput input) { * * @throws ResourceNotFound * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ default UpdateDefaultConfigOutput updateDefaultConfig(UpdateDefaultConfigInput input) { @@ -1562,6 +1568,7 @@ default UpdateDefaultConfigOutput updateDefaultConfig(UpdateDefaultConfigInput i * * @throws ResourceNotFound * @throws WebhookFailed + * @throws WorkspaceLockConflict * @throws InternalServerError */ UpdateDefaultConfigOutput updateDefaultConfig(UpdateDefaultConfigInput input, RequestOverrideConfig overrideConfig); @@ -1857,12 +1864,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - 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 static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); + private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.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 3adc49d36..a5c489143 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 @@ -272,9 +272,9 @@ @SmithyGenerated final class SuperpositionClientImpl extends Client implements SuperpositionClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() - .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) + .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::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/CreateDefaultConfig.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/CreateDefaultConfig.java index a6c32fccc..21c80a915 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/CreateDefaultConfig.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/CreateDefaultConfig.java @@ -28,6 +28,7 @@ public final class CreateDefaultConfig implements ApiOperation SCHEMES = List.of(ShapeId.from("smithy.api#httpBasicAuth"), ShapeId.from("smithy.api#httpBearerAuth")); 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..967a54e0a 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,7 @@ public final class CreateWorkspaceOutput implements SerializableStruct { new RequiredTrait()) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN, new RequiredTrait()) + .putMember("workspace_lock", WorkspaceLock.$SCHEMA) .build(); private static final Schema $SCHEMA_WORKSPACE_NAME = $SCHEMA.member("workspace_name"); @@ -75,6 +76,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_WORKSPACE_LOCK = $SCHEMA.member("workspace_lock"); private final transient String workspaceName; private final transient String organisationId; @@ -93,6 +95,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 WorkspaceLock workspaceLock; private CreateWorkspaceOutput(Builder builder) { this.workspaceName = builder.workspaceName; @@ -112,6 +115,7 @@ private CreateWorkspaceOutput(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.workspaceLock = builder.workspaceLock; } public String workspaceName() { @@ -189,6 +193,10 @@ public boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public WorkspaceLock workspaceLock() { + return workspaceLock; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -219,12 +227,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.workspaceLock, that.workspaceLock); } @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, workspaceLock); } @Override @@ -255,6 +264,9 @@ 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); + if (workspaceLock != null) { + serializer.writeStruct($SCHEMA_WORKSPACE_LOCK, workspaceLock); + } } @Override @@ -278,6 +290,7 @@ public T getMemberValue(Schema member) { 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 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_LOCK, member, workspaceLock); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -308,6 +321,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.workspaceLock(this.workspaceLock); return builder; } @@ -340,6 +354,7 @@ public static final class Builder implements ShapeBuilder private boolean autoPopulateControl; private boolean enableContextValidation; private boolean enableChangeReasonValidation; + private WorkspaceLock workspaceLock; private Builder() {} @@ -514,6 +529,14 @@ public Builder enableChangeReasonValidation(boolean enableChangeReasonValidation return this; } + /** + * @return this builder. + */ + public Builder workspaceLock(WorkspaceLock workspaceLock) { + this.workspaceLock = workspaceLock; + return this; + } + @Override public CreateWorkspaceOutput build() { tracker.validate(); @@ -541,6 +564,7 @@ public void setMemberValue(Schema member, Object 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 17 -> workspaceLock((WorkspaceLock) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_LOCK, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -633,6 +657,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 14 -> builder.enableChangeReasonValidation(de.readBoolean(member)); case 15 -> builder.configVersion(de.readString(member)); case 16 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); + case 17 -> builder.workspaceLock(WorkspaceLock.builder().deserializeMember(de, member).build()); default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/DeleteDefaultConfig.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/DeleteDefaultConfig.java index 6de581b68..63d2548c0 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/DeleteDefaultConfig.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/DeleteDefaultConfig.java @@ -29,6 +29,7 @@ public final class DeleteDefaultConfig implements ApiOperation SCHEMES = List.of(ShapeId.from("smithy.api#httpBasicAuth"), ShapeId.from("smithy.api#httpBearerAuth")); 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..8ead66205 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,7 @@ public final class GetWorkspaceOutput implements SerializableStruct { new RequiredTrait()) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN, new RequiredTrait()) + .putMember("workspace_lock", WorkspaceLock.$SCHEMA) .build(); private static final Schema $SCHEMA_WORKSPACE_NAME = $SCHEMA.member("workspace_name"); @@ -75,6 +76,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_WORKSPACE_LOCK = $SCHEMA.member("workspace_lock"); private final transient String workspaceName; private final transient String organisationId; @@ -93,6 +95,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 WorkspaceLock workspaceLock; private GetWorkspaceOutput(Builder builder) { this.workspaceName = builder.workspaceName; @@ -112,6 +115,7 @@ private GetWorkspaceOutput(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.workspaceLock = builder.workspaceLock; } public String workspaceName() { @@ -189,6 +193,10 @@ public boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public WorkspaceLock workspaceLock() { + return workspaceLock; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -219,12 +227,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.workspaceLock, that.workspaceLock); } @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, workspaceLock); } @Override @@ -255,6 +264,9 @@ 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); + if (workspaceLock != null) { + serializer.writeStruct($SCHEMA_WORKSPACE_LOCK, workspaceLock); + } } @Override @@ -278,6 +290,7 @@ public T getMemberValue(Schema member) { 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 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_LOCK, member, workspaceLock); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -308,6 +321,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.workspaceLock(this.workspaceLock); return builder; } @@ -340,6 +354,7 @@ public static final class Builder implements ShapeBuilder { private boolean autoPopulateControl; private boolean enableContextValidation; private boolean enableChangeReasonValidation; + private WorkspaceLock workspaceLock; private Builder() {} @@ -514,6 +529,14 @@ public Builder enableChangeReasonValidation(boolean enableChangeReasonValidation return this; } + /** + * @return this builder. + */ + public Builder workspaceLock(WorkspaceLock workspaceLock) { + this.workspaceLock = workspaceLock; + return this; + } + @Override public GetWorkspaceOutput build() { tracker.validate(); @@ -541,6 +564,7 @@ public void setMemberValue(Schema member, Object 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 17 -> workspaceLock((WorkspaceLock) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_LOCK, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -633,6 +657,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 14 -> builder.enableChangeReasonValidation(de.readBoolean(member)); case 15 -> builder.configVersion(de.readString(member)); case 16 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); + case 17 -> builder.workspaceLock(WorkspaceLock.builder().deserializeMember(de, member).build()); 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..0972c4733 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,7 @@ public final class MigrateWorkspaceSchemaOutput implements SerializableStruct { new RequiredTrait()) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN, new RequiredTrait()) + .putMember("workspace_lock", WorkspaceLock.$SCHEMA) .build(); private static final Schema $SCHEMA_WORKSPACE_NAME = $SCHEMA.member("workspace_name"); @@ -75,6 +76,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_WORKSPACE_LOCK = $SCHEMA.member("workspace_lock"); private final transient String workspaceName; private final transient String organisationId; @@ -93,6 +95,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 WorkspaceLock workspaceLock; private MigrateWorkspaceSchemaOutput(Builder builder) { this.workspaceName = builder.workspaceName; @@ -112,6 +115,7 @@ private MigrateWorkspaceSchemaOutput(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.workspaceLock = builder.workspaceLock; } public String workspaceName() { @@ -189,6 +193,10 @@ public boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public WorkspaceLock workspaceLock() { + return workspaceLock; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -219,12 +227,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.workspaceLock, that.workspaceLock); } @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, workspaceLock); } @Override @@ -255,6 +264,9 @@ 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); + if (workspaceLock != null) { + serializer.writeStruct($SCHEMA_WORKSPACE_LOCK, workspaceLock); + } } @Override @@ -278,6 +290,7 @@ public T getMemberValue(Schema member) { 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 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_LOCK, member, workspaceLock); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -308,6 +321,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.workspaceLock(this.workspaceLock); return builder; } @@ -340,6 +354,7 @@ public static final class Builder implements ShapeBuilder 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 17 -> workspaceLock((WorkspaceLock) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_LOCK, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -633,6 +657,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 14 -> builder.enableChangeReasonValidation(de.readBoolean(member)); case 15 -> builder.configVersion(de.readString(member)); case 16 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); + case 17 -> builder.workspaceLock(WorkspaceLock.builder().deserializeMember(de, member).build()); default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateDefaultConfig.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateDefaultConfig.java index 935e0e099..fec94ab01 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateDefaultConfig.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/UpdateDefaultConfig.java @@ -29,6 +29,7 @@ public final class UpdateDefaultConfig implements ApiOperation SCHEMES = List.of(ShapeId.from("smithy.api#httpBasicAuth"), ShapeId.from("smithy.api#httpBearerAuth")); 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..54f6d7ea7 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,7 @@ public final class UpdateWorkspaceOutput implements SerializableStruct { new RequiredTrait()) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN, new RequiredTrait()) + .putMember("workspace_lock", WorkspaceLock.$SCHEMA) .build(); private static final Schema $SCHEMA_WORKSPACE_NAME = $SCHEMA.member("workspace_name"); @@ -75,6 +76,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_WORKSPACE_LOCK = $SCHEMA.member("workspace_lock"); private final transient String workspaceName; private final transient String organisationId; @@ -93,6 +95,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 WorkspaceLock workspaceLock; private UpdateWorkspaceOutput(Builder builder) { this.workspaceName = builder.workspaceName; @@ -112,6 +115,7 @@ private UpdateWorkspaceOutput(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.workspaceLock = builder.workspaceLock; } public String workspaceName() { @@ -189,6 +193,10 @@ public boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public WorkspaceLock workspaceLock() { + return workspaceLock; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -219,12 +227,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.workspaceLock, that.workspaceLock); } @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, workspaceLock); } @Override @@ -255,6 +264,9 @@ 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); + if (workspaceLock != null) { + serializer.writeStruct($SCHEMA_WORKSPACE_LOCK, workspaceLock); + } } @Override @@ -278,6 +290,7 @@ public T getMemberValue(Schema member) { 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 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_LOCK, member, workspaceLock); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -308,6 +321,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.workspaceLock(this.workspaceLock); return builder; } @@ -340,6 +354,7 @@ public static final class Builder implements ShapeBuilder private boolean autoPopulateControl; private boolean enableContextValidation; private boolean enableChangeReasonValidation; + private WorkspaceLock workspaceLock; private Builder() {} @@ -514,6 +529,14 @@ public Builder enableChangeReasonValidation(boolean enableChangeReasonValidation return this; } + /** + * @return this builder. + */ + public Builder workspaceLock(WorkspaceLock workspaceLock) { + this.workspaceLock = workspaceLock; + return this; + } + @Override public UpdateWorkspaceOutput build() { tracker.validate(); @@ -541,6 +564,7 @@ public void setMemberValue(Schema member, Object 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 17 -> workspaceLock((WorkspaceLock) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_LOCK, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -633,6 +657,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 14 -> builder.enableChangeReasonValidation(de.readBoolean(member)); case 15 -> builder.configVersion(de.readString(member)); case 16 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); + case 17 -> builder.workspaceLock(WorkspaceLock.builder().deserializeMember(de, member).build()); 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..0d74c3502 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 @@ -31,7 +31,8 @@ public final class Workspace implements ApiResource { Map.entry("organisation_id", PreludeSchemas.STRING), Map.entry("allow_experiment_self_approval", PreludeSchemas.BOOLEAN), Map.entry("workspace_schema_name", PreludeSchemas.STRING), - Map.entry("metrics", PreludeSchemas.DOCUMENT)); + Map.entry("metrics", PreludeSchemas.DOCUMENT), + Map.entry("workspace_lock", WorkspaceLock.$SCHEMA)); private static final List $OPERATIONS = List.of(CreateWorkspace.$SCHEMA, MigrateWorkspaceSchema.$SCHEMA, diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/WorkspaceLock.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/WorkspaceLock.java new file mode 100644 index 000000000..12050bee4 --- /dev/null +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/WorkspaceLock.java @@ -0,0 +1,321 @@ + +package io.juspay.superposition.model; + +import java.time.Instant; +import java.util.Objects; +import software.amazon.smithy.java.core.schema.PreludeSchemas; +import software.amazon.smithy.java.core.schema.PresenceTracker; +import software.amazon.smithy.java.core.schema.Schema; +import software.amazon.smithy.java.core.schema.SchemaUtils; +import software.amazon.smithy.java.core.schema.SerializableStruct; +import software.amazon.smithy.java.core.schema.ShapeBuilder; +import software.amazon.smithy.java.core.serde.ShapeDeserializer; +import software.amazon.smithy.java.core.serde.ShapeSerializer; +import software.amazon.smithy.java.core.serde.ToStringSerializer; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.traits.RequiredTrait; +import software.amazon.smithy.utils.SmithyGenerated; + +/** + * Metadata for an active workspace write lock. Present only while another write operation is holding + * the workspace lease. + */ +@SmithyGenerated +public final class WorkspaceLock implements SerializableStruct { + public static final ShapeId $ID = ShapeId.from("io.superposition#WorkspaceLock"); + + public static final Schema $SCHEMA = Schema.structureBuilder($ID) + .putMember("lock_id", PreludeSchemas.STRING, + new RequiredTrait()) + .putMember("operation", PreludeSchemas.STRING, + new RequiredTrait()) + .putMember("locked_by", PreludeSchemas.STRING, + new RequiredTrait()) + .putMember("acquired_at", SharedSchemas.DATE_TIME, + new RequiredTrait()) + .putMember("expires_at", SharedSchemas.DATE_TIME, + new RequiredTrait()) + .build(); + + private static final Schema $SCHEMA_LOCK_ID = $SCHEMA.member("lock_id"); + private static final Schema $SCHEMA_OPERATION = $SCHEMA.member("operation"); + private static final Schema $SCHEMA_LOCKED_BY = $SCHEMA.member("locked_by"); + private static final Schema $SCHEMA_ACQUIRED_AT = $SCHEMA.member("acquired_at"); + private static final Schema $SCHEMA_EXPIRES_AT = $SCHEMA.member("expires_at"); + + private final transient String lockId; + private final transient String operation; + private final transient String lockedBy; + private final transient Instant acquiredAt; + private final transient Instant expiresAt; + + private WorkspaceLock(Builder builder) { + this.lockId = builder.lockId; + this.operation = builder.operation; + this.lockedBy = builder.lockedBy; + this.acquiredAt = builder.acquiredAt; + this.expiresAt = builder.expiresAt; + } + + /** + * Unique identifier for the active workspace lock. + */ + public String lockId() { + return lockId; + } + + /** + * Write operation that currently holds the workspace lock. + */ + public String operation() { + return operation; + } + + /** + * User that acquired the workspace lock. + */ + public String lockedBy() { + return lockedBy; + } + + /** + * Timestamp at which the workspace lock was acquired. + */ + public Instant acquiredAt() { + return acquiredAt; + } + + /** + * Timestamp at which the workspace lock expires if it is not released first. + */ + public Instant expiresAt() { + return expiresAt; + } + + @Override + public String toString() { + return ToStringSerializer.serialize(this); + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if (other == null || getClass() != other.getClass()) { + return false; + } + WorkspaceLock that = (WorkspaceLock) other; + return Objects.equals(this.lockId, that.lockId) + && Objects.equals(this.operation, that.operation) + && Objects.equals(this.lockedBy, that.lockedBy) + && Objects.equals(this.acquiredAt, that.acquiredAt) + && Objects.equals(this.expiresAt, that.expiresAt); + } + + @Override + public int hashCode() { + return Objects.hash(lockId, operation, lockedBy, acquiredAt, expiresAt); + } + + @Override + public Schema schema() { + return $SCHEMA; + } + + @Override + public void serializeMembers(ShapeSerializer serializer) { + serializer.writeString($SCHEMA_LOCK_ID, lockId); + serializer.writeString($SCHEMA_OPERATION, operation); + serializer.writeString($SCHEMA_LOCKED_BY, lockedBy); + serializer.writeTimestamp($SCHEMA_ACQUIRED_AT, acquiredAt); + serializer.writeTimestamp($SCHEMA_EXPIRES_AT, expiresAt); + } + + @Override + @SuppressWarnings("unchecked") + public T getMemberValue(Schema member) { + return switch (member.memberIndex()) { + case 0 -> (T) SchemaUtils.validateSameMember($SCHEMA_LOCK_ID, member, lockId); + case 1 -> (T) SchemaUtils.validateSameMember($SCHEMA_OPERATION, member, operation); + case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_LOCKED_BY, member, lockedBy); + case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_ACQUIRED_AT, member, acquiredAt); + case 4 -> (T) SchemaUtils.validateSameMember($SCHEMA_EXPIRES_AT, member, expiresAt); + default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); + }; + } + + /** + * Create a new builder containing all the current property values of this object. + * + *

Note: This method performs only a shallow copy of the original properties. + * + * @return a builder for {@link WorkspaceLock}. + */ + public Builder toBuilder() { + var builder = new Builder(); + builder.lockId(this.lockId); + builder.operation(this.operation); + builder.lockedBy(this.lockedBy); + builder.acquiredAt(this.acquiredAt); + builder.expiresAt(this.expiresAt); + return builder; + } + + /** + * @return returns a new Builder. + */ + public static Builder builder() { + return new Builder(); + } + + /** + * Builder for {@link WorkspaceLock}. + */ + public static final class Builder implements ShapeBuilder { + private final PresenceTracker tracker = PresenceTracker.of($SCHEMA); + private String lockId; + private String operation; + private String lockedBy; + private Instant acquiredAt; + private Instant expiresAt; + + private Builder() {} + + @Override + public Schema schema() { + return $SCHEMA; + } + + /** + * Unique identifier for the active workspace lock. + * + *

Required + * @return this builder. + */ + public Builder lockId(String lockId) { + this.lockId = Objects.requireNonNull(lockId, "lockId cannot be null"); + tracker.setMember($SCHEMA_LOCK_ID); + return this; + } + + /** + * Write operation that currently holds the workspace lock. + * + *

Required + * @return this builder. + */ + public Builder operation(String operation) { + this.operation = Objects.requireNonNull(operation, "operation cannot be null"); + tracker.setMember($SCHEMA_OPERATION); + return this; + } + + /** + * User that acquired the workspace lock. + * + *

Required + * @return this builder. + */ + public Builder lockedBy(String lockedBy) { + this.lockedBy = Objects.requireNonNull(lockedBy, "lockedBy cannot be null"); + tracker.setMember($SCHEMA_LOCKED_BY); + return this; + } + + /** + * Timestamp at which the workspace lock was acquired. + * + *

Required + * @return this builder. + */ + public Builder acquiredAt(Instant acquiredAt) { + this.acquiredAt = Objects.requireNonNull(acquiredAt, "acquiredAt cannot be null"); + tracker.setMember($SCHEMA_ACQUIRED_AT); + return this; + } + + /** + * Timestamp at which the workspace lock expires if it is not released first. + * + *

Required + * @return this builder. + */ + public Builder expiresAt(Instant expiresAt) { + this.expiresAt = Objects.requireNonNull(expiresAt, "expiresAt cannot be null"); + tracker.setMember($SCHEMA_EXPIRES_AT); + return this; + } + + @Override + public WorkspaceLock build() { + tracker.validate(); + return new WorkspaceLock(this); + } + + @Override + @SuppressWarnings("unchecked") + public void setMemberValue(Schema member, Object value) { + switch (member.memberIndex()) { + case 0 -> lockId((String) SchemaUtils.validateSameMember($SCHEMA_LOCK_ID, member, value)); + case 1 -> operation((String) SchemaUtils.validateSameMember($SCHEMA_OPERATION, member, value)); + case 2 -> lockedBy((String) SchemaUtils.validateSameMember($SCHEMA_LOCKED_BY, member, value)); + case 3 -> acquiredAt((Instant) SchemaUtils.validateSameMember($SCHEMA_ACQUIRED_AT, member, value)); + case 4 -> expiresAt((Instant) SchemaUtils.validateSameMember($SCHEMA_EXPIRES_AT, member, value)); + default -> ShapeBuilder.super.setMemberValue(member, value); + } + } + + @Override + public ShapeBuilder errorCorrection() { + if (tracker.allSet()) { + return this; + } + if (!tracker.checkMember($SCHEMA_LOCK_ID)) { + lockId(""); + } + if (!tracker.checkMember($SCHEMA_OPERATION)) { + operation(""); + } + if (!tracker.checkMember($SCHEMA_LOCKED_BY)) { + lockedBy(""); + } + if (!tracker.checkMember($SCHEMA_ACQUIRED_AT)) { + acquiredAt(Instant.EPOCH); + } + if (!tracker.checkMember($SCHEMA_EXPIRES_AT)) { + expiresAt(Instant.EPOCH); + } + return this; + } + + @Override + public Builder deserialize(ShapeDeserializer decoder) { + decoder.readStruct($SCHEMA, this, $InnerDeserializer.INSTANCE); + return this; + } + + @Override + public Builder deserializeMember(ShapeDeserializer decoder, Schema schema) { + decoder.readStruct(schema.assertMemberTargetIs($SCHEMA), this, $InnerDeserializer.INSTANCE); + return this; + } + + private static final class $InnerDeserializer implements ShapeDeserializer.StructMemberConsumer { + private static final $InnerDeserializer INSTANCE = new $InnerDeserializer(); + + @Override + public void accept(Builder builder, Schema member, ShapeDeserializer de) { + switch (member.memberIndex()) { + case 0 -> builder.lockId(de.readString(member)); + case 1 -> builder.operation(de.readString(member)); + case 2 -> builder.lockedBy(de.readString(member)); + case 3 -> builder.acquiredAt(de.readTimestamp(member)); + case 4 -> builder.expiresAt(de.readTimestamp(member)); + default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); + } + } + } + } +} + diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/WorkspaceLockConflict.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/WorkspaceLockConflict.java new file mode 100644 index 000000000..6856ec888 --- /dev/null +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/WorkspaceLockConflict.java @@ -0,0 +1,205 @@ + +package io.juspay.superposition.model; + +import java.util.Objects; +import software.amazon.smithy.java.core.error.ModeledException; +import software.amazon.smithy.java.core.schema.PreludeSchemas; +import software.amazon.smithy.java.core.schema.PresenceTracker; +import software.amazon.smithy.java.core.schema.Schema; +import software.amazon.smithy.java.core.schema.SchemaUtils; +import software.amazon.smithy.java.core.schema.ShapeBuilder; +import software.amazon.smithy.java.core.serde.ShapeDeserializer; +import software.amazon.smithy.java.core.serde.ShapeSerializer; +import software.amazon.smithy.java.core.serde.ToStringSerializer; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.traits.ErrorTrait; +import software.amazon.smithy.model.traits.HttpErrorTrait; +import software.amazon.smithy.model.traits.RequiredTrait; +import software.amazon.smithy.utils.SmithyGenerated; + +/** + * Returned when a workspace write operation cannot proceed because another write operation currently + * holds the workspace lock. + */ +@SmithyGenerated +public final class WorkspaceLockConflict extends ModeledException { + public static final ShapeId $ID = ShapeId.from("io.superposition#WorkspaceLockConflict"); + + public static final Schema $SCHEMA = Schema.structureBuilder($ID, + new ErrorTrait("client"), + new HttpErrorTrait(409)) + .putMember("message", PreludeSchemas.STRING, + new RequiredTrait()) + .putMember("lock", WorkspaceLock.$SCHEMA, + new RequiredTrait()) + .build(); + + private static final Schema $SCHEMA_MESSAGE = $SCHEMA.member("message"); + private static final Schema $SCHEMA_LOCK = $SCHEMA.member("lock"); + + private final transient WorkspaceLock lock; + + private WorkspaceLockConflict(Builder builder) { + super($SCHEMA, builder.message, builder.$cause, builder.$captureStackTrace, builder.$deserialized); + this.lock = builder.lock; + } + + public WorkspaceLock lock() { + return lock; + } + + @Override + public String toString() { + return ToStringSerializer.serialize(this); + } + + @Override + public void serializeMembers(ShapeSerializer serializer) { + serializer.writeString($SCHEMA_MESSAGE, getMessage()); + if (lock != null) { + serializer.writeStruct($SCHEMA_LOCK, lock); + } + } + + @Override + @SuppressWarnings("unchecked") + public T getMemberValue(Schema member) { + return switch (member.memberIndex()) { + case 0 -> (T) SchemaUtils.validateSameMember($SCHEMA_MESSAGE, member, getMessage()); + case 1 -> (T) SchemaUtils.validateSameMember($SCHEMA_LOCK, member, lock); + default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); + }; + } + + /** + * Create a new builder containing all the current property values of this object. + * + *

Note: This method performs only a shallow copy of the original properties. + * + * @return a builder for {@link WorkspaceLockConflict}. + */ + public Builder toBuilder() { + var builder = new Builder(); + builder.message(getMessage()); + builder.lock(this.lock); + return builder; + } + + /** + * @return returns a new Builder. + */ + public static Builder builder() { + return new Builder(); + } + + /** + * Builder for {@link WorkspaceLockConflict}. + */ + public static final class Builder implements ShapeBuilder { + private final PresenceTracker tracker = PresenceTracker.of($SCHEMA); + private String message; + private WorkspaceLock lock; + private Throwable $cause; + private Boolean $captureStackTrace; + private boolean $deserialized; + + private Builder() {} + + @Override + public Schema schema() { + return $SCHEMA; + } + + /** + *

Required + * @return this builder. + */ + public Builder message(String message) { + this.message = Objects.requireNonNull(message, "message cannot be null"); + tracker.setMember($SCHEMA_MESSAGE); + return this; + } + + /** + *

Required + * @return this builder. + */ + public Builder lock(WorkspaceLock lock) { + this.lock = Objects.requireNonNull(lock, "lock cannot be null"); + tracker.setMember($SCHEMA_LOCK); + return this; + } + + public Builder withStackTrace() { + this.$captureStackTrace = true; + return this; + } + + public Builder withoutStackTrace() { + this.$captureStackTrace = false; + return this; + } + + public Builder withCause(Throwable cause) { + this.$cause = cause; + return this; + } + + @Override + public WorkspaceLockConflict build() { + tracker.validate(); + return new WorkspaceLockConflict(this); + } + + @Override + @SuppressWarnings("unchecked") + public void setMemberValue(Schema member, Object value) { + switch (member.memberIndex()) { + case 0 -> message((String) SchemaUtils.validateSameMember($SCHEMA_MESSAGE, member, value)); + case 1 -> lock((WorkspaceLock) SchemaUtils.validateSameMember($SCHEMA_LOCK, member, value)); + default -> ShapeBuilder.super.setMemberValue(member, value); + } + } + + @Override + public ShapeBuilder errorCorrection() { + if (tracker.allSet()) { + return this; + } + if (!tracker.checkMember($SCHEMA_MESSAGE)) { + message(""); + } + if (!tracker.checkMember($SCHEMA_LOCK)) { + tracker.setMember($SCHEMA_LOCK); + } + return this; + } + + @Override + public Builder deserialize(ShapeDeserializer decoder) { + this.$deserialized = true; + decoder.readStruct($SCHEMA, this, $InnerDeserializer.INSTANCE); + return this; + } + + @Override + public Builder deserializeMember(ShapeDeserializer decoder, Schema schema) { + decoder.readStruct(schema.assertMemberTargetIs($SCHEMA), this, $InnerDeserializer.INSTANCE); + return this; + } + + private static final class $InnerDeserializer implements ShapeDeserializer.StructMemberConsumer { + private static final $InnerDeserializer INSTANCE = new $InnerDeserializer(); + + @Override + public void accept(Builder builder, Schema member, ShapeDeserializer de) { + switch (member.memberIndex()) { + case 0 -> builder.message(de.readString(member)); + case 1 -> builder.lock(WorkspaceLock.builder().deserializeMember(de, member).build()); + default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); + } + } + } + } +} + 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..0180cebe9 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,7 @@ public final class WorkspaceResponse implements SerializableStruct { new RequiredTrait()) .putMember("enable_change_reason_validation", PreludeSchemas.BOOLEAN, new RequiredTrait()) + .putMember("workspace_lock", WorkspaceLock.$SCHEMA) .build(); private static final Schema $SCHEMA_WORKSPACE_NAME = $SCHEMA.member("workspace_name"); @@ -75,6 +76,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_WORKSPACE_LOCK = $SCHEMA.member("workspace_lock"); private final transient String workspaceName; private final transient String organisationId; @@ -93,6 +95,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 WorkspaceLock workspaceLock; private WorkspaceResponse(Builder builder) { this.workspaceName = builder.workspaceName; @@ -112,6 +115,7 @@ private WorkspaceResponse(Builder builder) { this.autoPopulateControl = builder.autoPopulateControl; this.enableContextValidation = builder.enableContextValidation; this.enableChangeReasonValidation = builder.enableChangeReasonValidation; + this.workspaceLock = builder.workspaceLock; } public String workspaceName() { @@ -189,6 +193,10 @@ public boolean enableChangeReasonValidation() { return enableChangeReasonValidation; } + public WorkspaceLock workspaceLock() { + return workspaceLock; + } + @Override public String toString() { return ToStringSerializer.serialize(this); @@ -219,12 +227,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.workspaceLock, that.workspaceLock); } @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, workspaceLock); } @Override @@ -255,6 +264,9 @@ 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); + if (workspaceLock != null) { + serializer.writeStruct($SCHEMA_WORKSPACE_LOCK, workspaceLock); + } } @Override @@ -278,6 +290,7 @@ public T getMemberValue(Schema member) { 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 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_LOCK, member, workspaceLock); default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -308,6 +321,7 @@ public Builder toBuilder() { builder.autoPopulateControl(this.autoPopulateControl); builder.enableContextValidation(this.enableContextValidation); builder.enableChangeReasonValidation(this.enableChangeReasonValidation); + builder.workspaceLock(this.workspaceLock); return builder; } @@ -340,6 +354,7 @@ public static final class Builder implements ShapeBuilder { private boolean autoPopulateControl; private boolean enableContextValidation; private boolean enableChangeReasonValidation; + private WorkspaceLock workspaceLock; private Builder() {} @@ -514,6 +529,14 @@ public Builder enableChangeReasonValidation(boolean enableChangeReasonValidation return this; } + /** + * @return this builder. + */ + public Builder workspaceLock(WorkspaceLock workspaceLock) { + this.workspaceLock = workspaceLock; + return this; + } + @Override public WorkspaceResponse build() { tracker.validate(); @@ -541,6 +564,7 @@ public void setMemberValue(Schema member, Object 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 17 -> workspaceLock((WorkspaceLock) SchemaUtils.validateSameMember($SCHEMA_WORKSPACE_LOCK, member, value)); default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -633,6 +657,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 14 -> builder.enableChangeReasonValidation(de.readBoolean(member)); case 15 -> builder.configVersion(de.readString(member)); case 16 -> builder.mandatoryDimensions(SharedSerde.deserializeListMandatoryDimensions(member, de)); + case 17 -> builder.workspaceLock(WorkspaceLock.builder().deserializeMember(de, member).build()); default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/javascript/sdk/src/commands/CreateDefaultConfigCommand.ts b/clients/javascript/sdk/src/commands/CreateDefaultConfigCommand.ts index 549d0600d..1e867c7cb 100644 --- a/clients/javascript/sdk/src/commands/CreateDefaultConfigCommand.ts +++ b/clients/javascript/sdk/src/commands/CreateDefaultConfigCommand.ts @@ -84,6 +84,9 @@ export interface CreateDefaultConfigCommandOutput extends DefaultConfigResponse, * @throws {@link WebhookFailed} (server fault) * Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete. * + * @throws {@link WorkspaceLockConflict} (client fault) + * Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock. + * * @throws {@link InternalServerError} (server fault) * * @throws {@link SuperpositionServiceException} diff --git a/clients/javascript/sdk/src/commands/CreateWorkspaceCommand.ts b/clients/javascript/sdk/src/commands/CreateWorkspaceCommand.ts index e31d324f9..8e5a9508f 100644 --- a/clients/javascript/sdk/src/commands/CreateWorkspaceCommand.ts +++ b/clients/javascript/sdk/src/commands/CreateWorkspaceCommand.ts @@ -75,6 +75,13 @@ 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 + * // workspace_lock: { // WorkspaceLock + * // lock_id: "STRING_VALUE", // required + * // operation: "STRING_VALUE", // required + * // locked_by: "STRING_VALUE", // required + * // acquired_at: new Date("TIMESTAMP"), // required + * // expires_at: new Date("TIMESTAMP"), // required + * // }, * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/DeleteDefaultConfigCommand.ts b/clients/javascript/sdk/src/commands/DeleteDefaultConfigCommand.ts index 477e7cabd..5462b0104 100644 --- a/clients/javascript/sdk/src/commands/DeleteDefaultConfigCommand.ts +++ b/clients/javascript/sdk/src/commands/DeleteDefaultConfigCommand.ts @@ -61,6 +61,9 @@ export interface DeleteDefaultConfigCommandOutput extends __MetadataBearer {} * @throws {@link WebhookFailed} (server fault) * Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete. * + * @throws {@link WorkspaceLockConflict} (client fault) + * Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock. + * * @throws {@link InternalServerError} (server fault) * * @throws {@link SuperpositionServiceException} diff --git a/clients/javascript/sdk/src/commands/GetWorkspaceCommand.ts b/clients/javascript/sdk/src/commands/GetWorkspaceCommand.ts index 20c937d06..ad74076f0 100644 --- a/clients/javascript/sdk/src/commands/GetWorkspaceCommand.ts +++ b/clients/javascript/sdk/src/commands/GetWorkspaceCommand.ts @@ -68,6 +68,13 @@ 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 + * // workspace_lock: { // WorkspaceLock + * // lock_id: "STRING_VALUE", // required + * // operation: "STRING_VALUE", // required + * // locked_by: "STRING_VALUE", // required + * // acquired_at: new Date("TIMESTAMP"), // required + * // expires_at: new Date("TIMESTAMP"), // required + * // }, * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/ListWorkspaceCommand.ts b/clients/javascript/sdk/src/commands/ListWorkspaceCommand.ts index 893ea54a4..ea1ad1130 100644 --- a/clients/javascript/sdk/src/commands/ListWorkspaceCommand.ts +++ b/clients/javascript/sdk/src/commands/ListWorkspaceCommand.ts @@ -74,6 +74,13 @@ 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 + * // workspace_lock: { // WorkspaceLock + * // lock_id: "STRING_VALUE", // required + * // operation: "STRING_VALUE", // required + * // locked_by: "STRING_VALUE", // required + * // acquired_at: new Date("TIMESTAMP"), // required + * // expires_at: new Date("TIMESTAMP"), // required + * // }, * // }, * // ], * // }; diff --git a/clients/javascript/sdk/src/commands/MigrateWorkspaceSchemaCommand.ts b/clients/javascript/sdk/src/commands/MigrateWorkspaceSchemaCommand.ts index 8240f8b98..b385b01d4 100644 --- a/clients/javascript/sdk/src/commands/MigrateWorkspaceSchemaCommand.ts +++ b/clients/javascript/sdk/src/commands/MigrateWorkspaceSchemaCommand.ts @@ -68,6 +68,13 @@ export interface MigrateWorkspaceSchemaCommandOutput extends WorkspaceResponse, * // auto_populate_control: true || false, // required * // enable_context_validation: true || false, // required * // enable_change_reason_validation: true || false, // required + * // workspace_lock: { // WorkspaceLock + * // lock_id: "STRING_VALUE", // required + * // operation: "STRING_VALUE", // required + * // locked_by: "STRING_VALUE", // required + * // acquired_at: new Date("TIMESTAMP"), // required + * // expires_at: new Date("TIMESTAMP"), // required + * // }, * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/UpdateDefaultConfigCommand.ts b/clients/javascript/sdk/src/commands/UpdateDefaultConfigCommand.ts index 33bad2765..338e86fcf 100644 --- a/clients/javascript/sdk/src/commands/UpdateDefaultConfigCommand.ts +++ b/clients/javascript/sdk/src/commands/UpdateDefaultConfigCommand.ts @@ -86,6 +86,9 @@ export interface UpdateDefaultConfigCommandOutput extends DefaultConfigResponse, * @throws {@link WebhookFailed} (server fault) * Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete. * + * @throws {@link WorkspaceLockConflict} (client fault) + * Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock. + * * @throws {@link InternalServerError} (server fault) * * @throws {@link SuperpositionServiceException} diff --git a/clients/javascript/sdk/src/commands/UpdateWorkspaceCommand.ts b/clients/javascript/sdk/src/commands/UpdateWorkspaceCommand.ts index c68e67d43..3a156e8ab 100644 --- a/clients/javascript/sdk/src/commands/UpdateWorkspaceCommand.ts +++ b/clients/javascript/sdk/src/commands/UpdateWorkspaceCommand.ts @@ -79,6 +79,13 @@ 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 + * // workspace_lock: { // WorkspaceLock + * // lock_id: "STRING_VALUE", // required + * // operation: "STRING_VALUE", // required + * // locked_by: "STRING_VALUE", // required + * // acquired_at: new Date("TIMESTAMP"), // required + * // expires_at: new Date("TIMESTAMP"), // required + * // }, * // }; * * ``` diff --git a/clients/javascript/sdk/src/models/models_0.ts b/clients/javascript/sdk/src/models/models_0.ts index 0a169c822..4f577903d 100644 --- a/clients/javascript/sdk/src/models/models_0.ts +++ b/clients/javascript/sdk/src/models/models_0.ts @@ -1263,6 +1263,69 @@ export interface DefaultConfigResponse { last_modified_by: string | undefined; } +/** + * Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + * @public + */ +export interface WorkspaceLock { + /** + * Unique identifier for the active workspace lock. + * @public + */ + lock_id: string | undefined; + + /** + * Write operation that currently holds the workspace lock. + * @public + */ + operation: string | undefined; + + /** + * User that acquired the workspace lock. + * @public + */ + locked_by: string | undefined; + + /** + * Timestamp at which the workspace lock was acquired. + * @public + */ + acquired_at: Date | undefined; + + /** + * Timestamp at which the workspace lock expires if it is not released first. + * @public + */ + expires_at: Date | undefined; +} + +/** + * Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock. + * @public + */ +export class WorkspaceLockConflict extends __BaseException { + readonly name: "WorkspaceLockConflict" = "WorkspaceLockConflict"; + readonly $fault: "client" = "client"; + /** + * Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + * @public + */ + lock: WorkspaceLock | undefined; + + /** + * @internal + */ + constructor(opts: __ExceptionOptionType) { + super({ + name: "WorkspaceLockConflict", + $fault: "client", + ...opts + }); + Object.setPrototypeOf(this, WorkspaceLockConflict.prototype); + this.lock = opts.lock; + } +} + /** * @public */ @@ -1683,6 +1746,11 @@ export interface WorkspaceResponse { auto_populate_control: boolean | undefined; enable_context_validation: boolean | undefined; enable_change_reason_validation: boolean | undefined; + /** + * Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + * @public + */ + workspace_lock?: WorkspaceLock | undefined; } /** diff --git a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts index fd8aa6c2f..a329b75a2 100644 --- a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts +++ b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts @@ -378,6 +378,8 @@ import { WebhookFailed, WebhookResponse, WeightRecomputeResponse, + WorkspaceLock, + WorkspaceLockConflict, WorkspaceResponse, } from "../models/models_0"; import { @@ -3125,6 +3127,7 @@ export const de_CreateWorkspaceCommand = async( 'organisation_id': __expectString, 'organisation_name': __expectString, 'workspace_admin_email': __expectString, + 'workspace_lock': _ => de_WorkspaceLock(_, context), 'workspace_name': __expectString, 'workspace_schema_name': __expectString, 'workspace_status': __expectString, @@ -4004,6 +4007,7 @@ export const de_GetWorkspaceCommand = async( 'organisation_id': __expectString, 'organisation_name': __expectString, 'workspace_admin_email': __expectString, + 'workspace_lock': _ => de_WorkspaceLock(_, context), 'workspace_name': __expectString, 'workspace_schema_name': __expectString, 'workspace_status': __expectString, @@ -4342,6 +4346,7 @@ export const de_MigrateWorkspaceSchemaCommand = async( 'organisation_id': __expectString, 'organisation_name': __expectString, 'workspace_admin_email': __expectString, + 'workspace_lock': _ => de_WorkspaceLock(_, context), 'workspace_name': __expectString, 'workspace_schema_name': __expectString, 'workspace_status': __expectString, @@ -5018,6 +5023,7 @@ export const de_UpdateWorkspaceCommand = async( 'organisation_id': __expectString, 'organisation_name': __expectString, 'workspace_admin_email': __expectString, + 'workspace_lock': _ => de_WorkspaceLock(_, context), 'workspace_name': __expectString, 'workspace_schema_name': __expectString, 'workspace_status': __expectString, @@ -5086,6 +5092,9 @@ const de_CommandError = async( case "WebhookFailed": case "io.superposition#WebhookFailed": throw await de_WebhookFailedRes(parsedOutput, context); + case "WorkspaceLockConflict": + case "io.superposition#WorkspaceLockConflict": + throw await de_WorkspaceLockConflictRes(parsedOutput, context); default: const parsedBody = parsedOutput.body; return throwDefaultError({ @@ -5159,6 +5168,28 @@ const de_CommandError = async( return __decorateServiceException(exception, parsedOutput.body); }; + /** + * deserializeAws_restJson1WorkspaceLockConflictRes + */ + const de_WorkspaceLockConflictRes = async ( + parsedOutput: any, + context: __SerdeContext + ): Promise => { + const contents: any = map({ + }); + const data: any = parsedOutput.body; + const doc = take(data, { + 'lock': _ => de_WorkspaceLock(_, context), + 'message': __expectString, + }); + Object.assign(contents, doc); + const exception = new WorkspaceLockConflict({ + $metadata: deserializeMetadata(parsedOutput), + ...contents + }); + return __decorateServiceException(exception, parsedOutput.body); + }; + /** * serializeAws_restJson1BulkOperationList */ @@ -6197,6 +6228,22 @@ const de_CommandError = async( return retVal; } + /** + * deserializeAws_restJson1WorkspaceLock + */ + const de_WorkspaceLock = ( + output: any, + context: __SerdeContext + ): WorkspaceLock => { + return take(output, { + 'acquired_at': (_: any) => __expectNonNull(__parseRfc3339DateTimeWithOffset(_)), + 'expires_at': (_: any) => __expectNonNull(__parseRfc3339DateTimeWithOffset(_)), + 'lock_id': __expectString, + 'locked_by': __expectString, + 'operation': __expectString, + }) as any; + } + /** * deserializeAws_restJson1WorkspaceResponse */ @@ -6219,6 +6266,7 @@ const de_CommandError = async( 'organisation_id': __expectString, 'organisation_name': __expectString, 'workspace_admin_email': __expectString, + 'workspace_lock': (_: any) => de_WorkspaceLock(_, context), 'workspace_name': __expectString, 'workspace_schema_name': __expectString, 'workspace_status': __expectString, diff --git a/clients/python/sdk/superposition_sdk/_private/schemas.py b/clients/python/sdk/superposition_sdk/_private/schemas.py index ba53e6a7b..a4dd499d6 100644 --- a/clients/python/sdk/superposition_sdk/_private/schemas.py +++ b/clients/python/sdk/superposition_sdk/_private/schemas.py @@ -4568,6 +4568,88 @@ } ) +WORKSPACE_LOCK = Schema.collection( + id=ShapeID("io.superposition#WorkspaceLock"), + + members={ + "lock_id": { + "target": STRING, + "index": 0, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + + "operation": { + "target": STRING, + "index": 1, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + + "locked_by": { + "target": STRING, + "index": 2, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + + "acquired_at": { + "target": DATE_TIME, + "index": 3, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + + "expires_at": { + "target": DATE_TIME, + "index": 4, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + + } +) + +WORKSPACE_LOCK_CONFLICT = Schema.collection( + id=ShapeID("io.superposition#WorkspaceLockConflict"), + + traits=[ + Trait.new(id=ShapeID("smithy.api#error"), value="client"), + Trait.new(id=ShapeID("smithy.api#httpError"), value=409), + + ], + members={ + "message": { + "target": STRING, + "index": 0, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + + "lock": { + "target": WORKSPACE_LOCK, + "index": 1, + "traits": [ + Trait.new(id=ShapeID("smithy.api#required")), + + ], + }, + + } +) + CREATE_DEFAULT_CONFIG = Schema( id=ShapeID("io.superposition#CreateDefaultConfig"), shape_type=ShapeType.OPERATION, @@ -6933,6 +7015,11 @@ ], }, + "workspace_lock": { + "target": WORKSPACE_LOCK, + "index": 17, + }, + } ) @@ -14664,6 +14751,11 @@ ], }, + "workspace_lock": { + "target": WORKSPACE_LOCK, + "index": 17, + }, + } ) @@ -15907,6 +15999,11 @@ ], }, + "workspace_lock": { + "target": WORKSPACE_LOCK, + "index": 17, + }, + } ) @@ -16221,6 +16318,11 @@ ], }, + "workspace_lock": { + "target": WORKSPACE_LOCK, + "index": 17, + }, + } ) @@ -17435,6 +17537,11 @@ ], }, + "workspace_lock": { + "target": WORKSPACE_LOCK, + "index": 17, + }, + } ) diff --git a/clients/python/sdk/superposition_sdk/deserialize.py b/clients/python/sdk/superposition_sdk/deserialize.py index e387a0d7c..0414234cd 100644 --- a/clients/python/sdk/superposition_sdk/deserialize.py +++ b/clients/python/sdk/superposition_sdk/deserialize.py @@ -104,6 +104,7 @@ ValidateContextOutput, WebhookFailed, WeightRecomputeOutput, + WorkspaceLockConflict, ) @@ -278,6 +279,9 @@ async def _deserialize_error_create_default_config(http_response: HTTPResponse, case "webhookfailed": return await _deserialize_error_webhook_failed(http_response, config, parsed_body, message) + case "workspacelockconflict": + return await _deserialize_error_workspace_lock_conflict(http_response, config, parsed_body, message) + case _: return UnknownApiError(f"{code}: {message}") @@ -582,6 +586,9 @@ async def _deserialize_error_delete_default_config(http_response: HTTPResponse, case "webhookfailed": return await _deserialize_error_webhook_failed(http_response, config, parsed_body, message) + case "workspacelockconflict": + return await _deserialize_error_workspace_lock_conflict(http_response, config, parsed_body, message) + case _: return UnknownApiError(f"{code}: {message}") @@ -2115,6 +2122,9 @@ async def _deserialize_error_update_default_config(http_response: HTTPResponse, case "webhookfailed": return await _deserialize_error_webhook_failed(http_response, config, parsed_body, message) + case "workspacelockconflict": + return await _deserialize_error_workspace_lock_conflict(http_response, config, parsed_body, message) + case _: return UnknownApiError(f"{code}: {message}") @@ -2532,3 +2542,24 @@ async def _deserialize_error_webhook_failed( kwargs.update(body_kwargs) return WebhookFailed(**kwargs) + +async def _deserialize_error_workspace_lock_conflict( + http_response: HTTPResponse, + config: Config, + parsed_body: dict[str, DocumentValue] | None, + default_message: str, +) -> WorkspaceLockConflict: + kwargs: dict[str, Any] = {"message": default_message} + + if parsed_body is None: + body = await http_response.consume_body_async() + else: + body = json.dumps(parsed_body).encode('utf-8') + + if body: + codec = JSONCodec(default_timestamp_format=TimestampFormat.EPOCH_SECONDS) + deserializer = codec.create_deserializer(body) + body_kwargs = WorkspaceLockConflict.deserialize_kwargs(deserializer) + kwargs.update(body_kwargs) + + return WorkspaceLockConflict(**kwargs) diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index 4d2fae503..2a42bbb30 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -306,6 +306,8 @@ WEIGHT_RECOMPUTE_INPUT as _SCHEMA_WEIGHT_RECOMPUTE_INPUT, WEIGHT_RECOMPUTE_OUTPUT as _SCHEMA_WEIGHT_RECOMPUTE_OUTPUT, WEIGHT_RECOMPUTE_RESPONSE as _SCHEMA_WEIGHT_RECOMPUTE_RESPONSE, + WORKSPACE_LOCK as _SCHEMA_WORKSPACE_LOCK, + WORKSPACE_LOCK_CONFLICT as _SCHEMA_WORKSPACE_LOCK_CONFLICT, WORKSPACE_RESPONSE as _SCHEMA_WORKSPACE_RESPONSE, ) @@ -5157,6 +5159,130 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: deserializer.read_struct(_SCHEMA_CREATE_DEFAULT_CONFIG_OUTPUT, consumer=_consumer) return kwargs +@dataclass(kw_only=True) +class WorkspaceLock: + """ + Metadata for an active workspace write lock. Present only while another write + operation is holding the workspace lease. + + :param lock_id: + **[Required]** - Unique identifier for the active workspace lock. + + :param operation: + **[Required]** - Write operation that currently holds the workspace lock. + + :param locked_by: + **[Required]** - User that acquired the workspace lock. + + :param acquired_at: + **[Required]** - Timestamp at which the workspace lock was acquired. + + :param expires_at: + **[Required]** - Timestamp at which the workspace lock expires if it is not + released first. + + """ + + lock_id: str + + operation: str + + locked_by: str + + acquired_at: datetime + + expires_at: datetime + + def serialize(self, serializer: ShapeSerializer): + serializer.write_struct(_SCHEMA_WORKSPACE_LOCK, self) + + def serialize_members(self, serializer: ShapeSerializer): + serializer.write_string(_SCHEMA_WORKSPACE_LOCK.members["lock_id"], self.lock_id) + serializer.write_string(_SCHEMA_WORKSPACE_LOCK.members["operation"], self.operation) + serializer.write_string(_SCHEMA_WORKSPACE_LOCK.members["locked_by"], self.locked_by) + serializer.write_timestamp(_SCHEMA_WORKSPACE_LOCK.members["acquired_at"], self.acquired_at) + serializer.write_timestamp(_SCHEMA_WORKSPACE_LOCK.members["expires_at"], self.expires_at) + + @classmethod + def deserialize(cls, deserializer: ShapeDeserializer) -> Self: + return cls(**cls.deserialize_kwargs(deserializer)) + + @classmethod + def deserialize_kwargs(cls, deserializer: ShapeDeserializer) -> dict[str, Any]: + kwargs: dict[str, Any] = {} + + def _consumer(schema: Schema, de: ShapeDeserializer) -> None: + match schema.expect_member_index(): + case 0: + kwargs["lock_id"] = de.read_string(_SCHEMA_WORKSPACE_LOCK.members["lock_id"]) + + case 1: + kwargs["operation"] = de.read_string(_SCHEMA_WORKSPACE_LOCK.members["operation"]) + + case 2: + kwargs["locked_by"] = de.read_string(_SCHEMA_WORKSPACE_LOCK.members["locked_by"]) + + case 3: + kwargs["acquired_at"] = de.read_timestamp(_SCHEMA_WORKSPACE_LOCK.members["acquired_at"]) + + case 4: + kwargs["expires_at"] = de.read_timestamp(_SCHEMA_WORKSPACE_LOCK.members["expires_at"]) + + case _: + logger.debug("Unexpected member schema: %s", schema) + + deserializer.read_struct(_SCHEMA_WORKSPACE_LOCK, consumer=_consumer) + return kwargs + +@dataclass(kw_only=True) +class WorkspaceLockConflict(ApiError): + """ + Returned when a workspace write operation cannot proceed because another write + operation currently holds the workspace lock. + + :param message: A message associated with the specific error. + + :param lock: + **[Required]** - Metadata for an active workspace write lock. Present only while + another write operation is holding the workspace lease. + + """ + + code: ClassVar[str] = "WorkspaceLockConflict" + fault: ClassVar[Literal["client", "server"]] = "client" + + message: str + lock: WorkspaceLock + + def serialize(self, serializer: ShapeSerializer): + serializer.write_struct(_SCHEMA_WORKSPACE_LOCK_CONFLICT, self) + + def serialize_members(self, serializer: ShapeSerializer): + serializer.write_string(_SCHEMA_WORKSPACE_LOCK_CONFLICT.members["message"], self.message) + serializer.write_struct(_SCHEMA_WORKSPACE_LOCK_CONFLICT.members["lock"], self.lock) + + @classmethod + def deserialize(cls, deserializer: ShapeDeserializer) -> Self: + return cls(**cls.deserialize_kwargs(deserializer)) + + @classmethod + def deserialize_kwargs(cls, deserializer: ShapeDeserializer) -> dict[str, Any]: + kwargs: dict[str, Any] = {} + + def _consumer(schema: Schema, de: ShapeDeserializer) -> None: + match schema.expect_member_index(): + case 0: + kwargs["message"] = de.read_string(_SCHEMA_WORKSPACE_LOCK_CONFLICT.members["message"]) + + case 1: + kwargs["lock"] = WorkspaceLock.deserialize(de) + + case _: + logger.debug("Unexpected member schema: %s", schema) + + deserializer.read_struct(_SCHEMA_WORKSPACE_LOCK_CONFLICT, consumer=_consumer) + return kwargs + CREATE_DEFAULT_CONFIG = APIOperation( input = CreateDefaultConfigInput, output = CreateDefaultConfigOutput, @@ -5165,6 +5291,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: output_schema = _SCHEMA_CREATE_DEFAULT_CONFIG_OUTPUT, error_registry = TypeRegistry({ ShapeID("io.superposition#WebhookFailed"): WebhookFailed, +ShapeID("io.superposition#WorkspaceLockConflict"): WorkspaceLockConflict, ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -7125,6 +7252,13 @@ def _read_value(d: ShapeDeserializer): @dataclass(kw_only=True) class CreateWorkspaceOutput: + """ + + :param workspace_lock: + Metadata for an active workspace write lock. Present only while another write + operation is holding the workspace lease. + + """ workspace_name: str @@ -7158,6 +7292,7 @@ class CreateWorkspaceOutput: config_version: str | None = None mandatory_dimensions: list[str] | None = None + workspace_lock: WorkspaceLock | None = None def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_CREATE_WORKSPACE_OUTPUT, self) @@ -7184,6 +7319,8 @@ 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) + if self.workspace_lock is not None: + serializer.write_struct(_SCHEMA_CREATE_WORKSPACE_OUTPUT.members["workspace_lock"], self.workspace_lock) @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: @@ -7246,6 +7383,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["workspace_lock"] = WorkspaceLock.deserialize(de) + case _: logger.debug("Unexpected member schema: %s", schema) @@ -7340,6 +7480,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: error_registry = TypeRegistry({ ShapeID("io.superposition#ResourceNotFound"): ResourceNotFound, ShapeID("io.superposition#WebhookFailed"): WebhookFailed, +ShapeID("io.superposition#WorkspaceLockConflict"): WorkspaceLockConflict, ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -7939,6 +8080,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: error_registry = TypeRegistry({ ShapeID("io.superposition#ResourceNotFound"): ResourceNotFound, ShapeID("io.superposition#WebhookFailed"): WebhookFailed, +ShapeID("io.superposition#WorkspaceLockConflict"): WorkspaceLockConflict, ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -14490,6 +14632,13 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: @dataclass(kw_only=True) class GetWorkspaceOutput: + """ + + :param workspace_lock: + Metadata for an active workspace write lock. Present only while another write + operation is holding the workspace lease. + + """ workspace_name: str @@ -14523,6 +14672,7 @@ class GetWorkspaceOutput: config_version: str | None = None mandatory_dimensions: list[str] | None = None + workspace_lock: WorkspaceLock | None = None def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_GET_WORKSPACE_OUTPUT, self) @@ -14549,6 +14699,8 @@ 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) + if self.workspace_lock is not None: + serializer.write_struct(_SCHEMA_GET_WORKSPACE_OUTPUT.members["workspace_lock"], self.workspace_lock) @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: @@ -14611,6 +14763,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["workspace_lock"] = WorkspaceLock.deserialize(de) + case _: logger.debug("Unexpected member schema: %s", schema) @@ -15663,6 +15818,13 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: @dataclass(kw_only=True) class WorkspaceResponse: + """ + + :param workspace_lock: + Metadata for an active workspace write lock. Present only while another write + operation is holding the workspace lease. + + """ workspace_name: str @@ -15696,6 +15858,7 @@ class WorkspaceResponse: config_version: str | None = None mandatory_dimensions: list[str] | None = None + workspace_lock: WorkspaceLock | None = None def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_WORKSPACE_RESPONSE, self) @@ -15722,6 +15885,8 @@ 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) + if self.workspace_lock is not None: + serializer.write_struct(_SCHEMA_WORKSPACE_RESPONSE.members["workspace_lock"], self.workspace_lock) @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: @@ -15784,6 +15949,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["workspace_lock"] = WorkspaceLock.deserialize(de) + case _: logger.debug("Unexpected member schema: %s", schema) @@ -15977,6 +16145,13 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: @dataclass(kw_only=True) class MigrateWorkspaceSchemaOutput: + """ + + :param workspace_lock: + Metadata for an active workspace write lock. Present only while another write + operation is holding the workspace lease. + + """ workspace_name: str @@ -16010,6 +16185,7 @@ class MigrateWorkspaceSchemaOutput: config_version: str | None = None mandatory_dimensions: list[str] | None = None + workspace_lock: WorkspaceLock | None = None def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_MIGRATE_WORKSPACE_SCHEMA_OUTPUT, self) @@ -16036,6 +16212,8 @@ 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) + if self.workspace_lock is not None: + serializer.write_struct(_SCHEMA_MIGRATE_WORKSPACE_SCHEMA_OUTPUT.members["workspace_lock"], self.workspace_lock) @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: @@ -16098,6 +16276,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["workspace_lock"] = WorkspaceLock.deserialize(de) + case _: logger.debug("Unexpected member schema: %s", schema) @@ -17189,6 +17370,13 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: @dataclass(kw_only=True) class UpdateWorkspaceOutput: + """ + + :param workspace_lock: + Metadata for an active workspace write lock. Present only while another write + operation is holding the workspace lease. + + """ workspace_name: str @@ -17222,6 +17410,7 @@ class UpdateWorkspaceOutput: config_version: str | None = None mandatory_dimensions: list[str] | None = None + workspace_lock: WorkspaceLock | None = None def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_UPDATE_WORKSPACE_OUTPUT, self) @@ -17248,6 +17437,8 @@ 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) + if self.workspace_lock is not None: + serializer.write_struct(_SCHEMA_UPDATE_WORKSPACE_OUTPUT.members["workspace_lock"], self.workspace_lock) @classmethod def deserialize(cls, deserializer: ShapeDeserializer) -> Self: @@ -17310,6 +17501,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["workspace_lock"] = WorkspaceLock.deserialize(de) + case _: logger.debug("Unexpected member schema: %s", schema) diff --git a/crates/superposition_sdk/src/client/create_workspace.rs b/crates/superposition_sdk/src/client/create_workspace.rs index 011f0478d..2b0b3a90a 100644 --- a/crates/superposition_sdk/src/client/create_workspace.rs +++ b/crates/superposition_sdk/src/client/create_workspace.rs @@ -30,6 +30,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) + /// - [`workspace_lock(Option)`](crate::operation::create_workspace::CreateWorkspaceOutput::workspace_lock): Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. /// - 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..ad2da8f98 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) + /// - [`workspace_lock(Option)`](crate::operation::get_workspace::GetWorkspaceOutput::workspace_lock): Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. /// - 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..d4d3e8842 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) + /// - [`workspace_lock(Option)`](crate::operation::migrate_workspace_schema::MigrateWorkspaceSchemaOutput::workspace_lock): Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. /// - 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 31fda1a15..d436e7219 100644 --- a/crates/superposition_sdk/src/client/update_workspace.rs +++ b/crates/superposition_sdk/src/client/update_workspace.rs @@ -32,6 +32,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) + /// - [`workspace_lock(Option)`](crate::operation::update_workspace::UpdateWorkspaceOutput::workspace_lock): Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. /// - 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/error_meta.rs b/crates/superposition_sdk/src/error_meta.rs index 46b3a6e6e..e52681f97 100644 --- a/crates/superposition_sdk/src/error_meta.rs +++ b/crates/superposition_sdk/src/error_meta.rs @@ -9,6 +9,8 @@ pub enum Error { ResourceNotFound(crate::types::error::ResourceNotFound), /// Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete. WebhookFailed(crate::types::error::WebhookFailed), + /// Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock. + WorkspaceLockConflict(crate::types::error::WorkspaceLockConflict), /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \ variable wildcard pattern and check `.code()`: @@ -24,6 +26,7 @@ impl ::std::fmt::Display for Error { Error::InternalServerError(inner) => inner.fmt(f), Error::ResourceNotFound(inner) => inner.fmt(f), Error::WebhookFailed(inner) => inner.fmt(f), + Error::WorkspaceLockConflict(inner) => inner.fmt(f), Error::Unhandled(_) => if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) { write!(f, "unhandled error ({code})") } else { @@ -43,6 +46,7 @@ impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for Error { Self::InternalServerError(inner) => inner.meta(), Self::ResourceNotFound(inner) => inner.meta(), Self::WebhookFailed(inner) => inner.meta(), +Self::WorkspaceLockConflict(inner) => inner.meta(), Self::Unhandled(inner) => &inner.meta, } } @@ -176,6 +180,7 @@ impl From for fn from(err: crate::operation::create_default_config::CreateDefaultConfigError) -> Self { match err { crate::operation::create_default_config::CreateDefaultConfigError::WebhookFailed(inner) => Error::WebhookFailed(inner), + crate::operation::create_default_config::CreateDefaultConfigError::WorkspaceLockConflict(inner) => Error::WorkspaceLockConflict(inner), crate::operation::create_default_config::CreateDefaultConfigError::InternalServerError(inner) => Error::InternalServerError(inner), crate::operation::create_default_config::CreateDefaultConfigError::Unhandled(inner) => Error::Unhandled(inner), } @@ -434,6 +439,7 @@ impl From for match err { crate::operation::delete_default_config::DeleteDefaultConfigError::ResourceNotFound(inner) => Error::ResourceNotFound(inner), crate::operation::delete_default_config::DeleteDefaultConfigError::WebhookFailed(inner) => Error::WebhookFailed(inner), + crate::operation::delete_default_config::DeleteDefaultConfigError::WorkspaceLockConflict(inner) => Error::WorkspaceLockConflict(inner), crate::operation::delete_default_config::DeleteDefaultConfigError::InternalServerError(inner) => Error::InternalServerError(inner), crate::operation::delete_default_config::DeleteDefaultConfigError::Unhandled(inner) => Error::Unhandled(inner), } @@ -1607,6 +1613,7 @@ impl From for match err { crate::operation::update_default_config::UpdateDefaultConfigError::ResourceNotFound(inner) => Error::ResourceNotFound(inner), crate::operation::update_default_config::UpdateDefaultConfigError::WebhookFailed(inner) => Error::WebhookFailed(inner), + crate::operation::update_default_config::UpdateDefaultConfigError::WorkspaceLockConflict(inner) => Error::WorkspaceLockConflict(inner), crate::operation::update_default_config::UpdateDefaultConfigError::InternalServerError(inner) => Error::InternalServerError(inner), crate::operation::update_default_config::UpdateDefaultConfigError::Unhandled(inner) => Error::Unhandled(inner), } @@ -1906,6 +1913,7 @@ impl ::std::error::Error for Error { Error::InternalServerError(inner) => inner.source(), Error::ResourceNotFound(inner) => inner.source(), Error::WebhookFailed(inner) => inner.source(), + Error::WorkspaceLockConflict(inner) => inner.source(), Error::Unhandled(inner) => ::std::option::Option::Some(&*inner.source) } } diff --git a/crates/superposition_sdk/src/operation/create_default_config.rs b/crates/superposition_sdk/src/operation/create_default_config.rs index e66ddc49b..5affbf34d 100644 --- a/crates/superposition_sdk/src/operation/create_default_config.rs +++ b/crates/superposition_sdk/src/operation/create_default_config.rs @@ -195,6 +195,8 @@ builder pub enum CreateDefaultConfigError { /// Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete. WebhookFailed(crate::types::error::WebhookFailed), + /// Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock. + WorkspaceLockConflict(crate::types::error::WorkspaceLockConflict), #[allow(missing_docs)] // documentation missing in model InternalServerError(crate::types::error::InternalServerError), /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). @@ -223,6 +225,7 @@ impl CreateDefaultConfigError { pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata { match self { Self::WebhookFailed(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), + Self::WorkspaceLockConflict(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), Self::InternalServerError(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), Self::Unhandled(e) => &e.meta, } @@ -231,6 +234,10 @@ impl CreateDefaultConfigError { pub fn is_webhook_failed(&self) -> bool { matches!(self, Self::WebhookFailed(_)) } + /// Returns `true` if the error kind is `CreateDefaultConfigError::WorkspaceLockConflict`. + pub fn is_workspace_lock_conflict(&self) -> bool { + matches!(self, Self::WorkspaceLockConflict(_)) + } /// Returns `true` if the error kind is `CreateDefaultConfigError::InternalServerError`. pub fn is_internal_server_error(&self) -> bool { matches!(self, Self::InternalServerError(_)) @@ -242,6 +249,9 @@ impl ::std::error::Error for CreateDefaultConfigError { Self::WebhookFailed(_inner) => ::std::option::Option::Some(_inner) , + Self::WorkspaceLockConflict(_inner) => + ::std::option::Option::Some(_inner) + , Self::InternalServerError(_inner) => ::std::option::Option::Some(_inner) , @@ -257,6 +267,9 @@ impl ::std::fmt::Display for CreateDefaultConfigError { Self::WebhookFailed(_inner) => _inner.fmt(f) , + Self::WorkspaceLockConflict(_inner) => + _inner.fmt(f) + , Self::InternalServerError(_inner) => _inner.fmt(f) , @@ -284,6 +297,9 @@ impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for CreateDefault Self::WebhookFailed(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner) , + Self::WorkspaceLockConflict(_inner) => + ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner) + , Self::InternalServerError(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner) , 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..f0d07c911 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, + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub workspace_lock: ::std::option::Option, } 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 } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn workspace_lock(&self) -> ::std::option::Option<&crate::types::WorkspaceLock> { + self.workspace_lock.as_ref() + } } 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) workspace_lock: ::std::option::Option, } impl CreateWorkspaceOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -382,6 +389,19 @@ impl CreateWorkspaceOutputBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn workspace_lock(mut self, input: crate::types::WorkspaceLock) -> Self { + self.workspace_lock = ::std::option::Option::Some(input); + self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn set_workspace_lock(mut self, input: ::std::option::Option) -> Self { + self.workspace_lock = input; self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn get_workspace_lock(&self) -> &::std::option::Option { + &self.workspace_lock + } /// 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) @@ -481,6 +501,8 @@ 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") )? , + workspace_lock: self.workspace_lock + , } ) } diff --git a/crates/superposition_sdk/src/operation/delete_default_config.rs b/crates/superposition_sdk/src/operation/delete_default_config.rs index 94f7f2bc0..609e32261 100644 --- a/crates/superposition_sdk/src/operation/delete_default_config.rs +++ b/crates/superposition_sdk/src/operation/delete_default_config.rs @@ -199,6 +199,8 @@ pub enum DeleteDefaultConfigError { ResourceNotFound(crate::types::error::ResourceNotFound), /// Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete. WebhookFailed(crate::types::error::WebhookFailed), + /// Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock. + WorkspaceLockConflict(crate::types::error::WorkspaceLockConflict), #[allow(missing_docs)] // documentation missing in model InternalServerError(crate::types::error::InternalServerError), /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). @@ -228,6 +230,7 @@ impl DeleteDefaultConfigError { match self { Self::ResourceNotFound(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), Self::WebhookFailed(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), + Self::WorkspaceLockConflict(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), Self::InternalServerError(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), Self::Unhandled(e) => &e.meta, } @@ -240,6 +243,10 @@ impl DeleteDefaultConfigError { pub fn is_webhook_failed(&self) -> bool { matches!(self, Self::WebhookFailed(_)) } + /// Returns `true` if the error kind is `DeleteDefaultConfigError::WorkspaceLockConflict`. + pub fn is_workspace_lock_conflict(&self) -> bool { + matches!(self, Self::WorkspaceLockConflict(_)) + } /// Returns `true` if the error kind is `DeleteDefaultConfigError::InternalServerError`. pub fn is_internal_server_error(&self) -> bool { matches!(self, Self::InternalServerError(_)) @@ -254,6 +261,9 @@ impl ::std::error::Error for DeleteDefaultConfigError { Self::WebhookFailed(_inner) => ::std::option::Option::Some(_inner) , + Self::WorkspaceLockConflict(_inner) => + ::std::option::Option::Some(_inner) + , Self::InternalServerError(_inner) => ::std::option::Option::Some(_inner) , @@ -272,6 +282,9 @@ impl ::std::fmt::Display for DeleteDefaultConfigError { Self::WebhookFailed(_inner) => _inner.fmt(f) , + Self::WorkspaceLockConflict(_inner) => + _inner.fmt(f) + , Self::InternalServerError(_inner) => _inner.fmt(f) , @@ -302,6 +315,9 @@ impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for DeleteDefault Self::WebhookFailed(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner) , + Self::WorkspaceLockConflict(_inner) => + ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner) + , Self::InternalServerError(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner) , 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..b030ca000 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, + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub workspace_lock: ::std::option::Option, } 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 } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn workspace_lock(&self) -> ::std::option::Option<&crate::types::WorkspaceLock> { + self.workspace_lock.as_ref() + } } 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) workspace_lock: ::std::option::Option, } impl GetWorkspaceOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -382,6 +389,19 @@ impl GetWorkspaceOutputBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn workspace_lock(mut self, input: crate::types::WorkspaceLock) -> Self { + self.workspace_lock = ::std::option::Option::Some(input); + self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn set_workspace_lock(mut self, input: ::std::option::Option) -> Self { + self.workspace_lock = input; self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn get_workspace_lock(&self) -> &::std::option::Option { + &self.workspace_lock + } /// 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) @@ -481,6 +501,8 @@ 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") )? , + workspace_lock: self.workspace_lock + , } ) } 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..1c2c3965c 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, + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub workspace_lock: ::std::option::Option, } 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 } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn workspace_lock(&self) -> ::std::option::Option<&crate::types::WorkspaceLock> { + self.workspace_lock.as_ref() + } } 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) workspace_lock: ::std::option::Option, } impl MigrateWorkspaceSchemaOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -382,6 +389,19 @@ impl MigrateWorkspaceSchemaOutputBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn workspace_lock(mut self, input: crate::types::WorkspaceLock) -> Self { + self.workspace_lock = ::std::option::Option::Some(input); + self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn set_workspace_lock(mut self, input: ::std::option::Option) -> Self { + self.workspace_lock = input; self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn get_workspace_lock(&self) -> &::std::option::Option { + &self.workspace_lock + } /// 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) @@ -481,6 +501,8 @@ 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") )? , + workspace_lock: self.workspace_lock + , } ) } diff --git a/crates/superposition_sdk/src/operation/update_default_config.rs b/crates/superposition_sdk/src/operation/update_default_config.rs index fc80a8416..4d8be87f5 100644 --- a/crates/superposition_sdk/src/operation/update_default_config.rs +++ b/crates/superposition_sdk/src/operation/update_default_config.rs @@ -203,6 +203,8 @@ pub enum UpdateDefaultConfigError { ResourceNotFound(crate::types::error::ResourceNotFound), /// Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete. WebhookFailed(crate::types::error::WebhookFailed), + /// Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock. + WorkspaceLockConflict(crate::types::error::WorkspaceLockConflict), #[allow(missing_docs)] // documentation missing in model InternalServerError(crate::types::error::InternalServerError), /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). @@ -232,6 +234,7 @@ impl UpdateDefaultConfigError { match self { Self::ResourceNotFound(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), Self::WebhookFailed(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), + Self::WorkspaceLockConflict(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), Self::InternalServerError(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), Self::Unhandled(e) => &e.meta, } @@ -244,6 +247,10 @@ impl UpdateDefaultConfigError { pub fn is_webhook_failed(&self) -> bool { matches!(self, Self::WebhookFailed(_)) } + /// Returns `true` if the error kind is `UpdateDefaultConfigError::WorkspaceLockConflict`. + pub fn is_workspace_lock_conflict(&self) -> bool { + matches!(self, Self::WorkspaceLockConflict(_)) + } /// Returns `true` if the error kind is `UpdateDefaultConfigError::InternalServerError`. pub fn is_internal_server_error(&self) -> bool { matches!(self, Self::InternalServerError(_)) @@ -258,6 +265,9 @@ impl ::std::error::Error for UpdateDefaultConfigError { Self::WebhookFailed(_inner) => ::std::option::Option::Some(_inner) , + Self::WorkspaceLockConflict(_inner) => + ::std::option::Option::Some(_inner) + , Self::InternalServerError(_inner) => ::std::option::Option::Some(_inner) , @@ -276,6 +286,9 @@ impl ::std::fmt::Display for UpdateDefaultConfigError { Self::WebhookFailed(_inner) => _inner.fmt(f) , + Self::WorkspaceLockConflict(_inner) => + _inner.fmt(f) + , Self::InternalServerError(_inner) => _inner.fmt(f) , @@ -306,6 +319,9 @@ impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for UpdateDefault Self::WebhookFailed(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner) , + Self::WorkspaceLockConflict(_inner) => + ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner) + , Self::InternalServerError(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner) , 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..dc80b53c0 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, + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub workspace_lock: ::std::option::Option, } 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 } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn workspace_lock(&self) -> ::std::option::Option<&crate::types::WorkspaceLock> { + self.workspace_lock.as_ref() + } } 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) workspace_lock: ::std::option::Option, } impl UpdateWorkspaceOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -382,6 +389,19 @@ impl UpdateWorkspaceOutputBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn workspace_lock(mut self, input: crate::types::WorkspaceLock) -> Self { + self.workspace_lock = ::std::option::Option::Some(input); + self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn set_workspace_lock(mut self, input: ::std::option::Option) -> Self { + self.workspace_lock = input; self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn get_workspace_lock(&self) -> &::std::option::Option { + &self.workspace_lock + } /// 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) @@ -481,6 +501,8 @@ 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") )? , + workspace_lock: self.workspace_lock + , } ) } diff --git a/crates/superposition_sdk/src/protocol_serde.rs b/crates/superposition_sdk/src/protocol_serde.rs index b4dea9215..672cb0a8f 100644 --- a/crates/superposition_sdk/src/protocol_serde.rs +++ b/crates/superposition_sdk/src/protocol_serde.rs @@ -313,6 +313,8 @@ pub(crate) mod shape_validate_context_input; pub(crate) mod shape_webhook_failed; +pub(crate) mod shape_workspace_lock_conflict; + pub(crate) mod shape_audit_log_list; pub(crate) mod shape_buckets; @@ -391,6 +393,8 @@ pub(crate) mod shape_weight_recompute_responses; pub(crate) mod shape_workspace_list; +pub(crate) mod shape_workspace_lock; + pub(crate) mod shape_audit_log_full; pub(crate) mod shape_bucket; diff --git a/crates/superposition_sdk/src/protocol_serde/shape_create_default_config.rs b/crates/superposition_sdk/src/protocol_serde/shape_create_default_config.rs index 42034fdb9..8eff01c8b 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_create_default_config.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_create_default_config.rs @@ -27,6 +27,19 @@ pub fn de_create_default_config_http_error(_response_status: u16, _response_head } tmp }), + "WorkspaceLockConflict" => crate::operation::create_default_config::CreateDefaultConfigError::WorkspaceLockConflict({ + #[allow(unused_mut)] + let mut tmp = + { + #[allow(unused_mut)] + let mut output = crate::types::error::builders::WorkspaceLockConflictBuilder::default(); + output = crate::protocol_serde::shape_workspace_lock_conflict::de_workspace_lock_conflict_json_err(_response_body, output).map_err(crate::operation::create_default_config::CreateDefaultConfigError::unhandled)?; + let output = output.meta(generic); + crate::serde_util::workspace_lock_conflict_correct_errors(output).build().map_err(crate::operation::create_default_config::CreateDefaultConfigError::unhandled)? + } + ; + tmp + }), "InternalServerError" => crate::operation::create_default_config::CreateDefaultConfigError::InternalServerError({ #[allow(unused_mut)] let mut tmp = 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..36b35d284 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_create_workspace.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_create_workspace.rs @@ -171,6 +171,11 @@ pub(crate) fn de_create_workspace(value: &[u8], mut builder: crate::operation::c ).transpose()? ); } + "workspace_lock" => { + builder = builder.set_workspace_lock( + crate::protocol_serde::shape_workspace_lock::de_workspace_lock(tokens)? + ); + } "workspace_name" => { builder = builder.set_workspace_name( ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| diff --git a/crates/superposition_sdk/src/protocol_serde/shape_delete_default_config.rs b/crates/superposition_sdk/src/protocol_serde/shape_delete_default_config.rs index 787bc641f..49405eda5 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_delete_default_config.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_delete_default_config.rs @@ -43,6 +43,19 @@ pub fn de_delete_default_config_http_error(_response_status: u16, _response_head } tmp }), + "WorkspaceLockConflict" => crate::operation::delete_default_config::DeleteDefaultConfigError::WorkspaceLockConflict({ + #[allow(unused_mut)] + let mut tmp = + { + #[allow(unused_mut)] + let mut output = crate::types::error::builders::WorkspaceLockConflictBuilder::default(); + output = crate::protocol_serde::shape_workspace_lock_conflict::de_workspace_lock_conflict_json_err(_response_body, output).map_err(crate::operation::delete_default_config::DeleteDefaultConfigError::unhandled)?; + let output = output.meta(generic); + crate::serde_util::workspace_lock_conflict_correct_errors(output).build().map_err(crate::operation::delete_default_config::DeleteDefaultConfigError::unhandled)? + } + ; + tmp + }), "InternalServerError" => crate::operation::delete_default_config::DeleteDefaultConfigError::InternalServerError({ #[allow(unused_mut)] let mut tmp = 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..264e6ea67 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_get_workspace.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_get_workspace.rs @@ -179,6 +179,11 @@ pub(crate) fn de_get_workspace(value: &[u8], mut builder: crate::operation::get_ ).transpose()? ); } + "workspace_lock" => { + builder = builder.set_workspace_lock( + crate::protocol_serde::shape_workspace_lock::de_workspace_lock(tokens)? + ); + } "workspace_name" => { builder = builder.set_workspace_name( ::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..e56e05db2 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 @@ -179,6 +179,11 @@ pub(crate) fn de_migrate_workspace_schema(value: &[u8], mut builder: crate::oper ).transpose()? ); } + "workspace_lock" => { + builder = builder.set_workspace_lock( + crate::protocol_serde::shape_workspace_lock::de_workspace_lock(tokens)? + ); + } "workspace_name" => { builder = builder.set_workspace_name( ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| diff --git a/crates/superposition_sdk/src/protocol_serde/shape_update_default_config.rs b/crates/superposition_sdk/src/protocol_serde/shape_update_default_config.rs index 98388769f..dea9e600a 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_update_default_config.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_update_default_config.rs @@ -43,6 +43,19 @@ pub fn de_update_default_config_http_error(_response_status: u16, _response_head } tmp }), + "WorkspaceLockConflict" => crate::operation::update_default_config::UpdateDefaultConfigError::WorkspaceLockConflict({ + #[allow(unused_mut)] + let mut tmp = + { + #[allow(unused_mut)] + let mut output = crate::types::error::builders::WorkspaceLockConflictBuilder::default(); + output = crate::protocol_serde::shape_workspace_lock_conflict::de_workspace_lock_conflict_json_err(_response_body, output).map_err(crate::operation::update_default_config::UpdateDefaultConfigError::unhandled)?; + let output = output.meta(generic); + crate::serde_util::workspace_lock_conflict_correct_errors(output).build().map_err(crate::operation::update_default_config::UpdateDefaultConfigError::unhandled)? + } + ; + tmp + }), "InternalServerError" => crate::operation::update_default_config::UpdateDefaultConfigError::InternalServerError({ #[allow(unused_mut)] let mut tmp = 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..959a06d90 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_update_workspace.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_update_workspace.rs @@ -187,6 +187,11 @@ pub(crate) fn de_update_workspace(value: &[u8], mut builder: crate::operation::u ).transpose()? ); } + "workspace_lock" => { + builder = builder.set_workspace_lock( + crate::protocol_serde::shape_workspace_lock::de_workspace_lock(tokens)? + ); + } "workspace_name" => { builder = builder.set_workspace_name( ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| diff --git a/crates/superposition_sdk/src/protocol_serde/shape_workspace_lock.rs b/crates/superposition_sdk/src/protocol_serde/shape_workspace_lock.rs new file mode 100644 index 000000000..e34990a3a --- /dev/null +++ b/crates/superposition_sdk/src/protocol_serde/shape_workspace_lock.rs @@ -0,0 +1,64 @@ +// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT. +pub(crate) fn de_workspace_lock<'a, I>(tokens: &mut ::std::iter::Peekable) -> ::std::result::Result, ::aws_smithy_json::deserialize::error::DeserializeError> + where I: Iterator, ::aws_smithy_json::deserialize::error::DeserializeError>> { + match tokens.next().transpose()? { + Some(::aws_smithy_json::deserialize::Token::ValueNull { .. }) => Ok(None), + Some(::aws_smithy_json::deserialize::Token::StartObject { .. }) => { + #[allow(unused_mut)] + let mut builder = crate::types::builders::WorkspaceLockBuilder::default(); + loop { + match tokens.next().transpose()? { + Some(::aws_smithy_json::deserialize::Token::EndObject { .. }) => break, + Some(::aws_smithy_json::deserialize::Token::ObjectKey { key, .. }) => { + match key.to_unescaped()?.as_ref() { + "lock_id" => { + builder = builder.set_lock_id( + ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| + s.to_unescaped().map(|u| + u.into_owned() + ) + ).transpose()? + ); + } + "operation" => { + builder = builder.set_operation( + ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| + s.to_unescaped().map(|u| + u.into_owned() + ) + ).transpose()? + ); + } + "locked_by" => { + builder = builder.set_locked_by( + ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| + s.to_unescaped().map(|u| + u.into_owned() + ) + ).transpose()? + ); + } + "acquired_at" => { + builder = builder.set_acquired_at( + ::aws_smithy_json::deserialize::token::expect_timestamp_or_null(tokens.next(), ::aws_smithy_types::date_time::Format::DateTimeWithOffset)? + ); + } + "expires_at" => { + builder = builder.set_expires_at( + ::aws_smithy_json::deserialize::token::expect_timestamp_or_null(tokens.next(), ::aws_smithy_types::date_time::Format::DateTimeWithOffset)? + ); + } + _ => ::aws_smithy_json::deserialize::token::skip_value(tokens)? + } + } + other => return Err(::aws_smithy_json::deserialize::error::DeserializeError::custom(format!("expected object key or end object, found: {:?}", other))) + } + } + Ok(Some(crate::serde_util::workspace_lock_correct_errors(builder).build().map_err(|err|::aws_smithy_json::deserialize::error::DeserializeError::custom_source("Response was invalid", err))?)) + } + _ => { + Err(::aws_smithy_json::deserialize::error::DeserializeError::custom("expected start object or null")) + } + } +} + diff --git a/crates/superposition_sdk/src/protocol_serde/shape_workspace_lock_conflict.rs b/crates/superposition_sdk/src/protocol_serde/shape_workspace_lock_conflict.rs new file mode 100644 index 000000000..3d060ef25 --- /dev/null +++ b/crates/superposition_sdk/src/protocol_serde/shape_workspace_lock_conflict.rs @@ -0,0 +1,36 @@ +// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT. +pub(crate) fn de_workspace_lock_conflict_json_err(value: &[u8], mut builder: crate::types::error::builders::WorkspaceLockConflictBuilder) -> ::std::result::Result { + let mut tokens_owned = ::aws_smithy_json::deserialize::json_token_iter(crate::protocol_serde::or_empty_doc(value)).peekable(); + let tokens = &mut tokens_owned; + ::aws_smithy_json::deserialize::token::expect_start_object(tokens.next())?; + loop { + match tokens.next().transpose()? { + Some(::aws_smithy_json::deserialize::Token::EndObject { .. }) => break, + Some(::aws_smithy_json::deserialize::Token::ObjectKey { key, .. }) => { + match key.to_unescaped()?.as_ref() { + "message" => { + builder = builder.set_message( + ::aws_smithy_json::deserialize::token::expect_string_or_null(tokens.next())?.map(|s| + s.to_unescaped().map(|u| + u.into_owned() + ) + ).transpose()? + ); + } + "lock" => { + builder = builder.set_lock( + crate::protocol_serde::shape_workspace_lock::de_workspace_lock(tokens)? + ); + } + _ => ::aws_smithy_json::deserialize::token::skip_value(tokens)? + } + } + other => return Err(::aws_smithy_json::deserialize::error::DeserializeError::custom(format!("expected object key or end object, found: {:?}", other))) + } + } + if tokens.next().is_some() { + return Err(::aws_smithy_json::deserialize::error::DeserializeError::custom("found more JSON tokens after completing parsing")); + } + Ok(builder) +} + 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..e3aafba8d 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,11 @@ pub(crate) fn de_workspace_response<'a, I>(tokens: &mut ::std::iter::Peekable ::aws_smithy_json::deserialize::token::expect_bool_or_null(tokens.next())? ); } + "workspace_lock" => { + builder = builder.set_workspace_lock( + crate::protocol_serde::shape_workspace_lock::de_workspace_lock(tokens)? + ); + } _ => ::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 329ebfb59..376b4ad42 100644 --- a/crates/superposition_sdk/src/serde_util.rs +++ b/crates/superposition_sdk/src/serde_util.rs @@ -65,6 +65,12 @@ if builder.last_modified_by.is_none() { builder.last_modified_by = Some(Default: builder } +pub(crate) fn workspace_lock_conflict_correct_errors(mut builder: crate::types::error::builders::WorkspaceLockConflictBuilder) -> crate::types::error::builders::WorkspaceLockConflictBuilder { + if builder.message.is_none() { builder.message = Some(Default::default()) } +if builder.lock.is_none() { builder.lock = { let builder = crate::types::builders::WorkspaceLockBuilder::default(); crate::serde_util::workspace_lock_correct_errors(builder).build().ok() } } + builder + } + pub(crate) fn create_default_config_output_output_correct_errors(mut builder: crate::operation::create_default_config::builders::CreateDefaultConfigOutputBuilder) -> crate::operation::create_default_config::builders::CreateDefaultConfigOutputBuilder { if builder.key.is_none() { builder.key = Some(Default::default()) } if builder.value.is_none() { builder.value = Some(Default::default()) } @@ -972,6 +978,15 @@ if builder.enable_change_reason_validation.is_none() { builder.enable_change_rea builder } +pub(crate) fn workspace_lock_correct_errors(mut builder: crate::types::builders::WorkspaceLockBuilder) -> crate::types::builders::WorkspaceLockBuilder { + if builder.lock_id.is_none() { builder.lock_id = Some(Default::default()) } +if builder.operation.is_none() { builder.operation = Some(Default::default()) } +if builder.locked_by.is_none() { builder.locked_by = Some(Default::default()) } +if builder.acquired_at.is_none() { builder.acquired_at = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } +if builder.expires_at.is_none() { builder.expires_at = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } + builder + } + pub(crate) fn config_data_correct_errors(mut builder: crate::types::builders::ConfigDataBuilder) -> crate::types::builders::ConfigDataBuilder { if builder.contexts.is_none() { builder.contexts = Some(Default::default()) } if builder.overrides.is_none() { builder.overrides = Some(Default::default()) } diff --git a/crates/superposition_sdk/src/types.rs b/crates/superposition_sdk/src/types.rs index 6eaf162dc..ab86a1b3b 100644 --- a/crates/superposition_sdk/src/types.rs +++ b/crates/superposition_sdk/src/types.rs @@ -35,6 +35,8 @@ pub use crate::types::_http_method::HttpMethod; pub use crate::types::_webhook_response::WebhookResponse; +pub use crate::types::_workspace_lock::WorkspaceLock; + pub use crate::types::_workspace_status::WorkspaceStatus; pub use crate::types::_workspace_response::WorkspaceResponse; @@ -215,6 +217,8 @@ mod _webhook_response; mod _weight_recompute_response; +mod _workspace_lock; + mod _workspace_response; mod _workspace_status; diff --git a/crates/superposition_sdk/src/types/_workspace_lock.rs b/crates/superposition_sdk/src/types/_workspace_lock.rs new file mode 100644 index 000000000..d57dc2e24 --- /dev/null +++ b/crates/superposition_sdk/src/types/_workspace_lock.rs @@ -0,0 +1,167 @@ +// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT. + +/// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. +#[non_exhaustive] +#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::fmt::Debug)] +pub struct WorkspaceLock { + /// Unique identifier for the active workspace lock. + pub lock_id: ::std::string::String, + /// Write operation that currently holds the workspace lock. + pub operation: ::std::string::String, + /// User that acquired the workspace lock. + pub locked_by: ::std::string::String, + /// Timestamp at which the workspace lock was acquired. + pub acquired_at: ::aws_smithy_types::DateTime, + /// Timestamp at which the workspace lock expires if it is not released first. + pub expires_at: ::aws_smithy_types::DateTime, +} +impl WorkspaceLock { + /// Unique identifier for the active workspace lock. + pub fn lock_id(&self) -> &str { + use std::ops::Deref; self.lock_id.deref() + } + /// Write operation that currently holds the workspace lock. + pub fn operation(&self) -> &str { + use std::ops::Deref; self.operation.deref() + } + /// User that acquired the workspace lock. + pub fn locked_by(&self) -> &str { + use std::ops::Deref; self.locked_by.deref() + } + /// Timestamp at which the workspace lock was acquired. + pub fn acquired_at(&self) -> &::aws_smithy_types::DateTime { + &self.acquired_at + } + /// Timestamp at which the workspace lock expires if it is not released first. + pub fn expires_at(&self) -> &::aws_smithy_types::DateTime { + &self.expires_at + } +} +impl WorkspaceLock { + /// Creates a new builder-style object to manufacture [`WorkspaceLock`](crate::types::WorkspaceLock). + pub fn builder() -> crate::types::builders::WorkspaceLockBuilder { + crate::types::builders::WorkspaceLockBuilder::default() + } +} + +/// A builder for [`WorkspaceLock`](crate::types::WorkspaceLock). +#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::default::Default, ::std::fmt::Debug)] +#[non_exhaustive] +pub struct WorkspaceLockBuilder { + pub(crate) lock_id: ::std::option::Option<::std::string::String>, + pub(crate) operation: ::std::option::Option<::std::string::String>, + pub(crate) locked_by: ::std::option::Option<::std::string::String>, + pub(crate) acquired_at: ::std::option::Option<::aws_smithy_types::DateTime>, + pub(crate) expires_at: ::std::option::Option<::aws_smithy_types::DateTime>, +} +impl WorkspaceLockBuilder { + /// Unique identifier for the active workspace lock. + /// This field is required. + pub fn lock_id(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.lock_id = ::std::option::Option::Some(input.into()); + self + } + /// Unique identifier for the active workspace lock. + pub fn set_lock_id(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.lock_id = input; self + } + /// Unique identifier for the active workspace lock. + pub fn get_lock_id(&self) -> &::std::option::Option<::std::string::String> { + &self.lock_id + } + /// Write operation that currently holds the workspace lock. + /// This field is required. + pub fn operation(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.operation = ::std::option::Option::Some(input.into()); + self + } + /// Write operation that currently holds the workspace lock. + pub fn set_operation(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.operation = input; self + } + /// Write operation that currently holds the workspace lock. + pub fn get_operation(&self) -> &::std::option::Option<::std::string::String> { + &self.operation + } + /// User that acquired the workspace lock. + /// This field is required. + pub fn locked_by(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.locked_by = ::std::option::Option::Some(input.into()); + self + } + /// User that acquired the workspace lock. + pub fn set_locked_by(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.locked_by = input; self + } + /// User that acquired the workspace lock. + pub fn get_locked_by(&self) -> &::std::option::Option<::std::string::String> { + &self.locked_by + } + /// Timestamp at which the workspace lock was acquired. + /// This field is required. + pub fn acquired_at(mut self, input: ::aws_smithy_types::DateTime) -> Self { + self.acquired_at = ::std::option::Option::Some(input); + self + } + /// Timestamp at which the workspace lock was acquired. + pub fn set_acquired_at(mut self, input: ::std::option::Option<::aws_smithy_types::DateTime>) -> Self { + self.acquired_at = input; self + } + /// Timestamp at which the workspace lock was acquired. + pub fn get_acquired_at(&self) -> &::std::option::Option<::aws_smithy_types::DateTime> { + &self.acquired_at + } + /// Timestamp at which the workspace lock expires if it is not released first. + /// This field is required. + pub fn expires_at(mut self, input: ::aws_smithy_types::DateTime) -> Self { + self.expires_at = ::std::option::Option::Some(input); + self + } + /// Timestamp at which the workspace lock expires if it is not released first. + pub fn set_expires_at(mut self, input: ::std::option::Option<::aws_smithy_types::DateTime>) -> Self { + self.expires_at = input; self + } + /// Timestamp at which the workspace lock expires if it is not released first. + pub fn get_expires_at(&self) -> &::std::option::Option<::aws_smithy_types::DateTime> { + &self.expires_at + } + /// Consumes the builder and constructs a [`WorkspaceLock`](crate::types::WorkspaceLock). + /// This method will fail if any of the following fields are not set: + /// - [`lock_id`](crate::types::builders::WorkspaceLockBuilder::lock_id) + /// - [`operation`](crate::types::builders::WorkspaceLockBuilder::operation) + /// - [`locked_by`](crate::types::builders::WorkspaceLockBuilder::locked_by) + /// - [`acquired_at`](crate::types::builders::WorkspaceLockBuilder::acquired_at) + /// - [`expires_at`](crate::types::builders::WorkspaceLockBuilder::expires_at) + pub fn build(self) -> ::std::result::Result { + ::std::result::Result::Ok( + crate::types::WorkspaceLock { + lock_id: self.lock_id + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("lock_id", "lock_id was not specified but it is required when building WorkspaceLock") + )? + , + operation: self.operation + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("operation", "operation was not specified but it is required when building WorkspaceLock") + )? + , + locked_by: self.locked_by + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("locked_by", "locked_by was not specified but it is required when building WorkspaceLock") + )? + , + acquired_at: self.acquired_at + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("acquired_at", "acquired_at was not specified but it is required when building WorkspaceLock") + )? + , + expires_at: self.expires_at + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("expires_at", "expires_at was not specified but it is required when building WorkspaceLock") + )? + , + } + ) + } +} + diff --git a/crates/superposition_sdk/src/types/_workspace_response.rs b/crates/superposition_sdk/src/types/_workspace_response.rs index acf8585a4..2187bd8f2 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, + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub workspace_lock: ::std::option::Option, } 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 } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn workspace_lock(&self) -> ::std::option::Option<&crate::types::WorkspaceLock> { + self.workspace_lock.as_ref() + } } 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) workspace_lock: ::std::option::Option, } impl WorkspaceResponseBuilder { #[allow(missing_docs)] // documentation missing in model @@ -382,6 +389,19 @@ impl WorkspaceResponseBuilder { pub fn get_enable_change_reason_validation(&self) -> &::std::option::Option { &self.enable_change_reason_validation } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn workspace_lock(mut self, input: crate::types::WorkspaceLock) -> Self { + self.workspace_lock = ::std::option::Option::Some(input); + self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn set_workspace_lock(mut self, input: ::std::option::Option) -> Self { + self.workspace_lock = input; self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn get_workspace_lock(&self) -> &::std::option::Option { + &self.workspace_lock + } /// 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) @@ -481,6 +501,8 @@ 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") )? , + workspace_lock: self.workspace_lock + , } ) } diff --git a/crates/superposition_sdk/src/types/builders.rs b/crates/superposition_sdk/src/types/builders.rs index 5d03cd187..dae88f227 100644 --- a/crates/superposition_sdk/src/types/builders.rs +++ b/crates/superposition_sdk/src/types/builders.rs @@ -13,6 +13,8 @@ pub use crate::types::_variant::VariantBuilder; pub use crate::types::_webhook_response::WebhookResponseBuilder; +pub use crate::types::_workspace_lock::WorkspaceLockBuilder; + pub use crate::types::_workspace_response::WorkspaceResponseBuilder; pub use crate::types::_type_templates_response::TypeTemplatesResponseBuilder; diff --git a/crates/superposition_sdk/src/types/error.rs b/crates/superposition_sdk/src/types/error.rs index 1927b09bc..a51ce3dae 100644 --- a/crates/superposition_sdk/src/types/error.rs +++ b/crates/superposition_sdk/src/types/error.rs @@ -5,12 +5,16 @@ pub use crate::types::error::_resource_not_found::ResourceNotFound; pub use crate::types::error::_webhook_failed::WebhookFailed; +pub use crate::types::error::_workspace_lock_conflict::WorkspaceLockConflict; + mod _internal_server_error; mod _resource_not_found; mod _webhook_failed; +mod _workspace_lock_conflict; + /// Builders pub mod builders; diff --git a/crates/superposition_sdk/src/types/error/_workspace_lock_conflict.rs b/crates/superposition_sdk/src/types/error/_workspace_lock_conflict.rs new file mode 100644 index 000000000..0099d9c03 --- /dev/null +++ b/crates/superposition_sdk/src/types/error/_workspace_lock_conflict.rs @@ -0,0 +1,113 @@ +// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT. + +/// Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock. +#[non_exhaustive] +#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::fmt::Debug)] +pub struct WorkspaceLockConflict { + #[allow(missing_docs)] // documentation missing in model + pub message: ::std::string::String, + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub lock: crate::types::WorkspaceLock, + pub(crate) meta: ::aws_smithy_types::error::ErrorMetadata, +} +impl WorkspaceLockConflict { + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn lock(&self) -> &crate::types::WorkspaceLock { + &self.lock + } +} +impl WorkspaceLockConflict { + /// Returns the error message. + pub fn message(&self) -> &str { &self.message } +} +impl ::std::fmt::Display for WorkspaceLockConflict { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + ::std::write!(f, "WorkspaceLockConflict")?; + { + ::std::write!(f, ": {}", &self.message)?; + } + Ok(()) + } +} +impl ::std::error::Error for WorkspaceLockConflict {} +impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for WorkspaceLockConflict { + fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata { &self.meta } +} +impl WorkspaceLockConflict { + /// Creates a new builder-style object to manufacture [`WorkspaceLockConflict`](crate::types::error::WorkspaceLockConflict). + pub fn builder() -> crate::types::error::builders::WorkspaceLockConflictBuilder { + crate::types::error::builders::WorkspaceLockConflictBuilder::default() + } +} + +/// A builder for [`WorkspaceLockConflict`](crate::types::error::WorkspaceLockConflict). +#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::default::Default, ::std::fmt::Debug)] +#[non_exhaustive] +pub struct WorkspaceLockConflictBuilder { + pub(crate) message: ::std::option::Option<::std::string::String>, + pub(crate) lock: ::std::option::Option, + meta: std::option::Option<::aws_smithy_types::error::ErrorMetadata>, +} +impl WorkspaceLockConflictBuilder { + #[allow(missing_docs)] // documentation missing in model + /// This field is required. + pub fn message(mut self, input: impl ::std::convert::Into<::std::string::String>) -> Self { + self.message = ::std::option::Option::Some(input.into()); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn set_message(mut self, input: ::std::option::Option<::std::string::String>) -> Self { + self.message = input; self + } + #[allow(missing_docs)] // documentation missing in model + pub fn get_message(&self) -> &::std::option::Option<::std::string::String> { + &self.message + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + /// This field is required. + pub fn lock(mut self, input: crate::types::WorkspaceLock) -> Self { + self.lock = ::std::option::Option::Some(input); + self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn set_lock(mut self, input: ::std::option::Option) -> Self { + self.lock = input; self + } + /// Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease. + pub fn get_lock(&self) -> &::std::option::Option { + &self.lock + } + /// Sets error metadata + pub fn meta(mut self, meta: ::aws_smithy_types::error::ErrorMetadata) -> Self { + self.meta = Some(meta); + self + } + + /// Sets error metadata + pub fn set_meta(&mut self, meta: std::option::Option<::aws_smithy_types::error::ErrorMetadata>) -> &mut Self { + self.meta = meta; + self + } + /// Consumes the builder and constructs a [`WorkspaceLockConflict`](crate::types::error::WorkspaceLockConflict). + /// This method will fail if any of the following fields are not set: + /// - [`message`](crate::types::error::builders::WorkspaceLockConflictBuilder::message) + /// - [`lock`](crate::types::error::builders::WorkspaceLockConflictBuilder::lock) + pub fn build(self) -> ::std::result::Result { + ::std::result::Result::Ok( + crate::types::error::WorkspaceLockConflict { + message: self.message + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("message", "message was not specified but it is required when building WorkspaceLockConflict") + )? + , + lock: self.lock + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("lock", "lock was not specified but it is required when building WorkspaceLockConflict") + )? + , + meta: self.meta.unwrap_or_default(), + } + ) + } +} + diff --git a/crates/superposition_sdk/src/types/error/builders.rs b/crates/superposition_sdk/src/types/error/builders.rs index 98f8da3bb..b1f14d13f 100644 --- a/crates/superposition_sdk/src/types/error/builders.rs +++ b/crates/superposition_sdk/src/types/error/builders.rs @@ -5,3 +5,5 @@ pub use crate::types::error::_resource_not_found::ResourceNotFoundBuilder; pub use crate::types::error::_webhook_failed::WebhookFailedBuilder; +pub use crate::types::error::_workspace_lock_conflict::WorkspaceLockConflictBuilder; + diff --git a/docs/docs/api/Superposition.openapi.json b/docs/docs/api/Superposition.openapi.json index bde380748..7fea053b7 100644 --- a/docs/docs/api/Superposition.openapi.json +++ b/docs/docs/api/Superposition.openapi.json @@ -1447,6 +1447,16 @@ } } }, + "409": { + "description": "WorkspaceLockConflict 409 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceLockConflictResponseContent" + } + } + } + }, "500": { "description": "InternalServerError 500 response", "content": { @@ -1510,6 +1520,16 @@ "404": { "description": "ResourceNotFound 404 response" }, + "409": { + "description": "WorkspaceLockConflict 409 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceLockConflictResponseContent" + } + } + } + }, "500": { "description": "InternalServerError 500 response", "content": { @@ -1646,6 +1666,16 @@ "404": { "description": "ResourceNotFound 404 response" }, + "409": { + "description": "WorkspaceLockConflict 409 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceLockConflictResponseContent" + } + } + } + }, "500": { "description": "InternalServerError 500 response", "content": { @@ -7908,6 +7938,9 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "workspace_lock": { + "$ref": "#/components/schemas/WorkspaceLock" } }, "required": [ @@ -9705,6 +9738,9 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "workspace_lock": { + "$ref": "#/components/schemas/WorkspaceLock" } }, "required": [ @@ -10147,6 +10183,9 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "workspace_lock": { + "$ref": "#/components/schemas/WorkspaceLock" } }, "required": [ @@ -11896,6 +11935,9 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "workspace_lock": { + "$ref": "#/components/schemas/WorkspaceLock" } }, "required": [ @@ -12188,6 +12230,57 @@ } } }, + "WorkspaceLock": { + "type": "object", + "description": "Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease.", + "properties": { + "lock_id": { + "type": "string", + "description": "Unique identifier for the active workspace lock." + }, + "operation": { + "type": "string", + "description": "Write operation that currently holds the workspace lock." + }, + "locked_by": { + "type": "string", + "description": "User that acquired the workspace lock." + }, + "acquired_at": { + "type": "string", + "description": "Timestamp at which the workspace lock was acquired.", + "format": "date-time" + }, + "expires_at": { + "type": "string", + "description": "Timestamp at which the workspace lock expires if it is not released first.", + "format": "date-time" + } + }, + "required": [ + "acquired_at", + "expires_at", + "lock_id", + "locked_by", + "operation" + ] + }, + "WorkspaceLockConflictResponseContent": { + "type": "object", + "description": "Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock.", + "properties": { + "message": { + "type": "string" + }, + "lock": { + "$ref": "#/components/schemas/WorkspaceLock" + } + }, + "required": [ + "lock", + "message" + ] + }, "WorkspaceResponse": { "type": "object", "properties": { @@ -12244,6 +12337,9 @@ }, "enable_change_reason_validation": { "type": "boolean" + }, + "workspace_lock": { + "$ref": "#/components/schemas/WorkspaceLock" } }, "required": [ diff --git a/docs/docs/api/create-default-config.StatusCodes.json b/docs/docs/api/create-default-config.StatusCodes.json index a91df2afc..7b7b9cd21 100644 --- a/docs/docs/api/create-default-config.StatusCodes.json +++ b/docs/docs/api/create-default-config.StatusCodes.json @@ -1 +1 @@ -{"responses":{"200":{"description":"CreateDefaultConfig 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string"},"value":{},"schema":{"type":"object","additionalProperties":{},"description":"Generic key-value object structure used for flexible data representation throughout the API.","title":"Object"},"description":{"type":"string"},"change_reason":{"type":"string"},"value_validation_function_name":{"type":"string"},"value_compute_function_name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"last_modified_by":{"type":"string"}},"required":["change_reason","created_at","created_by","description","key","last_modified_at","last_modified_by","schema","value"],"title":"CreateDefaultConfigResponseContent"}}}},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}},"512":{"description":"WebhookFailed 512 response","content":{"application/json":{"schema":{"type":"object","description":"Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete.","properties":{"data":{"description":"The successful operation result that would have been returned with HTTP 200, serialized as an untyped/raw JSON document. The structure logically corresponds to the operation's normal output type, but is modeled as Document since this single error is shared across multiple operations with different output shapes."}},"required":["data"],"title":"WebhookFailedResponseContent"}}}}}} \ No newline at end of file +{"responses":{"200":{"description":"CreateDefaultConfig 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string"},"value":{},"schema":{"type":"object","additionalProperties":{},"description":"Generic key-value object structure used for flexible data representation throughout the API.","title":"Object"},"description":{"type":"string"},"change_reason":{"type":"string"},"value_validation_function_name":{"type":"string"},"value_compute_function_name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"last_modified_by":{"type":"string"}},"required":["change_reason","created_at","created_by","description","key","last_modified_at","last_modified_by","schema","value"],"title":"CreateDefaultConfigResponseContent"}}}},"409":{"description":"WorkspaceLockConflict 409 response","content":{"application/json":{"schema":{"type":"object","description":"Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock.","properties":{"message":{"type":"string"},"lock":{"type":"object","description":"Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease.","properties":{"lock_id":{"type":"string","description":"Unique identifier for the active workspace lock."},"operation":{"type":"string","description":"Write operation that currently holds the workspace lock."},"locked_by":{"type":"string","description":"User that acquired the workspace lock."},"acquired_at":{"type":"string","description":"Timestamp at which the workspace lock was acquired.","format":"date-time"},"expires_at":{"type":"string","description":"Timestamp at which the workspace lock expires if it is not released first.","format":"date-time"}},"required":["acquired_at","expires_at","lock_id","locked_by","operation"],"title":"WorkspaceLock"}},"required":["lock","message"],"title":"WorkspaceLockConflictResponseContent"}}}},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}},"512":{"description":"WebhookFailed 512 response","content":{"application/json":{"schema":{"type":"object","description":"Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete.","properties":{"data":{"description":"The successful operation result that would have been returned with HTTP 200, serialized as an untyped/raw JSON document. The structure logically corresponds to the operation's normal output type, but is modeled as Document since this single error is shared across multiple operations with different output shapes."}},"required":["data"],"title":"WebhookFailedResponseContent"}}}}}} \ No newline at end of file diff --git a/docs/docs/api/create-default-config.api.mdx b/docs/docs/api/create-default-config.api.mdx index 2a0f83b44..ef38ce771 100644 --- a/docs/docs/api/create-default-config.api.mdx +++ b/docs/docs/api/create-default-config.api.mdx @@ -5,7 +5,7 @@ description: "Creates a new default config entry with specified key, value, sche sidebar_label: "CreateDefaultConfig" hide_title: true hide_table_of_contents: true -api: eJztV01v4zYQ/SuELm0B20lT5LK3bHbbpocmSFz0EAQBRY0tbiRRJal1XMP/fd+Qsi3ZsreLdoEWaA6JIs7Hm+G8mdEqycgpq2uvTZW8Sa4tSU9OSFHRQmQ0k03hhTLVTM8FVd4uxUL7XLialJ5pysQLLUfioywaGgmncirlSMgqEyV5mUkvJ+Jdz4oTjuxHEtKJmSyKVKqXqO7EIqdKVGZjXLGGp1cvSulh2U2SUWJqspLB3mRbuK2D62AfMpb+gDn/1mTL5M0qCVYqz4+yrgutgv7ZB8cRr5IImp/8siYYNekHUh52asvevCbHpwi0I+S81dU8WY+SAB4neDxuSmaZZq+yuOsahU4//z9RRRaRw9k4GBbRhIC/RvnGkmgcsj4zVswKetVpQYLTLCzVlhziDNEJn1vTzHPTeDySuLq74ex57QvGdRtx7bsfiE7lsprTM/LsjkgEmM/4rbPg+nnWVCo8VLKkEyrKlHXj6bPy63ij2hKu/HEPUT+CUbil7UVsLudpF/lAxdzHcrluy2Tdd4i8E17U0gKdJ4tre1wlEWryOjZ2PtYZPGm+vpxkRjYZqIRd8PumO8YWxr64Wir6G/ae+I2rTeVi2V6cn/OfIZr3siAgKDaa8Pg/a/7brAGIcMnZs/SHx6MEuSj5JIF/GnsNIx2ddPjWCun8c2my0Pq/yHBfc9D8Z3jeCaeHc7gDHCAdgPDFfSKSo9MoAPlyiF83kLAo2wcedfa9tSi8y6/Cr5Kck/MjbXMTzACcI8F8f3EYzO+U5sa8/Ch1AQ5B5B8JYz9hGatiCfC5jOTbTnrhGqWIMjhPW2IuIiShsEFgjWBgEzHFwQaZSDH8w/4gdeWCTrDi3KwpWAq3OtqaU4VGDMKB+AWcYDlZSPSMAGXjqjKed5KIKNMZvxBMxgJTYXJwL9xdDlM57ePYhRgRtR4DilxiSUqJ+AwdrEL0YfP6eTq941494j1Ko3/8iRMsU7ISTcVJzs6sXIhfHm5/FZlRTYnIYm52zbAwc82p4wzZmLIMSTL9vH/jECO4DJyNrzlVsB6Tpp0AkaiIrt+1boTTleK04RiPczRZCqXP/+fIKKSVNQ7KCFYjcztnLkYHcs7Isq3WJ/Rq3vz2u0PIb4evvSIdKm6mg5zz9E42C2mkdRMBsDEM+NzwXlkbF6gmfY7/zto9eKw2G6Yj1Vjtl2EXcCWQLyey1pPc+/qtdFpdNaz5+MTjff+ckAm7FXjaWXtgssTyOW5zyyR+f8CjUB1BWkiII/i2ZDfNjjVTPuemfALZX3ETxE/5CQLh6rgf3O/W8vevkomzXRB202NoLziY91vpvTm7Z+bEeN2XPDJVO6NPVzMT0tIW3EOD0kWd6DZqNFYX0V2cX1yOz38Yn1+yHpdSKUMzbG3G0SL6Vbif4s5ny7//o6wtFX59VhfouBx4YwsOI3IIhO1zCGWfM8lwslqhIOk3W6zX/BpFYplYT3w36HApp5uZtNmGmXOZdnwArgKvoxPJ+/a+7RrfiWNIYwl2dvm2CJOE6ftVXHU3/Z63KNA2rvGUbewkDibsTuMKQ6X2J2W7De7u9mEK4bT9ROZmjrcYHPz5jN9Aw9/aoTOzQHi3wgpVzZuwbiTRJv98Ars1xXs= +api: eJztWE1v4zYQ/SuELm0B20nT5tC9ZT/apmi7QeLFHhZBQEtjixtZVEkqjjfwf+8bUrIkS0p20Q3QAs0hUcThzJvhvOGMHqKEbGxU4ZTOoxfRK0PSkRVS5LQRCS1lmTkR63ypVoJyZ7Zio1wqbEGxWipKxC1tJ+JOZiVNhI1TWsuJkHki1uRkIp2cidcdLVZYMnckpBVLmWULGd+G7VZsUspFrmvlMe9wdO/EWjpotrNoEumCjGSw58kebmXgldcPGUN/QZ17qZNt9OIh8lpyx4+yKDIV+/1HHy17/BAF0PzktgVBqV58pNhBT2HYmlNkeRWOtoSsMypfRbtJ5MFjBY/jqmSSKLYqs4u2Uuzpxv8XysnAcxibesUiqBCwV8auNCRKi6gvtRHLjO7VIiPBYRaGCkMWfnrvhEuNLlepLh0eSZxdnHP0nHIZ43obcB2aH/AuTmW+ohvE2Y5IeJg3+K0Sb/pmWeaxf8jlmh7ZEut1UTp6Un4XTlQZwpF/OEDU9WDiT2l/EPXhXDeeD2TMZUiXV1Wa7LoGEXfCi0IaoHNkcGwfHqIANbqfarOaqgSWFB9fSjIhEw1kQuP8oeqWso02t7aQMf0Dfdf8xhY6tyFtT46P+c8QzTtREBAU9U5Y/J81/23WAIQ/5ORGuv7yJEIs1rwSwT5NnYKS1p7F8Kll0rqbtU586f8ixd2dg+qf4HnLnQ7O4QrQQzoA4YvrRCBHq1AA8o/HP/X59b4m8u86vuXd4I8TEP0qDOvauiQkeI7s9tenFPsiIjZGOVChvjFFLPNcOwGCxgT5BcUStMBtrZHspi9eGgN82VakOkusZ0SjPINnsx7d12StXA3nI+942p0/qr7Bk1XCIWT5HfW88ubFRSCv0DlQblKVjXujrHcDWA4dQYJR3xM2cIPKPpDhXcDvcoX7Q6gEQDi1jEfONnrQQ8x2rS7mafXvD/xwqXSfdTRVxEfY1vMCXVnQLePAwTGl9foI/btq56C/dXJdCGjGAcXpgFqxQTNYq52NlhC6LyBgv6LdSqNQS6EcZwjTw5DPCNwWylg3BuegWLWD0kE62SdS+zjaGdAqOp2y0bPh+TPZU2xsX11uhsvV6VA7cA4Jg1v2ijtz88YYJPDps7QD4/Vh17gzAGfEme9PBmovLVKtb3+WqAaJgMgz1NzzPOGtZANlOLUahtoy5vrKFbbqIzYBEgpwlmHqYWAzMcdCjUwsMKv4cUeqPNDZa7F2WWYshUtoslcXZ4qLnkWfknEZF3Ij0eJ4KLUpZDKPUAFRohKf2tw7ZGhi+9WOK24/lPMujsbFgKiy6FGkEpVuQcRr9X3Eg+Kv8/kFt5YTHvsU2p1PWGG656LMOcjJkZEb8dvV2z9FouNyDc9CbJreLdMrxaHjCJkQMq55uhv3b5i+ICpwlq7gUEF7CBqYjXufsmD6dWVGWJXHHDYs43GFy4N86vP/qeQSKGOjLTbDWYXINcZs8A69xJKMv4GCTewreFA95K6Pb5ux7SQdSm6mg1zxsBHV83PoQsqmbGAeSTWPwYW2nmrSpfjvqBrbp3E9EFvChaHc1o8udg3k25ks1Cx1rngprYrPSt754ZqnkcN1QiTMXuC60XbFZAnpM65zzyR+3+ORzw4vLSTE+QYNKVv3Zrxzwet8ATyC7HPMePHH7HgBf3RcDy6brwhv7iUTZz/PNLfO0BjTG0/20gdjwYGaR6aBQ8mRIaDVbKl8qX1YqoS7KpG6yBNVeY3CagO6k+OT0+nxD9PjU97HqbSWvhhWOkMnLLpZeBji1leWf/83pCpV+PVRkaHisuOlydiNwCEQtsshpH3KJMPKwwMSkt6ZbLfj10gSw8S65rNBhVtwuJlJ9fDOnEuU5QVwFXgtPRK8by+rqvGdGEMaUrD16aFKwihi+j6LqfaHiY61IFAVrumcdTQSvRu22XGGS6Vwj8q2C9zF26s5hBfVFz0u5niLi4O/9uE30HBL5SszC/h36OFBt9K3G1HQyT9/Az4Yc4E= sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null diff --git a/docs/docs/api/create-workspace.StatusCodes.json b/docs/docs/api/create-workspace.StatusCodes.json index a30e543f9..8e1ae65c8 100644 --- a/docs/docs/api/create-workspace.StatusCodes.json +++ b/docs/docs/api/create-workspace.StatusCodes.json @@ -1 +1 @@ -{"responses":{"200":{"description":"CreateWorkspace 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"workspace_name":{"type":"string"},"organisation_id":{"type":"string"},"organisation_name":{"type":"string"},"workspace_schema_name":{"type":"string"},"workspace_status":{"type":"string","enum":["ENABLED","DISABLED"],"title":"WorkspaceStatus"},"workspace_admin_email":{"type":"string"},"config_version":{"type":"string"},"created_by":{"type":"string"},"last_modified_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"mandatory_dimensions":{"type":"array","items":{"type":"string"}},"metrics":{},"allow_experiment_self_approval":{"type":"boolean"},"auto_populate_control":{"type":"boolean"},"enable_context_validation":{"type":"boolean"},"enable_change_reason_validation":{"type":"boolean"}},"required":["allow_experiment_self_approval","auto_populate_control","created_at","created_by","enable_change_reason_validation","enable_context_validation","last_modified_at","last_modified_by","metrics","organisation_id","organisation_name","workspace_admin_email","workspace_name","workspace_schema_name","workspace_status"],"title":"CreateWorkspaceResponseContent"}}}},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}}}} \ No newline at end of file +{"responses":{"200":{"description":"CreateWorkspace 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"workspace_name":{"type":"string"},"organisation_id":{"type":"string"},"organisation_name":{"type":"string"},"workspace_schema_name":{"type":"string"},"workspace_status":{"type":"string","enum":["ENABLED","DISABLED"],"title":"WorkspaceStatus"},"workspace_admin_email":{"type":"string"},"config_version":{"type":"string"},"created_by":{"type":"string"},"last_modified_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"mandatory_dimensions":{"type":"array","items":{"type":"string"}},"metrics":{},"allow_experiment_self_approval":{"type":"boolean"},"auto_populate_control":{"type":"boolean"},"enable_context_validation":{"type":"boolean"},"enable_change_reason_validation":{"type":"boolean"},"workspace_lock":{"type":"object","description":"Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease.","properties":{"lock_id":{"type":"string","description":"Unique identifier for the active workspace lock."},"operation":{"type":"string","description":"Write operation that currently holds the workspace lock."},"locked_by":{"type":"string","description":"User that acquired the workspace lock."},"acquired_at":{"type":"string","description":"Timestamp at which the workspace lock was acquired.","format":"date-time"},"expires_at":{"type":"string","description":"Timestamp at which the workspace lock expires if it is not released first.","format":"date-time"}},"required":["acquired_at","expires_at","lock_id","locked_by","operation"],"title":"WorkspaceLock"}},"required":["allow_experiment_self_approval","auto_populate_control","created_at","created_by","enable_change_reason_validation","enable_context_validation","last_modified_at","last_modified_by","metrics","organisation_id","organisation_name","workspace_admin_email","workspace_name","workspace_schema_name","workspace_status"],"title":"CreateWorkspaceResponseContent"}}}},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}}}} \ No newline at end of file diff --git a/docs/docs/api/create-workspace.api.mdx b/docs/docs/api/create-workspace.api.mdx index 9f886b3be..365fc1e80 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: eJzdWEtv20YQ/isLnlpAko0UvvhmJwZqIGkNy0EOhkGMyJG4MbnL7i4lC4L+e2eWD5EiKTlAiqL1wSa5855vHutdEKONjMyd1Cq4Dj4aBIdWgFC4ERttXm0OEYqNdIlUApTQZgVKWmCGiZAqSotYqpWIwcECLAobJZiBsOiKnBhiIa1OSWgsUK2l0SpD5cRSGxFptZQrkYGCFfqvrEbYHCO5lMQAceaVxizNkRY7CyaBztF49fdxY/G32lI6N/hXgdbd6ngbXO8C0uJINj9Cnqcy8rwX3y07vAtKc/nJbXMkgXrxHSNHcnLDmpxEy6dNLEJvVUhMMm2xWWfIwGA/aVEqyPAMiXXgCtsnmgSoiiy4fg7u/ri5/Xz3ib58up+Xjy+TwEmXMnnj+LwURMIzJBERy6QXSFO9CfGNPJEc4tBiugwpEEavoW3/QusUQbEAKJwOc50XnLaQ42f0CCkqWKQlDb65kETKGEosnSJPQK0wpMxREs4w7cuESoMxR2M4Db2gtyJ0BJDHEh0fK1TsuwqcKZA+5GBIikNDUXzeBWUeg7cpgX8qY1InuVgShBgNvfUwdMj0kegX/mJzrWyJqg+Xl/xnqAgbiwURiZqLtP10QI/CtF3rIfl9luY9gPfm/Uul8f4iLntTuCYIdIHZIvFpisPFdvA4BevCTMe+lb2PCNyQt9QqMz4JqEhw6qiM29p/hIc6Lb1rsw1jbgbsWTu+YAxsGdwOs4G47/93vaUNiFRHr0NF0y3NL+iAJ52fXzQNIXJyje1BaSh6goXNxAMVLU81rdKt2CQyRWLRLkFTkTWTjGakSHTqBymdt+SRoRZnveJlBYMVeWzwVyWp3wkZkyEMMuMtZx09073RvqRrs86L/3bkh0vAiagwhtSR0+yTPfaoVsMPI5XR88KiKWVDVPbTMaH1+UhddMU+EWypy2S0pzhOUJQMiBUbsI3a2WhtURkQgf2JeiuJQi6FdIwQwg7NAY+IWCylsW7MnKOh2Q5Kx9JJA6R2OtoIGOqnn7lUejpON4Oxyu80sk5PPV/Rp1rEQGsdaMmHhtYfdkOjbWyC9PaPsYk3MN9OrSrlzG/tKhT0q6GV4Z4ojIJ0joZG1p0xVORX/8jaQMi1tK4Pj4fakQFzhpxhDljxjnUAl/jSXAc4NJSfRPOen2vrjQGX0NtFE0ZOnUVqOdJt/bJmM7pEbGeQy1niXH4LVkY3BXM9v+wn/XMEg6YheDlIm3NESqfHZTZR4O+9Qv/96elBeGpB8E+4B0c1Pn3A/Tjic24hJyx7jxpPfkqPJ/B54qQ/Hq5Jd2/Ui1I8cc05dLLjtXHopN7cWgvaDy0OvCqPrgrl4YnloEswug5Uq75US+3jW0F3XpBVBDZZha/ZAGlX/3A1vfxtennFyWI80j7FrFUgyuoV7atoJ02tq+h/4p5dIY7je5GnIP3CVBi/rZVl2LqO+T6WcI3S192OLfxq0v2ePxPODNcmPa7BSM5LWYz1DYrLNiZf6YBKfQmpxROx++WxGju/ijErX3Hbva9R4gsmC7gDlKdVI5o+sYADRa83Hjhuoghzd5K23bEe/pw/EfGi+j8EzR3mMbDh/1HQb7KGJ62rt3D/jVY7AmzhO2xQyuSfvwHiBFL/ sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null diff --git a/docs/docs/api/delete-default-config.StatusCodes.json b/docs/docs/api/delete-default-config.StatusCodes.json index 0c2155399..cf9b72584 100644 --- a/docs/docs/api/delete-default-config.StatusCodes.json +++ b/docs/docs/api/delete-default-config.StatusCodes.json @@ -1 +1 @@ -{"responses":{"204":{"description":"DeleteDefaultConfig 204 response"},"404":{"description":"ResourceNotFound 404 response"},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}},"512":{"description":"WebhookFailed 512 response","content":{"application/json":{"schema":{"type":"object","description":"Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete.","properties":{"data":{"description":"The successful operation result that would have been returned with HTTP 200, serialized as an untyped/raw JSON document. The structure logically corresponds to the operation's normal output type, but is modeled as Document since this single error is shared across multiple operations with different output shapes."}},"required":["data"],"title":"WebhookFailedResponseContent"}}}}}} \ No newline at end of file +{"responses":{"204":{"description":"DeleteDefaultConfig 204 response"},"404":{"description":"ResourceNotFound 404 response"},"409":{"description":"WorkspaceLockConflict 409 response","content":{"application/json":{"schema":{"type":"object","description":"Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock.","properties":{"message":{"type":"string"},"lock":{"type":"object","description":"Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease.","properties":{"lock_id":{"type":"string","description":"Unique identifier for the active workspace lock."},"operation":{"type":"string","description":"Write operation that currently holds the workspace lock."},"locked_by":{"type":"string","description":"User that acquired the workspace lock."},"acquired_at":{"type":"string","description":"Timestamp at which the workspace lock was acquired.","format":"date-time"},"expires_at":{"type":"string","description":"Timestamp at which the workspace lock expires if it is not released first.","format":"date-time"}},"required":["acquired_at","expires_at","lock_id","locked_by","operation"],"title":"WorkspaceLock"}},"required":["lock","message"],"title":"WorkspaceLockConflictResponseContent"}}}},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}},"512":{"description":"WebhookFailed 512 response","content":{"application/json":{"schema":{"type":"object","description":"Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete.","properties":{"data":{"description":"The successful operation result that would have been returned with HTTP 200, serialized as an untyped/raw JSON document. The structure logically corresponds to the operation's normal output type, but is modeled as Document since this single error is shared across multiple operations with different output shapes."}},"required":["data"],"title":"WebhookFailedResponseContent"}}}}}} \ No newline at end of file diff --git a/docs/docs/api/delete-default-config.api.mdx b/docs/docs/api/delete-default-config.api.mdx index 8f8243a84..170a24e42 100644 --- a/docs/docs/api/delete-default-config.api.mdx +++ b/docs/docs/api/delete-default-config.api.mdx @@ -5,7 +5,7 @@ description: "Permanently removes a default config entry from the workspace. Thi sidebar_label: "DeleteDefaultConfig" hide_title: true hide_table_of_contents: true -api: eJzVVktvGzcQ/ivEXtoCetW1L7qlsYOmKNLAVtGD4QO1nNUy5i43fEhRBf33fEOuJMtSjCBNDz2J4ry/mfm4m0KRL53ugrZtMS3ek2tkS20wa+GosUvyQgpFlYwmiNK2lV4IiN1aVM42ItQkVtY9+k6WNBKzWnthO3KS/YlStq0NYk4CV5V1DSmhK6GDkFVFZfA7j468NTHZQI1vA32CONQyQIhkIAnsvJLGzGX5KJbSRBoVg2If7q1CAddkKNB1Tvh18g6dTjrZ4N75Ynq/KVr8ge4jrSHTXHcnQ42zL2tqZDHdFGHdsYoPTreLYjsoHH2M2hFiBBdpO9h7+TS0bjHUaueqJqnIfbOzPZr/wt8D3/jOtp48619MLvnnuNVnkBJQFDtL9nt5zvAWzYqupHc2vLGxVeLymdXVZHJq9RYtda00d+SW5G6cQ5+heDAcFKntbWBb2XVGl6mt4w+eHWxO67fzDxgibq/jIQg6V9uQ93JBZ4BCbkEHQ+fTue0zed2nsd2ywdXPF6fF/E3z2trHN1IbjDRUvksZzwFTbEr9FvCmHTbLx7IkUgg+j1m2yilh54zBlnBivI+0z0zMrVqn1ZK69ckmefG+ioa1MAaDvbvSaNQgfG2jUbzBciUd5VR2obDbuurLE0orvkCApuPBGp30RckgT6GcHedxKDFn1EdMWdRyiSqIWBaia1H9Soda/DabvcfoTgbCk9PS6H8gkSCuVsSWQVZjJ1fi97s/3wlly9igsowNBiOWcEXC2IVm6BghlyFTAMke4/6DR41gSOQZQ8dQwXsGDdzUWEUmh77uwwiv25IydeG4MCQojT7/r4EotEtnPYxRrAZyh2A+V6c0uNKxrz4m7DryozTOh8W/z/g+HEb8aEjPDTevg1wwJRY9DYjMAzEnwM7AmrVlYlWJLhKXgiqnxbh/FIaZwscbsOmWWYrK6HRYJ6L1DSpYj2SnR3UI3a/S6/JVZPv7B2a953ICIm6v8HDwdsdLk8foyz73G8X3J/uUpiRpCwl1gNCP7o5a2XLOcuawFzL7mjBJ/aU4SSG1ULeVTU77tt1FDEBnve5tQE8+u76YXFwNJ78MJ1ecIVQC3mo27R+PzOjiuJfPE9wc+On/+Nr30LPBuDNgMoYiOsOF5cnEIhxNJoym/NJjmmpAxgqbDfpMfzmz3fL1x0iO5xXHpQSBzLkPmF6lPZ8x/cjD0wtA/njb7+FP4ks59pey5W+OVA7+4cip5U+RLVZi99p/9/A5zJNvlX0KvIf/SainXzJH0bLCK3B+F57ITh7L7VP+ub7542Z2g435DE3axOs= +api: eJzVV11v2zYU/SuEXrYBTuJlyUPz1jUplqHrisRFH4IgoKkri40kqiQVxzX833cuKcsfspNgSx/2ZJm83zz38HKepOSU1bXXpkrOkk9kS1lR5YuZsFSaB3JCipQy2RReKFNleiKwbWcis6YUPicxNfbe1VLRoRjl2glTk5VsTyhZVcaLMQksZcaWlAqdCe2FzDJS3i0tWnKmaIIOxHjV0yO2fS49NhEMdjwbz2RRjKW6Fw+yaOgwGSSdu8sUCZxTQZ7OY8DvgnXI1NLKEuvWJWc386TCH8je0wx7mvOupc/x7VROpUzO5omf1SzivNXVJFkMEkvfGm0JPrxtaDHorDweGDs50OnSVE4yJfuvjXXV/A/2bnnF1aZy5Fj+eHjCP5tHvaNSAoJiqcl2T3YpXuGwGqvoo/HvTVOl4qSn9aav9WWZ1wej7tldoZWH6puV6iAJB1951pZ1DYlwsEdfHZuY9ytgxl8BIyhuR+gbWwFs05wq4LerqZha7amP0NoaRZAfk5KNIyGxmJPtizfWxubITZG6TfiLApkxImENGl7H4pfknJzQznNjjefT+Yu8TKWXoTckElJeP1Avq+BefEI5ESIaBlFOc13szwbtxGkglu1ESDrqZ8IO7gD0XibbAX+u9LeGhE4RiM40XHPk7KMXeqzZYq2Nnzf/ZSuPwBIvOZq24pTejWcvyMKRjbaliu21z+hy/076582ONBDhZVkLWMYBqXyHWTGVrnPLJ8HsydYTAIEOPGywY3qsIeBe0W9rsaVpIITbAwzMiEhFpq3z+8LZ4KGbjaJsRDrogLR+HOsIAH957Qvapo2ej9A/g67F9ukt6eaqZZp3Lc0sFmzwdDjs09UlJGwli2uyD2QvrAWAIfgqZPVSflis0tkRzp5kfj3ewb00zo25fy/BBqmAyA/g3MsqZVVqL22G1qpDXaOYX5lhm7g3jSGBgIsClzoHxuMDdZGJsUlnYRKQuortHKw4lzUFS+HWGnTmVKGZ9FxumoJpXMiptBRDWboCkkFGMT2R6jRAW5my5nuwz3bMuP1SjjbjWKUYI2o9hihyCaYbE/He8j7SPhd/jEafcNMOBwIEo2Whv2OH270STcVFTo+snIo/r//+KFKjmhKZxdoAGI2CKe7ViebScYVsLBlzntms+0/cvmhUxNn4mksF67Fo6OzSpFRE1+etG+F0pShOWvic4PKgAH3+n0umQKmscVBGshqVWzlzMbtUY7Sz4QaKPqFXkzvs9W6o73rHroN0F7i5HeSEJ7iknVpEHFuaFW1gyMsNz4FpmG7C6IfJ7iw5amfYgzhxHs0x/C14qCJcHNrPwlzoSmQwO5S1Psy9r3+XTqu3Devf3PKQtr1PqIjtBG5X1q65aSKM9tvsOorXe/0UUBKkhYQ436QRustJkDXHvM8XwRORvcRNEH/KTxAIR6irzASj7bFdNwBAbZxudUBPLpo+Hh6fHgx/OxiecoQQ8XhasGo768YBVGye5XaA8xU//R8fJ23pWeGoLsBkXIrGFpxYRCYaYQOZUDrjhwnQlKNkLDCf45zpsy0WC17GaGUZr/h8kCCQMZ8D0Jtqx99AP+Jw9EQhf75q+/AXsS/GdlFWfDOHdPAPnxxafDkt0BLLx8mru49u1p5WXQjchz/E1frDa8NbFHgLzq/92l7vslys88/5xYeL0QU65h9r1nLx sidebar_class_name: "delete api-method" info_path: docs/api/superposition custom_edit_url: null diff --git a/docs/docs/api/get-workspace.StatusCodes.json b/docs/docs/api/get-workspace.StatusCodes.json index ba8fd8465..3b1151ef2 100644 --- a/docs/docs/api/get-workspace.StatusCodes.json +++ b/docs/docs/api/get-workspace.StatusCodes.json @@ -1 +1 @@ -{"responses":{"200":{"description":"GetWorkspace 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"workspace_name":{"type":"string"},"organisation_id":{"type":"string"},"organisation_name":{"type":"string"},"workspace_schema_name":{"type":"string"},"workspace_status":{"type":"string","enum":["ENABLED","DISABLED"],"title":"WorkspaceStatus"},"workspace_admin_email":{"type":"string"},"config_version":{"type":"string"},"created_by":{"type":"string"},"last_modified_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"mandatory_dimensions":{"type":"array","items":{"type":"string"}},"metrics":{},"allow_experiment_self_approval":{"type":"boolean"},"auto_populate_control":{"type":"boolean"},"enable_context_validation":{"type":"boolean"},"enable_change_reason_validation":{"type":"boolean"}},"required":["allow_experiment_self_approval","auto_populate_control","created_at","created_by","enable_change_reason_validation","enable_context_validation","last_modified_at","last_modified_by","metrics","organisation_id","organisation_name","workspace_admin_email","workspace_name","workspace_schema_name","workspace_status"],"title":"GetWorkspaceResponseContent"}}}},"404":{"description":"ResourceNotFound 404 response"},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}}}} \ No newline at end of file +{"responses":{"200":{"description":"GetWorkspace 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"workspace_name":{"type":"string"},"organisation_id":{"type":"string"},"organisation_name":{"type":"string"},"workspace_schema_name":{"type":"string"},"workspace_status":{"type":"string","enum":["ENABLED","DISABLED"],"title":"WorkspaceStatus"},"workspace_admin_email":{"type":"string"},"config_version":{"type":"string"},"created_by":{"type":"string"},"last_modified_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"mandatory_dimensions":{"type":"array","items":{"type":"string"}},"metrics":{},"allow_experiment_self_approval":{"type":"boolean"},"auto_populate_control":{"type":"boolean"},"enable_context_validation":{"type":"boolean"},"enable_change_reason_validation":{"type":"boolean"},"workspace_lock":{"type":"object","description":"Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease.","properties":{"lock_id":{"type":"string","description":"Unique identifier for the active workspace lock."},"operation":{"type":"string","description":"Write operation that currently holds the workspace lock."},"locked_by":{"type":"string","description":"User that acquired the workspace lock."},"acquired_at":{"type":"string","description":"Timestamp at which the workspace lock was acquired.","format":"date-time"},"expires_at":{"type":"string","description":"Timestamp at which the workspace lock expires if it is not released first.","format":"date-time"}},"required":["acquired_at","expires_at","lock_id","locked_by","operation"],"title":"WorkspaceLock"}},"required":["allow_experiment_self_approval","auto_populate_control","created_at","created_by","enable_change_reason_validation","enable_context_validation","last_modified_at","last_modified_by","metrics","organisation_id","organisation_name","workspace_admin_email","workspace_name","workspace_schema_name","workspace_status"],"title":"GetWorkspaceResponseContent"}}}},"404":{"description":"ResourceNotFound 404 response"},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}}}} \ No newline at end of file diff --git a/docs/docs/api/get-workspace.api.mdx b/docs/docs/api/get-workspace.api.mdx index 19c50bbac..49df1140e 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: eJy9V1Fvm0gQ/isrnu4kx4l6zUve0jbXi9RWVZKqD1GExjA222CW7i5JLIv/ft8AxmAgSaXePRmzs9/MfjvzzbANYnaR1bnXJgvOgiv2VvMDOxWzJ51yrHS2NHZNYqBoYQqvSLmcI73UkXo09t7lFDHMorSIdbZS2jsVmWypV4VttmWxWgMvJk/zYBaYnOuVyxg+P7L/voPBYk6WYMzWBWe32yDDHxi1jsLqxSzQEm5OPsGzixJeU3C2DfwmF2uHU2SroJwFln8W2jL8eFtwOWsBn46MXR3peAeVMMVsfwnsTt643GSOndi/OTmRnz6j3dMpWKjdFrgCS54zL5soz1MdVaQc/3CyczuMxCx+cOSFIysUel37PeBmLHKclTLtKvwQh37RZhJp76wO71WWnnzhhkazgLNijWsOLr6cv/t08QFvPlxe149g12ufinlL4HUN1AOneK2zEJHodDSMOhXDBySUrnkdmlgmz3G42Iwup+R8uDYxMv61RuTHTlsXEt6gEPjIaxDX8f4re9YoKfLGbsIYbzI5WZdfspY2ktme1yO8l4IglR7JIv5QmprHkJ+QVALnQ8fpMkROWvNAXVoXxqRMmYRAhTdhbvIiRWChpLI1E6ac0SKtbfjJh4DUMfn+bYyYJ5StOAQ7qIcXN+0TIjXR/VjR9Ovyc6NHCgRDoBRFXj9wR9AeLdhTAjZXX1G0oEWZLN2oxwS6iC3GJ2wbs1bRlHYqMWklhFjv4CFQx/NB8YqD0Yo8DPhbpn8W0NkYgUiS2Spy8TEIvQq6KuldWC/Dfz84h0/Iq6iwFu5waDmTOzzRzo08TFTG4BSObY1NUS2mU6C79Ym66MPeIG2hMutcARkXFCUjsOqRXOt2PllbKAMYuN/ot0FUeonmKBmC3EEfqDIiVkttnZ8Kp9d1bnuk9CKdtYnUvY5uBozp6ScplYGP58VgqvJ7QtbT1Jcr+jmJGJHWEUneC9qw2Y21tqkOMhtOGuMdb6S/dRjudv2rpuG/b7p9WQrjb0/eDocFmJrCRvzF+L9NgakJVvuBAbtOx0aMS+DajNJrtuhyF9ZCF07/k0kDye5oNdbuy/3ZR8IZo0B20EqGvH0+qs+UAV+yTtjElSZGRsQVV7HItHcWHLfEu+Nt/7ZKmd8YqqX9ppoe3Vr7ZDOnXM8T7/N35HR0XgjM7Z0Mg4frTJZta3C3R7sWhmoSpjFbVuT9QCv+ubn5qiprhQpKRMajXYpXF1B1NFmXm34mste4qcyf81MZVPcmA34F2tzfdYEbz43TzZ52csKA++b06OSvo5NTiRAmHnOIbG1mamS96o7yvcC2+yT8nz4zGpZEUI7zlHQ1JxS2GlLqXLrdF7EIx9lB7eP+ExxS7LZb3Ax/s2lZymt0YisZhscHslq0q8q3GCKDZ+TsklLHz1Dwx1UjuX+qqVB3w1wm8gZFLOQfHu95M/wiKpHPu4+Y3x5J7bHzydRGI0VUr55HEee+szYQmrJb0h8vbpB9/wIV8SgB sidebar_class_name: "get api-method" info_path: docs/api/superposition custom_edit_url: null diff --git a/docs/docs/api/list-workspace.StatusCodes.json b/docs/docs/api/list-workspace.StatusCodes.json index 02caf1180..9da056168 100644 --- a/docs/docs/api/list-workspace.StatusCodes.json +++ b/docs/docs/api/list-workspace.StatusCodes.json @@ -1 +1 @@ -{"responses":{"200":{"description":"ListWorkspace 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"total_pages":{"type":"number"},"total_items":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"workspace_name":{"type":"string"},"organisation_id":{"type":"string"},"organisation_name":{"type":"string"},"workspace_schema_name":{"type":"string"},"workspace_status":{"type":"string","enum":["ENABLED","DISABLED"],"title":"WorkspaceStatus"},"workspace_admin_email":{"type":"string"},"config_version":{"type":"string"},"created_by":{"type":"string"},"last_modified_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"mandatory_dimensions":{"type":"array","items":{"type":"string"}},"metrics":{},"allow_experiment_self_approval":{"type":"boolean"},"auto_populate_control":{"type":"boolean"},"enable_context_validation":{"type":"boolean"},"enable_change_reason_validation":{"type":"boolean"}},"required":["allow_experiment_self_approval","auto_populate_control","created_at","created_by","enable_change_reason_validation","enable_context_validation","last_modified_at","last_modified_by","metrics","organisation_id","organisation_name","workspace_admin_email","workspace_name","workspace_schema_name","workspace_status"],"title":"WorkspaceResponse"}}},"required":["data","total_items","total_pages"],"title":"ListWorkspaceResponseContent"}}}},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}}}} \ No newline at end of file +{"responses":{"200":{"description":"ListWorkspace 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"total_pages":{"type":"number"},"total_items":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"workspace_name":{"type":"string"},"organisation_id":{"type":"string"},"organisation_name":{"type":"string"},"workspace_schema_name":{"type":"string"},"workspace_status":{"type":"string","enum":["ENABLED","DISABLED"],"title":"WorkspaceStatus"},"workspace_admin_email":{"type":"string"},"config_version":{"type":"string"},"created_by":{"type":"string"},"last_modified_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"mandatory_dimensions":{"type":"array","items":{"type":"string"}},"metrics":{},"allow_experiment_self_approval":{"type":"boolean"},"auto_populate_control":{"type":"boolean"},"enable_context_validation":{"type":"boolean"},"enable_change_reason_validation":{"type":"boolean"},"workspace_lock":{"type":"object","description":"Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease.","properties":{"lock_id":{"type":"string","description":"Unique identifier for the active workspace lock."},"operation":{"type":"string","description":"Write operation that currently holds the workspace lock."},"locked_by":{"type":"string","description":"User that acquired the workspace lock."},"acquired_at":{"type":"string","description":"Timestamp at which the workspace lock was acquired.","format":"date-time"},"expires_at":{"type":"string","description":"Timestamp at which the workspace lock expires if it is not released first.","format":"date-time"}},"required":["acquired_at","expires_at","lock_id","locked_by","operation"],"title":"WorkspaceLock"}},"required":["allow_experiment_self_approval","auto_populate_control","created_at","created_by","enable_change_reason_validation","enable_context_validation","last_modified_at","last_modified_by","metrics","organisation_id","organisation_name","workspace_admin_email","workspace_name","workspace_schema_name","workspace_status"],"title":"WorkspaceResponse"}}},"required":["data","total_items","total_pages"],"title":"ListWorkspaceResponseContent"}}}},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}}}} \ No newline at end of file diff --git a/docs/docs/api/list-workspace.api.mdx b/docs/docs/api/list-workspace.api.mdx index d82871843..59f27413f 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: eJzVV01v4zYQ/SuETi3gfHSLXHLLdoM2QHYRJFnsIQgEWqItbihSJakkhuH/3jeUZEmW5Dhtt0BPicXhzJvhzJuZdZQKl1hZeGl0dB7dCm+leBaOcVbwpdTci5Qp6TwzC8aVYi/GPrmCJxB5kT5jJlzlii2k8sJKvWTzVSvFNM/FjEmdqDKlQ58JaZnz3JduxhKjF3LJUuG5VPjNdcp4mksNi5Z7+SxwdWFszsnKcTSLTCFs+HGVAu815L41tnBacAt7wOGi84d1RMYhlZhSe5xKcvHPUtgVfvQd/1Lmc2HJSelF7pg3bC6YFb60GhGQmgmeZBQTQShckomcR+fryK8KMqHD/X+mdrOZbSHTl/2IbyDBKrOk1tYvN6PYWk+hXliTs1/eA/dwnV2sSIv9UK8WzNsSairHXUgkKyDsKL1CaJAjS21C/tSJh7usfc8Qo5Af4TVHvZobowTX/439bgRej4xdHsm0CUMmeBrCO4CItIaJaDOLyL60AllM2DaP9MUVRjvhSP7D6Sn96TvSS3cGEdbcgS3UkhfIc9ziRaFkElw4+e7o6noIxcy/i4TKorBUVF5Whr3xXMXkrRsmDHBX5yFmo+cp910r3FpOGbF7YcL6ljjiKrQjgUOoOfgheBcj5m/KTGpqjVXBOUgyMNdQaBYJxACsE11+ufh4ffkJXz5d3VX/4nG99IrEt893VynqKQ/UFwOJVKMwKrqMn5GPsnrVoYgVxNnxfDV6rLjzcW5SuZCHCnE/5m1FyviC9xZHXiJwHevvuZOjqLg3dhWn+KLJM3dAAjVwSQPxVEKH+IHaNi+xeEVSkTofO6EWMSrCmmeuRtiC7pTexIUpSgVgMRWSNROiQvO5qmTEq4+hUqbc919jRDzjeiliRAfV+OalNiGUSZ7GiqZPC5/RPqnsGAIMimI8CZ2zbcIvFtFjpOyY3YAyEBZmtEKfzqQiVjNoy7YW23ZYJh3LjGradkcfgLrQB/vFSwZGK3IX8FctQb5MpgBCSWYDcrIxgB5Ah5JuYL2t/tuOHz7jniWltTAHp8knt+tRY4b+maiMgReO2iTp5knF5VNKm/OJuuirvUfagmXygkEzHgjzwVAte+Fua/Z4srZQBhBw/6LdWiOTNNJQhiB30IVCRqQYAq3zU3B6Te+hF5Qe0tk2kbrP0c2AMT69plIZ2NhPBlOV3yOyHqe+XdH7KGKEWkcouSW0YbMba21THWS2202nOt5IfxuL8G0za2x2wxx6fn80mPUGiY663gzTqPytnl02QfXZ2OxzBQmLReNOWPS/S2vBGGc/ZAJCGTgav0d7TePGCJwxZ+gGX9I20saRfeYa+ikfKTB47MzQMrMUAQv3GX6ctIsWzZEC9CX9Kmw1LsfitTrmhTzOvC8+cieTi5JuPTzSULp7LrgVdivw2Gq7o4BUPk/r3AaBvg9I44/7+xsWpBlKKSM+T5pcD/EOrY3OiY72IDvETBDfZycIhGeirTEorZ/rrsQDF8bJ+s52hMKg/eHs6PTXo9MzQggRj4GErtazPeUr6+6YPWTrNun+B8tzHWKipZNCcRmmjdKGUafKu4eok3dIlQzxoK/rNR5RfLVqs6HP1Z5HyZiCisB2yN8FV07sCc87V+xRrE9i1dnnwawlyUSU9YcDec/mvAdFvaL/TRA/aCfeg7da01u4j/TDSsJbMUeztr7vWX+6rRvBz2y//c6S3ItZdXqRJKLoPuqAwTddrvz98h51/hcyUqVR sidebar_class_name: "get api-method" info_path: docs/api/superposition custom_edit_url: null diff --git a/docs/docs/api/migrate-workspace-schema.StatusCodes.json b/docs/docs/api/migrate-workspace-schema.StatusCodes.json index 353d19de4..f86b9ba5e 100644 --- a/docs/docs/api/migrate-workspace-schema.StatusCodes.json +++ b/docs/docs/api/migrate-workspace-schema.StatusCodes.json @@ -1 +1 @@ -{"responses":{"200":{"description":"MigrateWorkspaceSchema 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"workspace_name":{"type":"string"},"organisation_id":{"type":"string"},"organisation_name":{"type":"string"},"workspace_schema_name":{"type":"string"},"workspace_status":{"type":"string","enum":["ENABLED","DISABLED"],"title":"WorkspaceStatus"},"workspace_admin_email":{"type":"string"},"config_version":{"type":"string"},"created_by":{"type":"string"},"last_modified_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"mandatory_dimensions":{"type":"array","items":{"type":"string"}},"metrics":{},"allow_experiment_self_approval":{"type":"boolean"},"auto_populate_control":{"type":"boolean"},"enable_context_validation":{"type":"boolean"},"enable_change_reason_validation":{"type":"boolean"}},"required":["allow_experiment_self_approval","auto_populate_control","created_at","created_by","enable_change_reason_validation","enable_context_validation","last_modified_at","last_modified_by","metrics","organisation_id","organisation_name","workspace_admin_email","workspace_name","workspace_schema_name","workspace_status"],"title":"MigrateWorkspaceSchemaResponseContent"}}}},"404":{"description":"ResourceNotFound 404 response"},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}}}} \ No newline at end of file +{"responses":{"200":{"description":"MigrateWorkspaceSchema 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"workspace_name":{"type":"string"},"organisation_id":{"type":"string"},"organisation_name":{"type":"string"},"workspace_schema_name":{"type":"string"},"workspace_status":{"type":"string","enum":["ENABLED","DISABLED"],"title":"WorkspaceStatus"},"workspace_admin_email":{"type":"string"},"config_version":{"type":"string"},"created_by":{"type":"string"},"last_modified_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"mandatory_dimensions":{"type":"array","items":{"type":"string"}},"metrics":{},"allow_experiment_self_approval":{"type":"boolean"},"auto_populate_control":{"type":"boolean"},"enable_context_validation":{"type":"boolean"},"enable_change_reason_validation":{"type":"boolean"},"workspace_lock":{"type":"object","description":"Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease.","properties":{"lock_id":{"type":"string","description":"Unique identifier for the active workspace lock."},"operation":{"type":"string","description":"Write operation that currently holds the workspace lock."},"locked_by":{"type":"string","description":"User that acquired the workspace lock."},"acquired_at":{"type":"string","description":"Timestamp at which the workspace lock was acquired.","format":"date-time"},"expires_at":{"type":"string","description":"Timestamp at which the workspace lock expires if it is not released first.","format":"date-time"}},"required":["acquired_at","expires_at","lock_id","locked_by","operation"],"title":"WorkspaceLock"}},"required":["allow_experiment_self_approval","auto_populate_control","created_at","created_by","enable_change_reason_validation","enable_context_validation","last_modified_at","last_modified_by","metrics","organisation_id","organisation_name","workspace_admin_email","workspace_name","workspace_schema_name","workspace_status"],"title":"MigrateWorkspaceSchemaResponseContent"}}}},"404":{"description":"ResourceNotFound 404 response"},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}}}} \ No newline at end of file diff --git a/docs/docs/api/migrate-workspace-schema.api.mdx b/docs/docs/api/migrate-workspace-schema.api.mdx index c4d646a60..99cdb77a8 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: eJy1V01v2zgQ/SuETruAHRvd5pJb2maxAdpu0KToIQiEsTS22EikSlJxDEP/fWcoWbItykmB7Mk0OXwznI83o22Uok2MLJ3UKrqIvsiVAYdWuAzFWptHW0KCIgUHC7AobJJhAcJpL6BwLZ7QWLor9NJvOSzKnBCiSaRLJCw6u0575B87zFuPRGIlGCjQEUx0cb+NFP0h8U537DcmkWTzSnAZrRsroott5DYlS1tnpFpF9SQy+KuSBkmjMxXWkw7wearNairTHVSGkKL5LbAH3rGlVhYty7+bz/kn6MGjdwqSFbvLpDTRyqFyfB3KMpeJd9Tsp2WM7dAmvfiJiWNvGXark40FR14KvYFeDUpajx/T81+UGUXqlTXmvUrSgavsUGgSoaoKCnh09fXyw+erT7Tz6fq2WZKfnXQ5i/dubIAOwCEtpIrJEpkHzSAnL+UqbjM0LGKQgpXGi03wOAfr4kKncilfKwQu9NqlNgWfRFRJOHWSHLen/XfuFKDovzabOKUdxS/b9y8YAxvOcSrEgN9rRkBaJ3xIfyDP9TrGZ0oqhnOxxXwZU04a/QT7bl1onSMoNgEqp+NSlxUXesypbPSIKCpY5I0MPruYIGUK7jAaAfEM1Apj8g7Vw4uX+oTIdfIYKpqjCkUHTGiCHCxACUicfNpnu7Uh7wkGOxM3VLTkFqFVvhHrTOZIVzQxnWnFOpYT0opM5ym5+Yg9yVCLZ4PiZQXBijw2+LuSvyoUMiVDOMmMt5x1DEz3RvuS3pn1MvyPo3e4DJxIKmNIHT2a33TcDzo1vBipjMErLJoGG5KGVsdAd+cjdXEIe0dpSyxTlIKQKUBJFoAVa7Cd2rPR2qIyIAH7hnpbRCGXQjrOEMod6gM+I1KxlMa6MXMO+s/9gVMOLJ10ibQfjv0MCPHpZy6VgY7TZDBW+QdEdsCpL1f0KYoIUGuAkntCGza7UGsb6yCT4cwR7niB/rbn4XD//9a2/o9t369r9v37+fvhAEGiujIJftXub12pVJBUPzrQrfPQ2HFNuEZBfouG+t2VMcQQ5//LzEFpb2EVavx174WAOSEX8A1Y8eDXZ6b4AorwOf/YrxTcTPMAWWrrjeER8CKadTGws+1h4OpZupgVTRh4vkPiMuk2frq0hXTZ5gxKeZY5V34AK5PLihHvH3hYPD5HMGg6gYcezYe1ccg4Zuch3h8wyD93dzfCSwuqq4zJPdklvg+G73N8zlE/Ydlr1HjxU3q8gI+hVEvtQdtY3lYUffK+bO908xQNwO/Op/O/pvNztpADRNMJX21n7rYWRB/bbuo/sHHb5+abfoG0bmFemdGe9ONCZfys0uTRfV/LzB8XAwpIF0wwbTJR/DPOQrq23bI1301e17xN/dlwhtHyCYxkRvP5lhL10Jrydwm5xRPv/uNbS8R/ijHLdyOeYtIjnqz4Hy0fcTP8Yqopn3cfOW9uSaNx75Oqs4aLqDm9TBIs3d7ZgHTq/fK++ff2jtLvP5LyLJs= sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null diff --git a/docs/docs/api/update-default-config.StatusCodes.json b/docs/docs/api/update-default-config.StatusCodes.json index 739942b79..d4ffb6bd9 100644 --- a/docs/docs/api/update-default-config.StatusCodes.json +++ b/docs/docs/api/update-default-config.StatusCodes.json @@ -1 +1 @@ -{"responses":{"200":{"description":"UpdateDefaultConfig 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string"},"value":{},"schema":{"type":"object","additionalProperties":{},"description":"Generic key-value object structure used for flexible data representation throughout the API.","title":"Object"},"description":{"type":"string"},"change_reason":{"type":"string"},"value_validation_function_name":{"type":"string"},"value_compute_function_name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"last_modified_by":{"type":"string"}},"required":["change_reason","created_at","created_by","description","key","last_modified_at","last_modified_by","schema","value"],"title":"UpdateDefaultConfigResponseContent"}}}},"404":{"description":"ResourceNotFound 404 response"},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}},"512":{"description":"WebhookFailed 512 response","content":{"application/json":{"schema":{"type":"object","description":"Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete.","properties":{"data":{"description":"The successful operation result that would have been returned with HTTP 200, serialized as an untyped/raw JSON document. The structure logically corresponds to the operation's normal output type, but is modeled as Document since this single error is shared across multiple operations with different output shapes."}},"required":["data"],"title":"WebhookFailedResponseContent"}}}}}} \ No newline at end of file +{"responses":{"200":{"description":"UpdateDefaultConfig 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string"},"value":{},"schema":{"type":"object","additionalProperties":{},"description":"Generic key-value object structure used for flexible data representation throughout the API.","title":"Object"},"description":{"type":"string"},"change_reason":{"type":"string"},"value_validation_function_name":{"type":"string"},"value_compute_function_name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"last_modified_by":{"type":"string"}},"required":["change_reason","created_at","created_by","description","key","last_modified_at","last_modified_by","schema","value"],"title":"UpdateDefaultConfigResponseContent"}}}},"404":{"description":"ResourceNotFound 404 response"},"409":{"description":"WorkspaceLockConflict 409 response","content":{"application/json":{"schema":{"type":"object","description":"Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock.","properties":{"message":{"type":"string"},"lock":{"type":"object","description":"Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease.","properties":{"lock_id":{"type":"string","description":"Unique identifier for the active workspace lock."},"operation":{"type":"string","description":"Write operation that currently holds the workspace lock."},"locked_by":{"type":"string","description":"User that acquired the workspace lock."},"acquired_at":{"type":"string","description":"Timestamp at which the workspace lock was acquired.","format":"date-time"},"expires_at":{"type":"string","description":"Timestamp at which the workspace lock expires if it is not released first.","format":"date-time"}},"required":["acquired_at","expires_at","lock_id","locked_by","operation"],"title":"WorkspaceLock"}},"required":["lock","message"],"title":"WorkspaceLockConflictResponseContent"}}}},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}},"512":{"description":"WebhookFailed 512 response","content":{"application/json":{"schema":{"type":"object","description":"Indicates that the operation succeeded but the webhook call failed. The response body contains the successful result, but the client should be aware that webhook notification did not complete.","properties":{"data":{"description":"The successful operation result that would have been returned with HTTP 200, serialized as an untyped/raw JSON document. The structure logically corresponds to the operation's normal output type, but is modeled as Document since this single error is shared across multiple operations with different output shapes."}},"required":["data"],"title":"WebhookFailedResponseContent"}}}}}} \ No newline at end of file diff --git a/docs/docs/api/update-default-config.api.mdx b/docs/docs/api/update-default-config.api.mdx index 455bd4fab..d193f09b6 100644 --- a/docs/docs/api/update-default-config.api.mdx +++ b/docs/docs/api/update-default-config.api.mdx @@ -5,7 +5,7 @@ description: "Updates an existing default config entry. Allows modification of v sidebar_label: "UpdateDefaultConfig" hide_title: true hide_table_of_contents: true -api: eJzdWE1z2zYQ/SsYXtrOSLLrxhffnK8mPSSeWJkeEo8GIlYiEopg8RFZ1ei/9y1AiaJEO3HrdDrNwaGJxdu3D7uLpdeZIpdbXXttquwie18r6ckJWQm61c7rai4UzWQovchNNdNzQZW3q5G4LEuzdGJhlJ7pXPJ+YWbiiywDDYTLC1rIgZiFKo9LC1nXAHMDQCux51QsC12SqC05sl/Yny9IfKaV0AquAE52lA0yU5ONXl6rHc/nidmzSAw2lv4I5PxTo1bZxToDYQ8IfoT3smF58slxqOssceQnv6oJoGb6iXIPnNqyN6/JRZhCVnOaWJLNxsbceQu62WaQxaCxgse7QaVSmv3L8mofHnu6R/ArVWR1zhIMI7BIEAL+Qu6DJREcKTEzVsxKnNIU8kENKSxFFSufTsMX1oR5YYKPkl5evWYdvfYl83qbeG3ZT/BTq7hxsj20SSUXdBzwIeGxEaFylLzsDpz3DkQtnRMfsyqU5cdMJIBRdhjzXZJOcrOog6d/gdEmZY+2hPT6cHDmN61sPYn3LmXdsybbNl0sHBrhRS0t3HuyOPMP6yzFkeGMQV4z51r6IuvJn1aSQ8wdyu3Q2PlQqy1UQVKR/dtgS2M/u1rm9A/wbviNqw1OIdbQ2ekp/9fXbDpaChiK7U54fKQSZp3/f4X7tRr6xsb1gNJ/aGEyCbj3pCbS99UttFjwSsaZMPQaIHt7pv2nVkrnJ+nieSBwd2cv/L2NoBNOh2f3NAZNZR8x7aGwS71tOn6t26Ti2Gs3oPzk9MlxfcHUBJvTG+NfmoBrF1ZtcWHXeV9VvgauRbJf4zom+8JapOv5d6nKBTkn531ps2kl6KHTL8H5z2fHwfxO08KYzy8lZgwlYPIoYRwKpngrpiZfyFSyu2FFuJDnRArOp005LxMlkcuyFLNIbCTGWNgyE1PMLzxteakrF/dEFOdmoWQr5MJgB5eXGjEIh3ZRwgkJuZToNJHK1lVlfDukKa34heASLnEjjY7OhXvSsZTjLo82xMSo8RhZFPILoiDiNfS9CtEvtS/Eq/H4ijs85kN0SnSdP7Ei47QZKhZZnVi5FL9dv30jlMnDApElbdoWWpq5ZulYIZskUxDJdHX/wSFGdADwDL5mqYCeRNNxaKUyuX7euBFOVznLhmU8ztGaKaY+/15AUVjn1mB2WCBYDeVaZy5Fh5KekWWsxif21eSOh4uo716Vd5K0L7m5HOScJ4es6QUiNYOQCDAYhovCqDRI5DxJxIHiIjtpxvdhGt9P1uhMG246lAer/SqOI26BAFYjWetR4X39VDqdXwbe/+GGZ4PDdYIgdmdw06Jdc82kLLobc1dQ/P6onGKSRGshYc7fAClzt52Sd055nVvYPcy+xU00v89PNIgnyG3hXfuB8eJWcv30fCC0l1DfePENt+5dY20X9647eO+i1NXMRB2aRLsOSNnaON2EiYbqEvTZ6dn58PSX4ek574OJX8jYBBvMdBGJbvYdEtz74voPf0g2SeHp1p/UJVosRxxsyfxTzaBCOzWDTRd8nyPPCyjDBus1MpDe23Kz4dfICsuVdMNng842ZblRV0o7fkZZzmTp6B69fnzXNIifxF0cm5eyWrWplTWjRvqU2KBYt9P6o7tPbva+NXYUuEN8F1f7XyIdb8mgaZHDMWO0Fkd3ebvjEtdX7e+13W+lV5fjZ69gPW3+oMD3Bl7jjuI/NuBn1N/EIGPPi+/WmPGqeYiTTZZA+d9f6cMsYQ== +api: eJzdWFtv2zYU/iuEXrYBtpNlzUPzlt7WDFsbNCn60AYGLR1bbGRRI6k6buD/vu+QkiVbUpJu6TAsD4kinTvPdy68jRKysVGFUzqPTqL3RSIdWSFzQTfKOpUvREJzWWZOxDqfq4Wg3Jn1RJxmmV5ZsdSJmqtYMr/Qc/FFZiWNhI1TWsqRmJd57D8tZVFAmB1BdCJaSsUqVRmJwpAl84X1uZTENa2FSqAKwslMolGkCzJey1mytfNFsOy5Nww0hv4sybpnOllHJ7cRDHYQwY/QnlVWHny27OptFGzkJ7cuCEL17DPFDnIKw9qcIuvFpDJf0NSQrBgrcusMzI02o8g7jS94HBYqk0Sxfpmdt8WDZ/cIfqWcjIo5BGMvWAQRAvrK2JWGRGkpEXNtxDzDKc0QPkRDCkM+irkLp+FSo8tFqkvnQ3p6fsZxdMplbNfbYFdt/RS/VeIZp/WhTXO5pK7D+wZfalHmloKW7YEz70gU0lrxKcrLLPsUiSBgEu37PBTSaayXRenoX7BoE7JHGUJ6fdw786smbD2J9y5k3fMq2za7snBohBeFNFDvyODMP95GwY8IZwzjFdtcSJdGPfnThGRf5lbKzVibxVgltaiUZELmbwtbaXNtCxnTP5B3xW9soXEKHkNHh4f8p6/Y7MRSgFDUnND4SBDmOP//gHsfhh5YuL4B+t8KTDYC6h0lU+n6cItYLPlLxJkwdgpCWjyz/lPLpHXT0Hi+UfAuZ6/4OwvBjjs7du6exqhCdsfSHhO2qVen433VJoCjVW5g8pPDJ118gVSXJqY32r3SJdouqBpwea6nXa4PNfx/1/E16wTqHFifPgou9y0ELHJgYpVSLqTYlh6xMsoBQHXTF7HMc+0wJuiYQD+jWAJMGCY0IGK65KUxsC9bi1RnifU4aoRn8GzSKRJLslYu+rOYOe535w9y0gOaIY4RSgIbX6jjlVcvzgPkhc5hZRiChrxR1rtRD0ctR5CW1PWEFUzRD+5tlO9zhd7VmrS85ayjY3qI2aY1iN0v/sOeHy6V7kFHU0V8AKMdLzA5BtkyDsgdElp/Hygae1MEioZ1clkISMYBxWmPWLGSdqt2Mlh46KYAgX1EvZVEoeZCOc4QhochnxHoMcpYN2TOXolrB2XH0tE2kdrH0c6AVqnaKRsdHR4/oy3EhvjqctNf5I77hogzUBj05gtsD2ReGoMEPv4uQ8Rwfdg07vSYM+DMz0c9tZdmqdbXrySqQSJA8h1q7lmeMCvZABlOrQahtoy5vnKFraaPVTAJBTjLxNwbNhGX+FBbJmZYt3g5dFLlAc5eirXzMmMqtK7RVlycKS56FtNNxmVcyJXEYORNqVUhk5udMlGJT22eODIM0N1qxxW3G8rLXTsaF4NFlUZvRSpR6WZE/K3uR8ql4vXl5TkPpFhnMdhhSPqKL9Ivx2XOQU4OjFyJ3y7evhGJjsslPAuxaSa+TC8Uh44jZELIuObp3bj/wPAFUGFn6QoOFaSHoCm/Y1MWVL+o1Air8pjDhs94XKB5kE99/j+VXAJlbDRWnSWcVYhco8wG7zCBzMn4DhR0gq8g292FfHzbiG0naV9yMxzkghedqBpdRJhdyqZsYBdKdRL2npgXH7//nEQH1W3DONw2HNxikNrwjEToG8qt/fZkl3BgPZGFmqTOFc+kVfFpyfwfr3iV2f9OCIjZElw10i4YMyGLhmVuAcXvO3DySeKphQQ5N9KQufVgx5wz/s594A7LHqLGk9+lxxP4E+Sy8K65D3l5Ixk/PfcZTRvq24YesCQM9bFduUMrQ2vIUvlc+zhUiXZRImULbVXlJgqqDaKPDo+Ox4e/jA+PmQ8kbil9EaxkhrlZ7GbfvoGtC6L/8L1XlRSObtxBkaHEsselydj+gBkgdAczYDrh9QN5niIyTHB7iwyk9ybbbPg1ssIwkq74bFDZZhxu4CpRlp8By7nMLN0Rrx/fVQXiJzFkY/VS5usmtaJqMwo3HxuAtb5ceHT1QU3ramRrAleI76KqfXGyoy0QVCVyfMkyGopOL284TtG+CncnbbuUnp9ePn8N6ll1/8l9A6/Ro/huFL99/LV30tc8/w7rAupB6SebKAjln78AFFTaWA== sidebar_class_name: "patch api-method" info_path: docs/api/superposition custom_edit_url: null diff --git a/docs/docs/api/update-workspace.StatusCodes.json b/docs/docs/api/update-workspace.StatusCodes.json index 5eea344da..e1eadfc2d 100644 --- a/docs/docs/api/update-workspace.StatusCodes.json +++ b/docs/docs/api/update-workspace.StatusCodes.json @@ -1 +1 @@ -{"responses":{"200":{"description":"UpdateWorkspace 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"workspace_name":{"type":"string"},"organisation_id":{"type":"string"},"organisation_name":{"type":"string"},"workspace_schema_name":{"type":"string"},"workspace_status":{"type":"string","enum":["ENABLED","DISABLED"],"title":"WorkspaceStatus"},"workspace_admin_email":{"type":"string"},"config_version":{"type":"string"},"created_by":{"type":"string"},"last_modified_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"mandatory_dimensions":{"type":"array","items":{"type":"string"}},"metrics":{},"allow_experiment_self_approval":{"type":"boolean"},"auto_populate_control":{"type":"boolean"},"enable_context_validation":{"type":"boolean"},"enable_change_reason_validation":{"type":"boolean"}},"required":["allow_experiment_self_approval","auto_populate_control","created_at","created_by","enable_change_reason_validation","enable_context_validation","last_modified_at","last_modified_by","metrics","organisation_id","organisation_name","workspace_admin_email","workspace_name","workspace_schema_name","workspace_status"],"title":"UpdateWorkspaceResponseContent"}}}},"404":{"description":"ResourceNotFound 404 response"},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}}}} \ No newline at end of file +{"responses":{"200":{"description":"UpdateWorkspace 200 response","content":{"application/json":{"schema":{"type":"object","properties":{"workspace_name":{"type":"string"},"organisation_id":{"type":"string"},"organisation_name":{"type":"string"},"workspace_schema_name":{"type":"string"},"workspace_status":{"type":"string","enum":["ENABLED","DISABLED"],"title":"WorkspaceStatus"},"workspace_admin_email":{"type":"string"},"config_version":{"type":"string"},"created_by":{"type":"string"},"last_modified_by":{"type":"string"},"last_modified_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"mandatory_dimensions":{"type":"array","items":{"type":"string"}},"metrics":{},"allow_experiment_self_approval":{"type":"boolean"},"auto_populate_control":{"type":"boolean"},"enable_context_validation":{"type":"boolean"},"enable_change_reason_validation":{"type":"boolean"},"workspace_lock":{"type":"object","description":"Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease.","properties":{"lock_id":{"type":"string","description":"Unique identifier for the active workspace lock."},"operation":{"type":"string","description":"Write operation that currently holds the workspace lock."},"locked_by":{"type":"string","description":"User that acquired the workspace lock."},"acquired_at":{"type":"string","description":"Timestamp at which the workspace lock was acquired.","format":"date-time"},"expires_at":{"type":"string","description":"Timestamp at which the workspace lock expires if it is not released first.","format":"date-time"}},"required":["acquired_at","expires_at","lock_id","locked_by","operation"],"title":"WorkspaceLock"}},"required":["allow_experiment_self_approval","auto_populate_control","created_at","created_by","enable_change_reason_validation","enable_context_validation","last_modified_at","last_modified_by","metrics","organisation_id","organisation_name","workspace_admin_email","workspace_name","workspace_schema_name","workspace_status"],"title":"UpdateWorkspaceResponseContent"}}}},"404":{"description":"ResourceNotFound 404 response"},"500":{"description":"InternalServerError 500 response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"title":"InternalServerErrorResponseContent"}}}}}} \ No newline at end of file diff --git a/docs/docs/api/update-workspace.api.mdx b/docs/docs/api/update-workspace.api.mdx index 5c7d78be7..59467d17a 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: eJzdV99v2zYQ/lcIPm2AnBhZ8+K3pE3RAFtRxO724BoCLZ1tthLJkVRiw/D/vjtStmRbdhIsfdj6kNLkd8f7+R215jm4zErjpVZ8wL+aXHhwTCgGS+m8VHP2pO0PZ0QGLNNqJueVFYROmCgK/USIUudyJrOwzfSMibyUijnwJO8SVgqFarVdsVyWoBzCcBc3W7qN1Qasl+Au2J+ikNGOeCN7BEtC0SZQCJczkniUOeQXPOEkG66/z3de/LXVjecW/q7A+Vudr/hgzVEtqvG0FMYUtemX3x0FYc1dtoBS0MqvDKBCPf0OmUc9jZV0urM+DR6nKCSLlpjzFgPANwmPfqS1H8eQ5CAPI80qhQE8CEDCjHCOfeOqKopvnEXpC7phF+O0iXHrHmGtWOE10kPpOkxEDY03zgtfdaASDqoq+WDM7z7f3P5+9wF3PtwP43KScC99QfBd5IdREZkHqCIjnfgjFE4KSwwl2epTB8UsxUxgRkU7gFOtCxCKFIjK69RoUxWY2pQSaPUJKCgxLSIGlj59jNW0H/cO+EKoOaQWBFbBM0KbxteDWnuIhfa+LrDNhrBGWIEBwBxi7NZc4Q+UbOIdNjA3lHkj/ALXRyXY1BLVsrSAhe5tBZtkp3DZ03bek/lW1QJEDvZVyia04wzWTqzwq36f/usiiZ3LDEFsK8WTt2+u6F6H8eiuUNIF/Sn6/SzmpKZW7QfzXoR8+y55O0IhCJayhzydrjqPC+F8Gpn7pSDhu7ydaVvSCaeq6Hns6Pbtr5H59xz2v6OZpj/Hz/lzyvi9XOyVxfNGnfOyozo6qqrJyXG/dnXnqSZIjvmyu2k7WnRyhq4jbe3z9bv+u2PWQ6iubAaftf+oK3y7IKqhPZS67uLKe9RrlSiGYLFX76zVll3/FL4swTkx7yKt1rTqMKcrBCQh5jStGpZifwiF+qnwKKCY1YXO48DKaGKFwTXgl7vou8v1fso2NIogq6z0qzAIXSn9YnUhjLxYeG9uhZPZTUVqxhOaa4fnICzYHWDSaBtSjGIYTuvcxYX2j15cn0ajLyygGbbRAr2sE7Gdn6Ez6Zxyfcayl1wT4OfuCYCQOSqDh+b1ercUpSngzOuzIdnDGdGcdBPteAuYdI251jR7FcvSu+Ikr8bDM0y6DzjJnfElhM+emQ4ZqMt9WKFVRjtZB7gJxVX/6rrX/63Xv6Z0IsRjTEi0fktFnmDtb4i9RLa+If6zH011nVLML00hZBhTlQ3jLnbzuKkD4u/BAQVjnSwwcoRbr7E34KstNhvaxnq11OO4fBRWUvZCx+fI9bhG3piJwsGZoP7yUE++X9kpU7fPAkVTBquhol+4/AGr4+f1Bhll+yJ+c0vija33984aorF4WvNrb0QKGsQR5TcSN1kGxp/Fton4y83o/SdET+uPXCwwErLiiT6A8W8Ijg4eBqoMe2sc2WpehcnBo1L69w83tMJW +api: eJzdWEtv2zgQ/iuETruA7BjZ5pJb0mbRAG0R5LE9pIbASGOLjUxqSSqOYfi/d4aUJdminASbPezm4NDkzHAe3zzodZSBSbUorVAyOo3uyoxbMIxLBs/CWCHnbKn0oyl5CixVcibmleZEHTNeFGpJFAuViZlI3TZTM8azhZDMgCV+E7MFlyhW6RXLxAKkQTLcxc2O7FKrErQVYMbsL14Ir4e/kT2BJiavE0gkFzPieBIZZOMojojXXX+ZNVZ838rGcw1/V2DsucpW0ek6QrEoxtKSl2VRq37005AT1pFJc1hwWtlVCShQPfyE1KKcVks6bbRPnMUJMomiw2asRgdEmzjydiS1HX2SeC8Ot4pVEh2454CYldwY9iOSVVH8iJjnHtMNjY+T1sede7jWfIXXCAsLE1ARJbTWGMttFaCKI5DVIjq9jy6+nZ1/ufiEO58ub/xyGkdW2ILIG8/feEGkHqCIlGTiFwecBJ7RlaSrTQwUswQjgRHlXQc+KFUAlySAV1YlpSqrAkObUAC1GiAFyR8KTwPPNnnyaNr1e4A853IOiQaOKHiBadPauoe1aw+0jzXANhuiLbnm6ACMIfpuHUn8gpytv90GxoYiX3Kb47oHwRZLhGWhAYFudQWbuBH4PFJ6PhLZVlQOPAP9JmFT2jElYscj/HgyoX+hItGYzJCIbbmi+P2Ty5sXUB7N5VIYJz9Bu1+kGZTUwb5T71WU758l71dQiAShbCFLHlbB44Ibm/jK/VoibkPWzpRe0ElEqBhZzOju7W/h+ec17P9VZrqAKFT6GEqa3dT8CpajPM7QwdTEeWrFE3Ta7FKj9xgJG7MrTFp0C1OyWLFlLgpAFmVz0DVZ01WZMCxXRUbNHs878lBRA+Ne8tIFwYzcV/hOCiyYDPu4tAQy7TSnO3qqO6VdSm/Veln89z07bM6xp1Za43VoNNlk9i3aXkOLgczoWWFAe9k89fV0SOj2fCAv9qYAhC1WmUXJUDIGKM0DYtmSm+ba8WBuYRoggXnHe2uJNIoJSwhB7GAfcIjI2ExoY4fU2Wk89ztO2dE0boDUDUcXAaF6+oVSpXfH4WIwlPk7hWynpr6c0YdKRKC0BkpyW9D6zS7U2oY6SNwfNsIdL9DfpgdmHd/zd4edD5MP/ZEBSVWlU/im7J+qwsEfqdqZAblOQoPGJcrVkhc3oLHRXWiNpeHkXxk2EO+Gz0MdvzPqBdQJuYA4+JxGvRaS7CuXKJ+ARw7FqOYq89NeSuOem/pOo6PG++ZovRuyDc1xgKVL2JWbIs1C2Hw15qUY59aW59yI9KwiMfdTGgr3z4Fr0A3BtJV2Qz7ybhiW2fiF9nsF4/Pt7RVz1AzTKKdanm5x7kLg2hqdU6wPaPaaaxz5oXscgYscweC6ffpdPGNNK+DA062tiPsDVnsSnlLutwTT0IzYGQXfNKLQUD44lPjDA2PILsHg4OGfEfhmmCkXgRruNxVqVSojage3rjieHJ+MJn+MJicUTiSx6BNirR8ivk6w7gN8J5CdB/h/9heHGqfk86Oy4MKNa5V2s6LP5vsWB1S/T/dKMOIkR88R3XqNuQF3uthsaBvxqinHcfnEtaDouYzPsNbjGuvGjBcGDjj1t+u68/3OhlTdztSSugyioaJvuHyEVf9tusGKsn1Ovrsm/sbO47XRhsqYP63r6+iWBLQUvZLfcpylKZT2IG23EF+d3X78jNQP9S9ECDBi0nxJvx7hp3OOcha6Uun2cNDFpKpc54i8UPr7BRQ36tQ= sidebar_class_name: "patch api-method" info_path: docs/api/superposition custom_edit_url: null diff --git a/smithy/models/default-config.smithy b/smithy/models/default-config.smithy index 6243f347d..af007ec9a 100644 --- a/smithy/models/default-config.smithy +++ b/smithy/models/default-config.smithy @@ -89,7 +89,7 @@ operation GetDefaultConfig with [GetOperation] { @documentation("Creates a new default config entry with specified key, value, schema, and metadata. Default configs serve as fallback values when no specific context matches.") @http(method: "POST", uri: "/default-config") @tags(["Default Configuration"]) -operation CreateDefaultConfig with [WebhookOperation] { +operation CreateDefaultConfig with [WebhookOperation, WorkspaceWriteOperation] { input := with [DefaultConfigMixin, WorkspaceMixin] {} output: DefaultConfigResponse } @@ -115,7 +115,7 @@ operation ListDefaultConfigs { @idempotent @http(method: "PATCH", uri: "/default-config/{key}") @tags(["Default Configuration"]) -operation UpdateDefaultConfig with [GetOperation, WebhookOperation] { +operation UpdateDefaultConfig with [GetOperation, WebhookOperation, WorkspaceWriteOperation] { input := for DefaultConfig with [WorkspaceMixin] { @httpLabel @required @@ -144,7 +144,7 @@ operation UpdateDefaultConfig with [GetOperation, WebhookOperation] { @idempotent @http(method: "DELETE", uri: "/default-config/{key}", code: 204) @tags(["Default Configuration"]) -operation DeleteDefaultConfig with [GetOperation, WebhookOperation] { +operation DeleteDefaultConfig with [GetOperation, WebhookOperation, WorkspaceWriteOperation] { input := for DefaultConfig with [WorkspaceMixin] { @httpLabel @required diff --git a/smithy/models/main.smithy b/smithy/models/main.smithy index 1fbeb934a..e67e344d5 100644 --- a/smithy/models/main.smithy +++ b/smithy/models/main.smithy @@ -97,6 +97,17 @@ structure WebhookFailed { data: Document } +@documentation("Returned when a workspace write operation cannot proceed because another write operation currently holds the workspace lock.") +@httpError(409) +@error("client") +structure WorkspaceLockConflict { + @required + message: String + + @required + lock: WorkspaceLock +} + @mixin operation GetOperation { errors: [ @@ -111,6 +122,13 @@ operation WebhookOperation { ] } +@mixin +operation WorkspaceWriteOperation { + errors: [ + WorkspaceLockConflict + ] +} + @timestampFormat("date-time") timestamp DateTime diff --git a/smithy/models/workspace.smithy b/smithy/models/workspace.smithy index 9831c033d..43ad8da0c 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 + workspace_lock: WorkspaceLock } list: ListWorkspace update: UpdateWorkspace @@ -44,6 +45,29 @@ list ListMandatoryDimensions { member: String } +@documentation("Metadata for an active workspace write lock. Present only while another write operation is holding the workspace lease.") +structure WorkspaceLock { + @required + @documentation("Unique identifier for the active workspace lock.") + lock_id: String + + @required + @documentation("Write operation that currently holds the workspace lock.") + operation: String + + @required + @documentation("User that acquired the workspace lock.") + locked_by: String + + @required + @documentation("Timestamp at which the workspace lock was acquired.") + acquired_at: DateTime + + @required + @documentation("Timestamp at which the workspace lock expires if it is not released first.") + expires_at: DateTime +} + structure CreateWorkspaceRequest for Workspace with [OrganisationMixin] { @required $workspace_admin_email @@ -144,6 +168,8 @@ structure WorkspaceResponse for Workspace { @required $enable_change_reason_validation + + $workspace_lock } list WorkspaceList { diff --git a/smithy/patches/java.patch b/smithy/patches/java.patch index 96ea81f8e..d67670ce5 100644 --- a/smithy/patches/java.patch +++ b/smithy/patches/java.patch @@ -258,7 +258,8 @@ index a1dfbada..589784f9 100644 - "organisation_id", PreludeSchemas.STRING, - "allow_experiment_self_approval", PreludeSchemas.BOOLEAN, - "workspace_schema_name", PreludeSchemas.STRING, -- "metrics", PreludeSchemas.DOCUMENT); +- "metrics", PreludeSchemas.DOCUMENT, +- "workspace_lock", WorkspaceLock.$SCHEMA); + private static final Map $PROPERTIES = Map.ofEntries( + Map.entry("workspace_admin_email", PreludeSchemas.STRING), + Map.entry("auto_populate_control", PreludeSchemas.BOOLEAN), @@ -275,7 +276,9 @@ index a1dfbada..589784f9 100644 + Map.entry("organisation_id", PreludeSchemas.STRING), + Map.entry("allow_experiment_self_approval", PreludeSchemas.BOOLEAN), + Map.entry("workspace_schema_name", PreludeSchemas.STRING), -+ Map.entry("metrics", PreludeSchemas.DOCUMENT)); ++ Map.entry("metrics", PreludeSchemas.DOCUMENT), ++ Map.entry("workspace_lock", WorkspaceLock.$SCHEMA)); private static final List $OPERATIONS = List.of(CreateWorkspace.$SCHEMA, - MigrateWorkspaceSchema.$SCHEMA); + MigrateWorkspaceSchema.$SCHEMA, + RotateWorkspaceEncryptionKey.$SCHEMA);