From 2d9030bc60e40bfed29310ca5bd81046cc469a0c Mon Sep 17 00:00:00 2001
From: ko_oler <kooler89@gmail.com>
Date: Mon, 5 Feb 2024 12:16:39 +0300
Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20FromMap=20=D0=B4?=
 =?UTF-8?q?=D0=BB=D1=8F=20=D1=82=D0=B8=D0=BF=D0=B0=20ID?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 id/client.go       |  1 +
 id/collection.go   |  1 +
 id/environment.go  |  1 +
 id/field.go        |  1 +
 id/id.go           | 37 +++++++++++++++++++++++++++++++++++++
 id/id_test.go      |  4 ++--
 id/item.go         |  1 +
 id/organization.go |  1 +
 id/revision.go     |  1 +
 id/role.go         | 20 +-------------------
 id/schema.go       |  7 ++++---
 id/service.go      |  1 +
 id/space.go        |  1 +
 id/user.go         |  1 +
 14 files changed, 54 insertions(+), 24 deletions(-)

diff --git a/id/client.go b/id/client.go
index c3c9a403..623ef05c 100644
--- a/id/client.go
+++ b/id/client.go
@@ -20,6 +20,7 @@ func (t *ClientID) String() string {
 func (t *ClientID) ToMap() map[string]any {
 	m := t.SpaceID.ToMap()
 	m["client_id"] = t.ClientID
+	m["type"] = Client
 	return m
 }
 
diff --git a/id/collection.go b/id/collection.go
index 075abc84..26057019 100644
--- a/id/collection.go
+++ b/id/collection.go
@@ -19,6 +19,7 @@ func (t *CollectionID) String() string {
 func (t *CollectionID) ToMap() map[string]any {
 	m := t.EnvironmentID.ToMap()
 	m["col_id"] = t.CollectionID
+	m["type"] = Collection
 	return m
 }
 
diff --git a/id/environment.go b/id/environment.go
index ec8643a3..f1bbb540 100644
--- a/id/environment.go
+++ b/id/environment.go
@@ -20,6 +20,7 @@ func (t *EnvironmentID) String() string {
 func (t *EnvironmentID) ToMap() map[string]any {
 	m := t.SpaceID.ToMap()
 	m["env_id"] = t.EnvironmentID
+	m["type"] = Environment
 	return m
 }
 
diff --git a/id/field.go b/id/field.go
index b30eb591..dbba11d7 100644
--- a/id/field.go
+++ b/id/field.go
@@ -20,6 +20,7 @@ func (t *FieldID) String() string {
 func (t *FieldID) ToMap() map[string]any {
 	m := t.ItemID.ToMap()
 	m["field_name"] = t.FieldName
+	m["type"] = Field
 	return m
 }
 
diff --git a/id/id.go b/id/id.go
index a1931feb..d333b618 100644
--- a/id/id.go
+++ b/id/id.go
@@ -92,3 +92,40 @@ func Join(parts ...string) string {
 	}
 	return s
 }
+
+func (id *ID) FromMap(m map[string]any) error {
+	if m == nil {
+		return errors.New("nil map")
+	}
+
+	switch m["type"] {
+	case Organization:
+		id.Descriptor = new(OrganizationID)
+	case Service:
+		id.Descriptor = new(ServiceID)
+	case User:
+		id.Descriptor = new(UserID)
+	case Space:
+		id.Descriptor = new(SpaceID)
+	case Environment:
+		id.Descriptor = new(EnvironmentID)
+	case Client:
+		id.Descriptor = new(ClientID)
+	case Role:
+		id.Descriptor = new(RoleID)
+	case Collection:
+		id.Descriptor = new(CollectionID)
+	case Schema:
+		id.Descriptor = new(SchemaID)
+	case Item:
+		id.Descriptor = new(ItemID)
+	case Revision:
+		id.Descriptor = new(RevisionID)
+	case Field:
+		id.Descriptor = new(FieldID)
+	default:
+		return errors.New("type of ID not specified in map")
+	}
+	_ = id.Descriptor.FromMap(m)
+	return nil
+}
diff --git a/id/id_test.go b/id/id_test.go
index 1a728406..757586d8 100644
--- a/id/id_test.go
+++ b/id/id_test.go
@@ -282,9 +282,9 @@ func Test_Map(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			v := tt.id
+			v := new(ID)
 			_ = v.FromMap(tt.id.ToMap())
-			require.Equal(t, tt.id, v)
+			require.Equal(t, tt.id, v, "проверка FromMap для типа ID, должен быть равен исходному значению")
 			require.Equal(t, v.ToMap(), tt.id.ToMap())
 		})
 	}
diff --git a/id/item.go b/id/item.go
index 1668dd16..d32f0ccc 100644
--- a/id/item.go
+++ b/id/item.go
@@ -20,6 +20,7 @@ func (t *ItemID) String() string {
 func (t *ItemID) ToMap() map[string]any {
 	m := t.CollectionID.ToMap()
 	m["item_id"] = t.ItemID
+	m["type"] = Item
 	return m
 }
 
diff --git a/id/organization.go b/id/organization.go
index 7f2ca659..ed870743 100644
--- a/id/organization.go
+++ b/id/organization.go
@@ -18,6 +18,7 @@ func (t *OrganizationID) String() string {
 func (t *OrganizationID) ToMap() map[string]any {
 	return map[string]any{
 		"organization_id": t.OrganizationID,
+		"type":            Organization,
 	}
 }
 
diff --git a/id/revision.go b/id/revision.go
index 3a111dfe..6752e84d 100644
--- a/id/revision.go
+++ b/id/revision.go
@@ -20,6 +20,7 @@ func (t *RevisionID) String() string {
 func (t *RevisionID) ToMap() map[string]any {
 	m := t.ItemID.ToMap()
 	m["rev_id"] = t.RevisionID
+	m["type"] = Revision
 	return m
 }
 
diff --git a/id/role.go b/id/role.go
index 7080b23e..b71f0f99 100644
--- a/id/role.go
+++ b/id/role.go
@@ -20,6 +20,7 @@ func (t *RoleID) String() string {
 func (t *RoleID) ToMap() map[string]any {
 	m := t.SpaceID.ToMap()
 	m["role_id"] = t.RoleID
+	m["type"] = Role
 	return m
 }
 
@@ -54,22 +55,3 @@ func parseRoleID(parts []string) (*RoleID, error) {
 	id.RoleID = parts[3]
 	return &id, nil
 }
-
-//
-//func (t *RoleID) UnmarshalJSON(b []byte) error {
-//	var data string
-//	if err := jsoniter.Unmarshal(b, &data); err != nil {
-//		return err
-//	}
-//	knownID, err := Parse(data)
-//	if err != nil {
-//		return err
-//	}
-//	t.SpaceID = knownID.(*RoleID).SpaceID
-//	t.RoleID = knownID.(*RoleID).RoleID
-//	return nil
-//}
-//
-//func (t *RoleID) MarshalJSON() ([]byte, error) {
-//	return []byte(t.String()), nil
-//}
diff --git a/id/schema.go b/id/schema.go
index d77577a0..b845b70b 100644
--- a/id/schema.go
+++ b/id/schema.go
@@ -7,7 +7,7 @@ const (
 
 type SchemaID struct {
 	EnvironmentID
-	CollectionID string `json:"collection_id"`
+	CollectionID string `json:"col_id"`
 }
 
 func (t *SchemaID) Type() string { return Schema }
@@ -18,7 +18,8 @@ func (t *SchemaID) String() string {
 
 func (t *SchemaID) ToMap() map[string]any {
 	m := t.EnvironmentID.ToMap()
-	m["collection_id"] = t.CollectionID
+	m["col_id"] = t.CollectionID
+	m["type"] = Schema
 	return m
 }
 
@@ -26,7 +27,7 @@ func (t *SchemaID) FromMap(m map[string]any) error {
 	if err := t.EnvironmentID.FromMap(m); err != nil {
 		return err
 	}
-	t.CollectionID = m["collection_id"].(string)
+	t.CollectionID = m["col_id"].(string)
 	return nil
 }
 
diff --git a/id/service.go b/id/service.go
index 6c3a4400..dd52fc09 100644
--- a/id/service.go
+++ b/id/service.go
@@ -18,6 +18,7 @@ func (t *ServiceID) String() string {
 func (t *ServiceID) ToMap() map[string]any {
 	return map[string]any{
 		"service_id": t.ServiceID,
+		"type":       Service,
 	}
 }
 
diff --git a/id/space.go b/id/space.go
index 3d9d6c35..aadcacc6 100644
--- a/id/space.go
+++ b/id/space.go
@@ -18,6 +18,7 @@ func (t *SpaceID) String() string {
 func (t *SpaceID) ToMap() map[string]any {
 	return map[string]any{
 		"space_id": t.SpaceID,
+		"type":     Space,
 	}
 }
 
diff --git a/id/user.go b/id/user.go
index 1abaa0df..5422bd24 100644
--- a/id/user.go
+++ b/id/user.go
@@ -18,6 +18,7 @@ func (t *UserID) String() string {
 func (t *UserID) ToMap() map[string]any {
 	return map[string]any{
 		"user_id": t.UserID,
+		"type":    User,
 	}
 }
 
-- 
GitLab