Skip to content
Snippets Groups Projects
Commit 726646ee authored by ko_oler's avatar ko_oler
Browse files

добавлены и зарегистрированы недостающие типы, исправлены тесты

parent 4b6aa6f3
No related branches found
No related tags found
No related merge requests found
package id
const (
Space = "space"
SpacesPrefix = "spaces"
)
type SpaceID struct {
SpaceID string `json:"space_id,omitempty" bson:"space_id,omitempty"`
}
func (t *SpaceID) Type() string { return Space }
func (t *SpaceID) String() string {
return Join(SpacesPrefix, t.SpaceID)
}
func (t *SpaceID) Map() map[string]any {
return map[string]any{
"space_id": t.SpaceID,
"type": Space,
}
}
func (t *SpaceID) FromMap(m map[string]any) error {
t.SpaceID = m["space_id"].(string)
return nil
}
func (t *SpaceID) Validate() error {
if t.SpaceID == "" {
return ErrInvalidID
}
return nil
}
func parseSpaceID(parts []string) (*SpaceID, error) {
var id SpaceID
if len(parts) != 2 || parts[0] != SpacesPrefix {
return nil, ErrInvalidID
}
id.SpaceID = parts[1]
return &id, nil
}
func NewSpaceID(id string) *ID {
return &ID{Descriptor: &SpaceID{SpaceID: id}}
}
......@@ -11,64 +11,64 @@ import (
func TestID_MarshalUnmarshalBSON(t *testing.T) {
tests := []struct {
name string
id *ID
id *ObjectId
}{
{
name: "OrganizationID",
id: &ID{Descriptor: &OrganizationID{OrganizationID: "1"}},
id: &ObjectId{Descriptor: &OrganizationId{OrganizationID: "1"}},
},
{
name: "UserID",
id: &ID{Descriptor: &UserID{UserID: "1"}},
id: &ObjectId{Descriptor: &UserId{UserID: "1"}},
},
{
name: "ServiceID",
id: &ID{Descriptor: &ServiceID{ServiceID: "1"}},
id: &ObjectId{Descriptor: &ServiceId{ServiceID: "1"}},
},
{
name: "SpaceId",
id: &ID{Descriptor: &SpaceID{SpaceID: "1"}},
id: &ObjectId{Descriptor: &SpaceId{SpaceID: "1"}},
},
{
name: "EnvironmentID",
id: &ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
id: &ObjectId{Descriptor: &EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}},
},
{
name: "ClientID",
id: &ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
id: &ObjectId{Descriptor: &ClientId{ClientID: "1", SpaceId: SpaceId{SpaceID: "1"}}},
},
{
name: "RoleID",
id: &ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
id: &ObjectId{Descriptor: &RoleId{RoleID: "1", SpaceId: SpaceId{SpaceID: "1"}}},
},
{
name: "CollectionId",
id: &ID{Descriptor: &CollectionId{CollectionID: "1", EnvironmentId: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
id: &ObjectId{Descriptor: &CollectionId{CollectionID: "1", EnvironmentId: EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}}},
},
{
name: "SchemaID",
id: &ID{Descriptor: &SchemaID{CollectionId: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
id: &ObjectId{Descriptor: &SchemaId{CollectionID: "1", EnvironmentId: EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}}},
},
{
name: "ItemId",
id: &ID{Descriptor: &ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}},
id: &ObjectId{Descriptor: &ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}}}},
},
{
name: "RevisionID",
id: &ID{Descriptor: &RevisionID{RevisionID: "1", ItemId: ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
id: &ObjectId{Descriptor: &RevisionId{RevisionID: "1", ItemId: ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}}}}},
},
{
name: "FieldId",
id: &ID{Descriptor: &FieldId{FieldName: "1", ItemId: ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
id: &ObjectId{Descriptor: &FieldId{Field: "1", ItemId: ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}}}}},
},
{
name: "SystemID",
id: &ID{Descriptor: &SystemID{}},
id: &ObjectId{Descriptor: &SystemId{}},
},
}
type test struct {
Text string
ID *ID
ID *ObjectId
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
......@@ -86,13 +86,14 @@ func TestID_MarshalUnmarshalBSON(t *testing.T) {
func TestID_ExampleBSON(t *testing.T) {
type data struct {
ID *ID
ID *ObjectId
Text string
Number int
}
test := &data{
ID: &ID{Descriptor: &SpaceID{SpaceID: Space}},
ID: &ObjectId{Descriptor: &SpaceId{SpaceID: Space}},
Text: "text",
Number: 1,
}
......
package id
import "fmt"
const (
Client = "client"
ClientsPrefix = "clients"
)
var _ Descriptor = &ClientId{}
type ClientId struct {
SpaceId
ClientID string `json:"client_id,omitempty" bson:"client_id,omitempty"`
}
func (id *ClientId) New() Descriptor {
return &ClientId{}
}
func (id *ClientId) Type() string { return Client }
func (id *ClientId) String() string {
return Join(id.SpaceId.String(), ClientsPrefix, id.ClientID)
}
func (id *ClientId) FromParts(parts []string) error {
if len(parts) != 4 || parts[2] != ClientsPrefix {
return ErrInvalid
}
if err := id.SpaceId.FromParts(parts[:2]); err != nil {
return err
}
id.ClientID = parts[3]
return nil
}
func (id *ClientId) Map() map[string]any {
m := id.SpaceId.Map()
m["client_id"] = id.ClientID
m["type"] = Client
return m
}
func (id *ClientId) FromMap(m map[string]any) error {
id.ClientID, _ = m["client_id"].(string)
if id.ClientID == "" {
return fmt.Errorf("%w: ClientID required", ErrInvalid)
}
return id.SpaceId.FromMap(m)
}
func (id *ClientId) Validate() error {
if id.ClientID == "" {
return fmt.Errorf("%w: ClientID required", ErrInvalid)
}
return id.SpaceId.Validate()
}
......@@ -18,15 +18,15 @@ func (id *CollectionId) New() Descriptor {
return &CollectionId{}
}
func (t *CollectionId) Type() string { return Collection }
func (id *CollectionId) Type() string { return Collection }
func (t *CollectionId) String() string {
return Join(t.EnvironmentId.String(), CollectionsPrefix, t.CollectionID)
func (id *CollectionId) String() string {
return Join(id.EnvironmentId.String(), CollectionsPrefix, id.CollectionID)
}
func (t *CollectionId) Map() map[string]any {
m := t.EnvironmentId.Map()
m["col_id"] = t.CollectionID
func (id *CollectionId) Map() map[string]any {
m := id.EnvironmentId.Map()
m["col_id"] = id.CollectionID
m["type"] = Collection
return m
}
......@@ -50,9 +50,9 @@ func (id *CollectionId) FromMap(m map[string]any) error {
return id.EnvironmentId.FromMap(m)
}
func (t *CollectionId) Validate() error {
if t.CollectionID == "" {
func (id *CollectionId) Validate() error {
if id.CollectionID == "" {
return fmt.Errorf("%w: CollectionID required", ErrInvalid)
}
return t.EnvironmentId.Validate()
return id.EnvironmentId.Validate()
}
......@@ -12,51 +12,51 @@ type FieldId struct {
Field string `json:"field,omitempty" bson:"field,omitempty"`
}
func (i *FieldId) New() Descriptor {
func (id *FieldId) New() Descriptor {
return &FieldId{}
}
func (i *FieldId) Type() string { return Field }
func (id *FieldId) Type() string { return Field }
func (i *FieldId) String() string {
return Join(i.ItemId.String(), FieldsPrefix, i.Field)
func (id *FieldId) String() string {
return Join(id.ItemId.String(), FieldsPrefix, id.Field)
}
func (i *FieldId) FromParts(parts []string) error {
func (id *FieldId) FromParts(parts []string) error {
if len(parts) != 10 || parts[8] != FieldsPrefix {
return ErrInvalid
}
if err := i.ItemId.FromParts(parts[:8]); err != nil {
if err := id.ItemId.FromParts(parts[:8]); err != nil {
return err
}
i.Field = parts[9]
id.Field = parts[9]
return nil
}
func (i *FieldId) Map() map[string]any {
m := i.ItemId.Map()
m["field"] = i.Field
func (id *FieldId) Map() map[string]any {
m := id.ItemId.Map()
m["field"] = id.Field
m["type"] = Field
return m
}
func (i *FieldId) FromMap(m map[string]any) error {
i.Field = m["field"].(string)
if i.Field == "" {
func (id *FieldId) FromMap(m map[string]any) error {
id.Field = m["field"].(string)
if id.Field == "" {
return fmt.Errorf("%w: Field required", ErrInvalid)
}
if err := i.ItemId.FromMap(m); err != nil {
if err := id.ItemId.FromMap(m); err != nil {
return err
}
return nil
}
func (i *FieldId) Validate() error {
if i.Field == "" {
func (id *FieldId) Validate() error {
if id.Field == "" {
return fmt.Errorf("%w: Field required", ErrInvalid)
}
return i.ItemId.Validate()
return id.ItemId.Validate()
}
......@@ -11,59 +11,59 @@ import (
func TestID_MarshalUnmarshalJSON(t *testing.T) {
tests := []struct {
name string
id *ID
id *ObjectId
}{
{
name: "OrganizationID",
id: &ID{Descriptor: &OrganizationID{OrganizationID: "1"}},
id: &ObjectId{Descriptor: &OrganizationId{OrganizationID: "1"}},
},
{
name: "UserID",
id: &ID{Descriptor: &UserID{UserID: "1"}},
id: &ObjectId{Descriptor: &UserId{UserID: "1"}},
},
{
name: "ServiceID",
id: &ID{Descriptor: &ServiceID{ServiceID: "1"}},
id: &ObjectId{Descriptor: &ServiceId{ServiceID: "1"}},
},
{
name: "SpaceId",
id: &ID{Descriptor: &SpaceID{SpaceID: "1"}},
id: &ObjectId{Descriptor: &SpaceId{SpaceID: "1"}},
},
{
name: "EnvironmentID",
id: &ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
id: &ObjectId{Descriptor: &EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}},
},
{
name: "ClientID",
id: &ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
id: &ObjectId{Descriptor: &ClientId{ClientID: "1", SpaceId: SpaceId{SpaceID: "1"}}},
},
{
name: "RoleID",
id: &ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
id: &ObjectId{Descriptor: &RoleId{RoleID: "1", SpaceId: SpaceId{SpaceID: "1"}}},
},
{
name: "CollectionId",
id: &ID{Descriptor: &CollectionId{CollectionID: "1", EnvironmentId: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
id: &ObjectId{Descriptor: &CollectionId{CollectionID: "1", EnvironmentId: EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}}},
},
{
name: "SchemaID",
id: &ID{Descriptor: &SchemaID{CollectionId: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
id: &ObjectId{Descriptor: &SchemaId{CollectionID: "1", EnvironmentId: EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}}},
},
{
name: "ItemId",
id: &ID{Descriptor: &ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}},
id: &ObjectId{Descriptor: &ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}}}},
},
{
name: "RevisionID",
id: &ID{Descriptor: &RevisionID{RevisionID: "1", ItemId: ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
id: &ObjectId{Descriptor: &RevisionId{RevisionID: "1", ItemId: ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}}}}},
},
{
name: "FieldId",
id: &ID{Descriptor: &FieldId{FieldName: "1", ItemId: ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
id: &ObjectId{Descriptor: &FieldId{Field: "1", ItemId: ItemId{ItemID: "1", CollectionId: CollectionId{CollectionID: "1", EnvironmentId: EnvironmentId{EnvironmentID: "1", SpaceId: SpaceId{SpaceID: "1"}}}}}},
},
{
name: "SystemID",
id: &ID{Descriptor: &SystemID{}},
id: &ObjectId{Descriptor: &SystemId{}},
},
}
for _, tt := range tests {
......@@ -71,7 +71,7 @@ func TestID_MarshalUnmarshalJSON(t *testing.T) {
b, err := jsoniter.Marshal(&tt.id)
require.NoError(t, err)
var i ID
var i ObjectId
require.NoError(t, jsoniter.Unmarshal(b, &i))
assert.Equal(t, tt.id, &i, "после Unmarshal объект должен быть идентичен исходному")
})
......@@ -80,13 +80,13 @@ func TestID_MarshalUnmarshalJSON(t *testing.T) {
func TestID_ExampleJSON(t *testing.T) {
type data struct {
ID *ID
ID *ObjectId
Text string
Number int
}
test := &data{
ID: &ID{Descriptor: &SpaceID{SpaceID: Space}},
ID: &ObjectId{Descriptor: &SpaceId{SpaceID: Space}},
Text: "text",
Number: 1,
}
......
......@@ -3,6 +3,7 @@ package id
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
......@@ -18,157 +19,92 @@ func Test_ParseID(t *testing.T) {
id: "/spaces/<space_id>",
result: MustObjectId("/spaces/<space_id>"),
},
{
name: "ServiceID",
id: "/services/<service_id>",
result: MustObjectId("/services/<service_id>"),
},
{
name: "UserID",
id: "/users/<user_id>",
result: MustObjectId("/users/<user_id>"),
},
{
name: "OrganizationID",
id: "/orgs/<org_id>",
result: MustObjectId("/orgs/<org_id>"),
},
{
name: "ClientID",
id: "/spaces/<space_id>/clients/<client_id>",
result: MustObjectId("/spaces/<space_id>/clients/<client_id>"),
},
{
name: "RoleID",
id: "/spaces/<space_id>/roles/<role_id>",
result: MustObjectId("/spaces/<space_id>/roles/<role_id>"),
},
{
name: "EnvironmentID",
id: "/spaces/<space_id>/envs/<env_id>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>"),
},
{
name: "CollectionId",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>"),
},
{
name: "SchemaID",
id: "/spaces/<space_id>/envs/<env_id>/schema/<collection_id>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>/schema/<collection_id>"),
},
{
name: "ItemId",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>"),
},
{
name: "RevisionID",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/revs/<rev_id>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/revs/<rev_id>"),
},
{
name: "FieldId",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/fields/<field_name>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/fields/<field_name>"),
},
{
name: "With error #1: no backslash in the beginning of id",
id: "spaces/<space_id>",
result: nil,
wantError: true,
},
{
name: "With error #2: backslash in the end of id",
id: "/spaces/<space_id>/",
result: nil,
wantError: true,
},
{
name: "With error #3: typo in 'spaces'",
id: "/space/<space_id>",
result: nil,
wantError: true,
},
{
name: "With error #4: no space_id in id",
id: "/spaces",
result: nil,
wantError: true,
},
{
name: "With error #5: multiple backslashes in the end of id",
id: "/spaces/<space_id>///",
result: nil,
wantError: true,
},
}
//{
// name: "ServiceID",
// id: "/services/<service_id>",
// result: &ID{Descriptor: &ServiceID{ServiceID: "<service_id>"}},
//},
//{
// name: "UserID",
// id: "/users/<user_id>",
// result: &ID{Descriptor: &UserID{UserID: "<user_id>"}},
//},
//{
// name: "OrganizationID",
// id: "/orgs/<org_id>",
// result: &ID{Descriptor: &OrganizationID{OrganizationID: "<org_id>"}},
//},
// {
// name: "SpaceId",
// id: "/spaces/<space_id>",
// result: &ID{Descriptor: &SpaceID{SpaceID: "<space_id>"}},
// },
// {
// name: "ClientID",
// id: "/spaces/<space_id>/clients/<client_id>",
// result: &ID{Descriptor: &ClientID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// ClientID: "<client_id>",
// }},
// },
// {
// name: "RoleID",
// id: "/spaces/<space_id>/roles/<role_id>",
// result: &ID{Descriptor: &RoleID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// RoleID: "<role_id>",
// }},
// },
// {
// name: "EnvironmentID",
// id: "/spaces/<space_id>/envs/<env_id>",
// result: &ID{Descriptor: &EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// }},
// },
// {
// name: "CollectionId",
// id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>",
// result: &ID{Descriptor: &CollectionId{
// EnvironmentID: EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// },
// CollectionId: "<collection_id>",
// }},
// },
// {
// name: "SchemaID",
// id: "/spaces/<space_id>/envs/<env_id>/schema/<collection_id>",
// result: &ID{Descriptor: &SchemaID{
// EnvironmentID: EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// },
// CollectionId: "<collection_id>",
// }},
// },
// {
// name: "ItemId",
// id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>",
// result: &ID{Descriptor: &ItemId{
// CollectionId: CollectionId{
// EnvironmentID: EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// },
// CollectionId: "<collection_id>",
// },
// ItemId: "<item_id>",
// }},
// },
// {
// name: "RevisionID",
// id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/revs/<rev_id>",
// result: &ID{Descriptor: &RevisionID{
// ItemId: ItemId{
// CollectionId: CollectionId{
// EnvironmentID: EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// },
// CollectionId: "<collection_id>",
// },
// ItemId: "<item_id>",
// },
// RevisionID: "<rev_id>",
// }},
// },
// {
// name: "FieldId",
// id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/fields/<field_name>",
// result: &ID{Descriptor: &FieldId{
// ItemId: ItemId{
// CollectionId: CollectionId{
// EnvironmentID: EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// },
// CollectionId: "<collection_id>",
// },
// ItemId: "<item_id>",
// },
// FieldName: "<field_name>",
// }},
// },
// {
// name: "SystemID",
// id: "/system",
// result: &ID{Descriptor: &SystemID{}},
// },
// {
// name: "With error #1: no backslash in the beginning of id",
// id: "spaces/<space_id>",
// result: nil,
// wantError: true,
// },
// {
// name: "With error #2: backslash in the end of id",
// id: "/spaces/<space_id>/",
// result: nil,
// wantError: true,
// },
// {
// name: "With error #3: typo in 'spaces'",
// id: "/space/<space_id>",
// result: nil,
// wantError: true,
// },
// {
// name: "With error #4: no space_id in id",
// id: "/spaces",
// result: nil,
// wantError: true,
// },
// {
// name: "With error #5: multiple backslashes in the end of id",
// id: "/spaces/<space_id>///",
// result: nil,
// wantError: true,
// },
//}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
id, err := NewObjectId(tt.id)
......@@ -183,124 +119,124 @@ func Test_ParseID(t *testing.T) {
}
}
//func Test_Map(t *testing.T) {
// tests := []struct {
// name string
// id *ID
// }{
// {
// name: "ServiceID",
// id: &ID{Descriptor: &ServiceID{ServiceID: "<service_id>"}},
// },
// {
// name: "UserID",
// id: &ID{Descriptor: &UserID{UserID: "<user_id>"}},
// },
// {
// name: "OrganizationID",
// id: &ID{Descriptor: &OrganizationID{OrganizationID: "<org_id>"}},
// },
// {
// name: "SpaceId",
// id: &ID{Descriptor: &SpaceID{SpaceID: "<space_id>"}},
// },
// {
// name: "ClientID",
// id: &ID{Descriptor: &ClientID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// ClientID: "<client_id>",
// }},
// },
// {
// name: "RoleID",
// id: &ID{Descriptor: &RoleID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// RoleID: "<role_id>",
// }},
// },
// {
// name: "EnvironmentID",
// id: &ID{Descriptor: &EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// }},
// },
// {
// name: "CollectionId",
// id: &ID{Descriptor: &CollectionId{
// EnvironmentId: EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// },
// CollectionID: "<collection_id>",
// }},
// },
// {
// name: "Schema ID",
// id: &ID{Descriptor: &SchemaID{
// EnvironmentID: EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// },
// CollectionId: "<collection_id>",
// }},
// },
// {
// name: "ItemId",
// id: &ID{Descriptor: &ItemId{
// CollectionId: CollectionId{
// EnvironmentId: EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// },
// CollectionID: "<collection_id>",
// },
// ItemID: "<item_id>",
// }},
// },
// {
// name: "RevisionID",
// id: &ID{Descriptor: &RevisionID{
// ItemId: ItemId{
// CollectionId: CollectionId{
// EnvironmentId: EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// },
// CollectionID: "<collection_id>",
// },
// ItemID: "<item_id>",
// },
// RevisionID: "<rev_id>",
// }},
// },
// {
// name: "FieldId",
// id: &ID{Descriptor: &FieldId{
// ItemId: ItemId{
// CollectionId: CollectionId{
// EnvironmentId: EnvironmentID{
// SpaceID: SpaceID{SpaceID: "<space_id>"},
// EnvironmentID: "<env_id>",
// },
// CollectionID: "<collection_id>",
// },
// ItemID: "<item_id>",
// },
// FieldName: "<field_name>",
// }},
// },
// {
// name: "SystemID",
// id: &ID{Descriptor: &SystemID{}},
// },
// }
// for _, tt := range tests {
// t.Run(tt.name, func(t *testing.T) {
// v, err := FromMap(tt.id.Map())
// require.NoError(t, err)
// assert.Equal(t, tt.id, v, "проверка FromMap для типа ID, должен быть равен исходному значению")
// assert.Equal(t, v.Map(), tt.id.Map())
// })
// }
//}
func Test_Map(t *testing.T) {
tests := []struct {
name string
id *ObjectId
}{
{
name: "ServiceID",
id: &ObjectId{Descriptor: &ServiceId{ServiceID: "<service_id>"}},
},
{
name: "UserID",
id: &ObjectId{Descriptor: &UserId{UserID: "<user_id>"}},
},
{
name: "OrganizationID",
id: &ObjectId{Descriptor: &OrganizationId{OrganizationID: "<org_id>"}},
},
{
name: "SpaceId",
id: &ObjectId{Descriptor: &SpaceId{SpaceID: "<space_id>"}},
},
{
name: "ClientID",
id: &ObjectId{Descriptor: &ClientId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
ClientID: "<client_id>",
}},
},
{
name: "RoleID",
id: &ObjectId{Descriptor: &RoleId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
RoleID: "<role_id>",
}},
},
{
name: "EnvironmentID",
id: &ObjectId{Descriptor: &EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
}},
},
{
name: "CollectionId",
id: &ObjectId{Descriptor: &CollectionId{
EnvironmentId: EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
}},
},
{
name: "Schema ID",
id: &ObjectId{Descriptor: &SchemaId{
EnvironmentId: EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
}},
},
{
name: "ItemId",
id: &ObjectId{Descriptor: &ItemId{
CollectionId: CollectionId{
EnvironmentId: EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
},
ItemID: "<item_id>",
}},
},
{
name: "RevisionID",
id: &ObjectId{Descriptor: &RevisionId{
ItemId: ItemId{
CollectionId: CollectionId{
EnvironmentId: EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
},
ItemID: "<item_id>",
},
RevisionID: "<rev_id>",
}},
},
{
name: "FieldId",
id: &ObjectId{Descriptor: &FieldId{
ItemId: ItemId{
CollectionId: CollectionId{
EnvironmentId: EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
},
ItemID: "<item_id>",
},
Field: "<field_name>",
}},
},
{
name: "SystemID",
id: &ObjectId{Descriptor: &SystemId{}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
v, err := FromMap(tt.id.Map())
require.NoError(t, err)
assert.Equal(t, tt.id, v, "проверка FromMap для типа ID, должен быть равен исходному значению")
assert.Equal(t, v.Map(), tt.id.Map())
})
}
}
package old
const (
Client = "client"
ClientsPrefix = "clients"
)
type ClientID struct {
SpaceID
ClientID string `json:"client_id,omitempty" bson:"client_id,omitempty"`
}
func (t *ClientID) Type() string { return Client }
func (t *ClientID) String() string {
return Join(t.SpaceID.String(), ClientsPrefix, t.ClientID)
}
func (t *ClientID) Map() map[string]any {
m := t.SpaceID.Map()
m["client_id"] = t.ClientID
m["type"] = Client
return m
}
func (t *ClientID) FromMap(m map[string]any) error {
if err := t.SpaceID.FromMap(m); err != nil {
return err
}
t.ClientID = m["client_id"].(string)
return nil
}
func (t *ClientID) Validate() error {
if t.ClientID == "" {
return ErrInvalidID
}
return t.SpaceID.Validate()
}
func parseClientID(parts []string) (*ClientID, error) {
if len(parts) != 4 || parts[2] != ClientsPrefix {
return nil, ErrInvalidID
}
spaceID, err := parseSpaceID(parts[:2])
if err != nil {
return nil, err
}
var id ClientID
id.SpaceID = *spaceID
id.ClientID = parts[3]
return &id, nil
}
func NewClientID(spaceID, id string) *ID {
return &ID{Descriptor: &ClientID{SpaceID: SpaceID{SpaceID: spaceID}, ClientID: id}}
}
package old
const (
Organization = "organization"
OrganizationsPrefix = "orgs"
)
type OrganizationID struct {
OrganizationID string `json:"organization_id,omitempty" bson:"organization_id,omitempty"`
}
func (t *OrganizationID) Type() string { return Organization }
func (t *OrganizationID) String() string {
return Join(OrganizationsPrefix, t.OrganizationID)
}
func (t *OrganizationID) Map() map[string]any {
return map[string]any{
"organization_id": t.OrganizationID,
"type": Organization,
}
}
func (t *OrganizationID) FromMap(m map[string]any) error {
t.OrganizationID = m["organization_id"].(string)
return nil
}
func (t *OrganizationID) Validate() error {
if t.OrganizationID == "" {
return ErrInvalidID
}
return nil
}
func parseOrganizationID(parts []string) (*OrganizationID, error) {
var id OrganizationID
if len(parts) != 2 || parts[0] != OrganizationsPrefix {
return nil, ErrInvalidID
}
id.OrganizationID = parts[1]
return &id, nil
}
func NewOrganizationID(id string) *ID {
return &ID{Descriptor: &OrganizationID{OrganizationID: id}}
}
package old
const (
Revision = "revision"
RevisionsPrefix = "revs"
)
type RevisionID struct {
ItemID
RevisionID string `json:"rev_id" bson:"rev_id,omitempty"`
}
func (t *RevisionID) Type() string { return Revision }
func (t *RevisionID) String() string {
return Join(t.ItemID.String(), RevisionsPrefix, t.RevisionID)
}
func (t *RevisionID) Map() map[string]any {
m := t.ItemID.Map()
m["rev_id"] = t.RevisionID
m["type"] = Revision
return m
}
func (t *RevisionID) FromMap(m map[string]any) error {
if err := t.ItemID.FromMap(m); err != nil {
return err
}
t.RevisionID = m["rev_id"].(string)
return nil
}
func (t *RevisionID) Validate() error {
if t.RevisionID == "" {
return ErrInvalidID
}
return t.ItemID.Validate()
}
func parseRevisionID(parts []string) (*RevisionID, error) {
if len(parts) != 10 || parts[8] != RevisionsPrefix {
return nil, ErrInvalidID
}
itemID, err := parseItemID(parts[:8])
if err != nil {
return nil, err
}
var id RevisionID
id.ItemID = *itemID
id.RevisionID = parts[9]
return &id, nil
}
func NewRevisionID(spaceID, envID, collID, itemID, id string) *ID {
return &ID{Descriptor: &RevisionID{ItemID: ItemID{CollectionID: CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: spaceID}, EnvironmentID: envID}, CollectionID: collID}, ItemID: itemID}, RevisionID: id}}
}
package old
const (
Role = "role"
RolesPrefix = "roles"
)
type RoleID struct {
SpaceID
RoleID string `json:"role_id,omitempty" bson:"role_id,omitempty"`
}
func (t *RoleID) Type() string { return Role }
func (t *RoleID) String() string {
return Join(t.SpaceID.String(), RolesPrefix, t.RoleID)
}
func (t *RoleID) Map() map[string]any {
m := t.SpaceID.Map()
m["role_id"] = t.RoleID
m["type"] = Role
return m
}
func (t *RoleID) FromMap(m map[string]any) error {
if err := t.SpaceID.FromMap(m); err != nil {
return err
}
t.RoleID = m["role_id"].(string)
return nil
}
func (t *RoleID) Validate() error {
if t.RoleID == "" {
return ErrInvalidID
}
return t.SpaceID.Validate()
}
func parseRoleID(parts []string) (*RoleID, error) {
if len(parts) != 4 || parts[2] != RolesPrefix {
return nil, ErrInvalidID
}
spaceID, err := parseSpaceID(parts[:2])
if err != nil {
return nil, err
}
var id RoleID
id.SpaceID = *spaceID
id.RoleID = parts[3]
return &id, nil
}
func NewRoleID(spaceID, id string) *ID {
return &ID{Descriptor: &RoleID{SpaceID: SpaceID{SpaceID: spaceID}, RoleID: id}}
}
package old
const (
Schema = "schema"
SchemaPrefix = "schema"
)
type SchemaID struct {
EnvironmentID
CollectionID string `json:"col_id" bson:"col_id,omitempty"`
}
func (t *SchemaID) Type() string { return Schema }
func (t *SchemaID) String() string {
return Join(t.EnvironmentID.String(), SchemaPrefix, t.CollectionID)
}
func (t *SchemaID) Map() map[string]any {
m := t.EnvironmentID.Map()
m["col_id"] = t.CollectionID
m["type"] = Schema
return m
}
func (t *SchemaID) FromMap(m map[string]any) error {
if err := t.EnvironmentID.FromMap(m); err != nil {
return err
}
t.CollectionID = m["col_id"].(string)
return nil
}
func (t *SchemaID) Validate() error {
if t.CollectionID == "" {
return ErrInvalidID
}
return t.EnvironmentID.Validate()
}
func parseSchemaID(parts []string) (*SchemaID, error) {
if len(parts) != 6 || parts[4] != SchemaPrefix {
return nil, ErrInvalidID
}
envID, err := parseEnvironmentID(parts[:4])
if err != nil {
return nil, err
}
var id SchemaID
id.EnvironmentID = *envID
id.CollectionID = parts[5]
return &id, nil
}
func NewSchemaID(spaceID, envID, id string) *ID {
return &ID{Descriptor: &SchemaID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: spaceID}, EnvironmentID: envID}, CollectionID: id}}
}
package old
const (
Service = "service"
ServicesPrefix = "services"
)
type ServiceID struct {
ServiceID string `json:"service_id,omitempty" bson:"service_id,omitempty"`
}
func (t *ServiceID) Type() string { return Service }
func (t *ServiceID) String() string {
return Join(ServicesPrefix, t.ServiceID)
}
func (t *ServiceID) Map() map[string]any {
return map[string]any{
"service_id": t.ServiceID,
"type": Service,
}
}
func (t *ServiceID) FromMap(m map[string]any) error {
t.ServiceID = m["service_id"].(string)
return nil
}
func (t *ServiceID) Validate() error {
if t.ServiceID == "" {
return ErrInvalidID
}
return nil
}
func parseServiceID(parts []string) (*ServiceID, error) {
var id ServiceID
if len(parts) != 2 || parts[0] != ServicesPrefix {
return nil, ErrInvalidID
}
id.ServiceID = parts[1]
return &id, nil
}
func NewServiceID(id string) *ID {
return &ID{Descriptor: &ServiceID{ServiceID: id}}
}
package old
const System = "system"
type SystemID struct{}
func (t *SystemID) Type() string { return Space }
func (t *SystemID) String() string { return string(Separator) + System }
func (t *SystemID) Map() map[string]any { return map[string]any{"type": System} }
func (t *SystemID) FromMap(m map[string]any) error { return nil }
func (t *SystemID) Validate() error { return nil }
func parseSystemID(parts []string) (*SystemID, error) {
var id SystemID
if len(parts) != 1 || parts[0] != System {
return nil, ErrInvalidID
}
return &id, nil
}
func NewSystemID() *ID {
return &ID{Descriptor: &SystemID{}}
}
package old
const (
User = "user"
UsersPrefix = "users"
)
type UserID struct {
UserID string `json:"user_id,omitempty" bson:"user_id,omitempty"`
}
func (t *UserID) Type() string { return User }
func (t *UserID) String() string {
return Join(UsersPrefix, t.UserID)
}
func (t *UserID) Map() map[string]any {
return map[string]any{
"user_id": t.UserID,
"type": User,
}
}
func (t *UserID) FromMap(m map[string]any) error {
t.UserID = m["user_id"].(string)
return nil
}
func (t *UserID) Validate() error {
if t.UserID == "" {
return ErrInvalidID
}
return nil
}
func parseUserID(parts []string) (*UserID, error) {
var id UserID
if len(parts) != 2 || parts[0] != UsersPrefix {
return nil, ErrInvalidID
}
id.UserID = parts[1]
return &id, nil
}
func NewUserID(id string) *ID {
return &ID{Descriptor: &UserID{UserID: id}}
}
package id
import "fmt"
const (
Organization = "organization"
OrganizationsPrefix = "orgs"
)
var _ Descriptor = &OrganizationId{}
type OrganizationId struct {
OrganizationID string `json:"organization_id,omitempty" bson:"organization_id,omitempty"`
}
func (id *OrganizationId) New() Descriptor {
return &OrganizationId{}
}
func (id *OrganizationId) Type() string { return Organization }
func (id *OrganizationId) String() string {
return Join(OrganizationsPrefix, id.OrganizationID)
}
func (id *OrganizationId) FromParts(parts []string) error {
if len(parts) != 2 || parts[0] != OrganizationsPrefix {
return ErrInvalid
}
id.OrganizationID = parts[1]
return nil
}
func (id *OrganizationId) Map() map[string]any {
return map[string]any{
"organization_id": id.OrganizationID,
"type": id.Type(),
}
}
func (id *OrganizationId) FromMap(m map[string]any) error {
id.OrganizationID, _ = m["organization_id"].(string)
if id.OrganizationID == "" {
return fmt.Errorf("%w: OrganizationId required", ErrInvalid)
}
return nil
}
func (id *OrganizationId) Validate() error {
if id.OrganizationID == "" {
return fmt.Errorf("%w: OrganizationId required", ErrInvalid)
}
return nil
}
......@@ -57,7 +57,7 @@ func (r *Registry) FromMap(m map[string]interface{}) (*ObjectId, error) {
return &ObjectId{Descriptor: id}, nil
}
return nil, fmt.Errorf("%w: %s", t, ErrInvalid)
return nil, fmt.Errorf("%s: %s", t, ErrInvalid)
}
func (r *Registry) FromObject(v interface{}) (*ObjectId, error) {
......@@ -95,8 +95,16 @@ func RegisterSystemIds(r *Registry) {
r.RegisterDescriptor(&SpaceId{})
r.RegisterDescriptor(&EnvironmentId{})
r.RegisterDescriptor(&CollectionId{})
r.RegisterDescriptor(&SchemaId{})
r.RegisterDescriptor(&ItemId{})
r.RegisterDescriptor(&RevisionId{})
r.RegisterDescriptor(&FieldId{})
r.RegisterDescriptor(&ClientId{})
r.RegisterDescriptor(&RoleId{})
r.RegisterDescriptor(&UserId{})
r.RegisterDescriptor(&SystemId{})
r.RegisterDescriptor(&ServiceId{})
r.RegisterDescriptor(&OrganizationId{})
}
func GetRegistry() *Registry {
......
package id
import "fmt"
const (
Revision = "revision"
RevisionsPrefix = "revs"
)
type RevisionId struct {
ItemId
RevisionID string `json:"rev_id" bson:"rev_id,omitempty"`
}
func (id *RevisionId) New() Descriptor {
return &RevisionId{}
}
func (id *RevisionId) Type() string { return Revision }
func (id *RevisionId) String() string {
return Join(id.ItemId.String(), RevisionsPrefix, id.RevisionID)
}
func (id *RevisionId) FromParts(parts []string) error {
if len(parts) != 10 || parts[8] != RevisionsPrefix {
return ErrInvalid
}
if err := id.ItemId.FromParts(parts[:8]); err != nil {
return err
}
id.RevisionID = parts[9]
return nil
}
func (id *RevisionId) Map() map[string]any {
m := id.ItemId.Map()
m["rev_id"] = id.RevisionID
m["type"] = Revision
return m
}
func (id *RevisionId) FromMap(m map[string]any) error {
id.RevisionID = m["rev_id"].(string)
if id.RevisionID == "" {
return fmt.Errorf("%w: RevisionId required", ErrInvalid)
}
if err := id.ItemId.FromMap(m); err != nil {
return err
}
return nil
}
func (id *RevisionId) Validate() error {
if id.RevisionID == "" {
return fmt.Errorf("%w: RevisionId required", ErrInvalid)
}
return id.ItemId.Validate()
}
package id
import "fmt"
const (
Role = "role"
RolesPrefix = "roles"
)
var _ Descriptor = &RoleId{}
type RoleId struct {
SpaceId
RoleID string `json:"role_id,omitempty" bson:"role_id,omitempty"`
}
func (id *RoleId) New() Descriptor {
return &RoleId{}
}
func (id *RoleId) Type() string { return Role }
func (id *RoleId) String() string {
return Join(id.SpaceId.String(), RolesPrefix, id.RoleID)
}
func (id *RoleId) FromParts(parts []string) error {
if len(parts) != 4 || parts[2] != RolesPrefix {
return ErrInvalid
}
if err := id.SpaceId.FromParts(parts[:2]); err != nil {
return err
}
id.RoleID = parts[3]
return nil
}
func (id *RoleId) Map() map[string]any {
m := id.SpaceId.Map()
m["role_id"] = id.RoleID
m["type"] = Role
return m
}
func (id *RoleId) FromMap(m map[string]any) error {
id.RoleID = m["role_id"].(string)
if id.RoleID == "" {
return fmt.Errorf("%w: RoleID required", ErrInvalid)
}
return id.SpaceId.FromMap(m)
}
func (id *RoleId) Validate() error {
if id.RoleID == "" {
return fmt.Errorf("%w: RoleID required", ErrInvalid)
}
return id.SpaceId.Validate()
}
package id
import "fmt"
const (
Schema = "schema"
SchemaPrefix = "schema"
)
type SchemaId struct {
EnvironmentId
CollectionID string `json:"col_id" bson:"col_id,omitempty"`
}
func (id *SchemaId) New() Descriptor {
return &SchemaId{}
}
func (id *SchemaId) Type() string { return Schema }
func (id *SchemaId) String() string {
return Join(id.EnvironmentId.String(), SchemaPrefix, id.CollectionID)
}
func (id *SchemaId) Map() map[string]any {
m := id.EnvironmentId.Map()
m["col_id"] = id.CollectionID
m["type"] = Schema
return m
}
func (id *SchemaId) FromParts(parts []string) error {
if len(parts) != 6 || parts[4] != SchemaPrefix {
return ErrInvalid
}
if err := id.EnvironmentId.FromParts(parts[:4]); err != nil {
return err
}
id.CollectionID = parts[5]
return nil
}
func (id *SchemaId) FromMap(m map[string]any) error {
id.CollectionID, _ = m["col_id"].(string)
if id.CollectionID == "" {
return fmt.Errorf("%w: SchemaID required", ErrInvalid)
}
return id.EnvironmentId.FromMap(m)
}
func (id *SchemaId) Validate() error {
if id.CollectionID == "" {
return fmt.Errorf("%w: SchemaID required", ErrInvalid)
}
return id.EnvironmentId.Validate()
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment