From fa4e96c669ff2083482ed8e219fa6ae8d7960ab9 Mon Sep 17 00:00:00 2001
From: Alena Petraki <a.petraki@perx.ru>
Date: Tue, 7 May 2024 11:26:14 +0000
Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?=
 =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?=
 =?UTF-8?q?=E2=80=9Cfailed=20to=20run=20space=20migrations:=20namespace=20?=
 =?UTF-8?q?xxx.migrations=20already=20exists=E2=80=9D=20=D0=BF=D1=80=D0=B8?=
 =?UTF-8?q?=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=B5=20=D0=BA=20=D0=BE?=
 =?UTF-8?q?=D0=BA=D1=80=D1=83=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC=20=D0=BF?=
 =?UTF-8?q?=D1=80=D0=BE=D1=81=D1=82=D1=80=D0=B0=D0=BD=D1=81=D1=82=D0=B2?=
 =?UTF-8?q?=D0=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/spaces/errors.go  | 12 ++++++++++++
 pkg/spaces/space.go   | 22 ++++++++++++++++------
 pkg/spaces/storage.go |  1 +
 3 files changed, 29 insertions(+), 6 deletions(-)
 create mode 100644 pkg/spaces/errors.go

diff --git a/pkg/spaces/errors.go b/pkg/spaces/errors.go
new file mode 100644
index 00000000..c9e66fa6
--- /dev/null
+++ b/pkg/spaces/errors.go
@@ -0,0 +1,12 @@
+package spaces
+
+import (
+	"git.perx.ru/perxis/perxis-go/pkg/errors"
+	"git.perx.ru/perxis/perxis-go/pkg/service"
+)
+
+var (
+	ErrNotFound      = service.ErrNotFound
+	ErrStateConflict = errors.New("state conflicts with current space state")
+	ErrOrgIDRequired = errors.New("organization id required")
+)
diff --git a/pkg/spaces/space.go b/pkg/spaces/space.go
index 482a953b..985cd6c5 100644
--- a/pkg/spaces/space.go
+++ b/pkg/spaces/space.go
@@ -10,9 +10,17 @@ const (
 	StateReady             // Пространство готово к использованию
 	StatePreparing         // Пространство готовится в использованию
 	StateMaintenance       // Пространство находится на обслуживании
-	StateMigration         // Пространство в состоянии выполнения миграций
-	StateDeleting          // Пространство удаляется, данные будут удалены
-	StateError             // Произошла ошибка при конфигурации пространства (см. Space.Error)
+
+	// StateMigrationScheduled Для пространства запланирована миграция
+	// При планировании запуска миграции пространства это состояние выступает в роли Lock'а, который не
+	// позволяет запустить несколько миграций одновременно. Логика планировщика миграций сначала пытается
+	// установить для пространства состояние StateMigrationScheduled, что удается только в двух случаях:
+	// пространство находится в состоянии StateReady или же в состояниях StateMigration, StateMigrationScheduled,
+	// но последнее обновление состояния было более 15-ти минут назад
+	StateMigrationScheduled
+	StateMigration // Пространство в состоянии выполнения миграций
+	StateDeleting  // Пространство удаляется, данные будут удалены
+	StateError     // Произошла ошибка при конфигурации пространства (см. Space.Error)
 )
 
 func (s State) String() string {
@@ -25,6 +33,8 @@ func (s State) String() string {
 		return "Preparing"
 	case StateMaintenance:
 		return "Maintenance"
+	case StateMigrationScheduled:
+		return "MigrationScheduled"
 	case StateMigration:
 		return "Migration"
 	case StateDeleting:
@@ -55,10 +65,10 @@ type Space struct {
 }
 
 type StateInfo struct {
-	State     State     `json:"state" bson:"state"`
-	Info      string    `json:"info" bson:"info"`
+	State     State     `json:"state" bson:"state,omitempty"`
+	Info      string    `json:"info" bson:"info,omitempty"`
 	Time      time.Time `json:"time,omitempty" bson:"time,omitempty"`
-	DBVersion uint32    `json:"db_version" bson:"db_version"`
+	DBVersion uint32    `json:"db_version" bson:"db_version,omitempty"`
 }
 
 func (s Space) Clone() *Space {
diff --git a/pkg/spaces/storage.go b/pkg/spaces/storage.go
index 798dd96b..a489c0b5 100644
--- a/pkg/spaces/storage.go
+++ b/pkg/spaces/storage.go
@@ -21,4 +21,5 @@ type Filter struct {
 	Name          []string `json:"name,omitempty" bson:"name"`
 	State         []State  `json:"state,omitempty" bson:"state"`
 	TransferToOrg []string `json:"transfer_to_org" bson:"transfer_to_org"`
+	Q             []string `json:"q" bson:"q"`
 }
-- 
GitLab