From 1211bc8490581c5e41eadfe0512a7b5412f8e238 Mon Sep 17 00:00:00 2001 From: ko_oler <kooler89@gmail.com> Date: Wed, 14 Feb 2024 13:29:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=9F=D0=A0:=20-=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BA=D1=82=D0=BE=D1=80=D1=8B=20-=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=8B=20-=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20-=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B8=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- id/client.go | 16 +- id/collection.go | 26 ++- id/environment.go | 18 +- id/error.go | 4 +- id/field.go | 26 ++- id/item.go | 28 ++- id/organization.go | 16 +- id/registry.go | 6 +- id/revision.go | 26 ++- id/role.go | 20 +- id/schema.go | 20 +- id/service.go | 10 +- id/space.go | 12 +- id/system.go | 5 +- id/system/system.go | 16 +- id/test/object_id_test.go | 463 +++++++++++++++++++++++++++++++++++++- id/user.go | 16 +- 17 files changed, 667 insertions(+), 61 deletions(-) diff --git a/id/client.go b/id/client.go index d2a8d0bc..704f8d5f 100644 --- a/id/client.go +++ b/id/client.go @@ -1,6 +1,10 @@ package id -import "fmt" +import ( + "fmt" + + "git.perx.ru/perxis/perxis-go/pkg/clients" +) const ( Client = "client" @@ -26,7 +30,7 @@ func (id *ClientId) String() string { func (id *ClientId) FromParts(parts []string) error { if len(parts) != 4 || parts[2] != ClientsPrefix { - return ErrInvalid + return ErrInvalidID } if err := id.SpaceId.FromParts(parts[:2]); err != nil { return err @@ -45,15 +49,19 @@ func (id *ClientId) Map() map[string]any { 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 fmt.Errorf("%w: ClientID required", ErrInvalidID) } return id.SpaceId.FromMap(m) } func (id *ClientId) Validate() error { if id.ClientID == "" { - return fmt.Errorf("%w: ClientID required", ErrInvalid) + return fmt.Errorf("%w: ClientID required", ErrInvalidID) } return id.SpaceId.Validate() } + +func NewClientId(c clients.Client) *ObjectId { + return &ObjectId{Descriptor: &ClientId{SpaceId: SpaceId{SpaceID: c.SpaceID}, ClientID: c.ID}} +} diff --git a/id/collection.go b/id/collection.go index 49826e7a..6518513b 100644 --- a/id/collection.go +++ b/id/collection.go @@ -1,6 +1,10 @@ package id -import "fmt" +import ( + "fmt" + + "git.perx.ru/perxis/perxis-go/pkg/collections" +) const ( Collection = "collection" @@ -15,7 +19,7 @@ type CollectionId struct { } func (id *CollectionId) New() Descriptor { - return &CollectionId{} + return &CollectionId{EnvironmentId: EnvironmentId{SpaceId: SpaceId{}}} } func (id *CollectionId) Type() string { return Collection } @@ -33,7 +37,7 @@ func (id *CollectionId) Map() map[string]any { func (id *CollectionId) FromParts(parts []string) error { if len(parts) != 6 || parts[4] != CollectionsPrefix { - return ErrInvalid + return ErrInvalidID } if err := id.EnvironmentId.FromParts(parts[:4]); err != nil { return err @@ -45,14 +49,26 @@ func (id *CollectionId) FromParts(parts []string) error { func (id *CollectionId) FromMap(m map[string]any) error { id.CollectionID, _ = m["col_id"].(string) if id.CollectionID == "" { - return fmt.Errorf("%w: CollectionID required", ErrInvalid) + return fmt.Errorf("%w: CollectionID required", ErrInvalidID) } return id.EnvironmentId.FromMap(m) } func (id *CollectionId) Validate() error { if id.CollectionID == "" { - return fmt.Errorf("%w: CollectionID required", ErrInvalid) + return fmt.Errorf("%w: CollectionID required", ErrInvalidID) } return id.EnvironmentId.Validate() } + +func NewCollectionId(coll collections.Collection) *ObjectId { + return &ObjectId{Descriptor: &CollectionId{ + EnvironmentId: EnvironmentId{ + SpaceId: SpaceId{ + SpaceID: coll.SpaceID, + }, + EnvironmentID: coll.EnvID, + }, + CollectionID: coll.ID, + }} +} diff --git a/id/environment.go b/id/environment.go index 6c09603d..0da72195 100644 --- a/id/environment.go +++ b/id/environment.go @@ -2,6 +2,8 @@ package id import ( "fmt" + + "git.perx.ru/perxis/perxis-go/pkg/environments" ) const ( @@ -9,6 +11,8 @@ const ( EnvironmentsPrefix = "envs" ) +var _ Descriptor = &EnvironmentId{} + type EnvironmentId struct { SpaceId EnvironmentID string `json:"env_id,omitempty" bson:"env_id,omitempty"` @@ -34,7 +38,7 @@ func (id *EnvironmentId) Map() map[string]any { func (id *EnvironmentId) FromParts(parts []string) error { if len(parts) != 4 || parts[2] != EnvironmentsPrefix { - return ErrInvalid + return ErrInvalidID } if err := id.SpaceId.FromParts(parts[:2]); err != nil { return err @@ -46,14 +50,22 @@ func (id *EnvironmentId) FromParts(parts []string) error { func (id *EnvironmentId) FromMap(m map[string]any) error { id.EnvironmentID, _ = m["env_id"].(string) if id.EnvironmentID == "" { - return fmt.Errorf("%w: EnviromentID required", ErrInvalid) + return fmt.Errorf("%w: EnviromentID required", ErrInvalidID) } return id.SpaceId.FromMap(m) } func (id *EnvironmentId) Validate() error { if id.EnvironmentID == "" { - return fmt.Errorf("%w: EnvironmetnID required", ErrInvalid) + return fmt.Errorf("%w: EnvironmetnID required", ErrInvalidID) } return id.SpaceId.Validate() } +func NewEnvironmentId(env environments.Environment) *ObjectId { + return &ObjectId{Descriptor: &EnvironmentId{ + SpaceId: SpaceId{ + SpaceID: env.SpaceID, + }, + EnvironmentID: env.ID, + }} +} diff --git a/id/error.go b/id/error.go index 3622b5d1..e8332dc9 100644 --- a/id/error.go +++ b/id/error.go @@ -3,8 +3,8 @@ package id import "errors" var ( - ErrInvalidID = errors.New("invalid ObjectId") - ErrUnknownType = errors.New("unknown ObjectId type") + ErrInvalidID = errors.New("invalid ObjectId") + ErrUnknownType = errors.New("unknown ObjectId type") ErrHandlerNotFound = errors.New("ObjectId handler not found") ErrTypeNotFound = errors.New("type key not found in map") ErrInvalidType = errors.New("ObjectId should be a string") diff --git a/id/field.go b/id/field.go index 0310c916..024732f2 100644 --- a/id/field.go +++ b/id/field.go @@ -12,6 +12,8 @@ type FieldId struct { Field string `json:"field,omitempty" bson:"field,omitempty"` } +var _ Descriptor = &FieldId{} + func (id *FieldId) New() Descriptor { return &FieldId{} } @@ -25,7 +27,7 @@ func (id *FieldId) String() string { func (id *FieldId) FromParts(parts []string) error { if len(parts) != 10 || parts[8] != FieldsPrefix { - return ErrInvalid + return ErrInvalidID } if err := id.ItemId.FromParts(parts[:8]); err != nil { return err @@ -44,7 +46,7 @@ func (id *FieldId) Map() map[string]any { func (id *FieldId) FromMap(m map[string]any) error { id.Field = m["field"].(string) if id.Field == "" { - return fmt.Errorf("%w: Field required", ErrInvalid) + return fmt.Errorf("%w: Field required", ErrInvalidID) } if err := id.ItemId.FromMap(m); err != nil { @@ -55,8 +57,26 @@ func (id *FieldId) FromMap(m map[string]any) error { func (id *FieldId) Validate() error { if id.Field == "" { - return fmt.Errorf("%w: Field required", ErrInvalid) + return fmt.Errorf("%w: Field required", ErrInvalidID) } return id.ItemId.Validate() } + +func NewFieldId(spaceID, envID, collID, itemID, id string) *ObjectId { + return &ObjectId{Descriptor: &FieldId{ + ItemId: ItemId{ + CollectionId: CollectionId{ + EnvironmentId: EnvironmentId{ + SpaceId: SpaceId{ + SpaceID: spaceID, + }, + EnvironmentID: envID, + }, + CollectionID: collID, + }, + ItemID: itemID, + }, + Field: id, + }} +} diff --git a/id/item.go b/id/item.go index 01410c4b..dbfb8e18 100644 --- a/id/item.go +++ b/id/item.go @@ -1,6 +1,10 @@ package id -import "fmt" +import ( + "fmt" + + "git.perx.ru/perxis/perxis-go/pkg/items" +) const ( Item = "item" @@ -12,6 +16,8 @@ type ItemId struct { ItemID string `json:"item_id,omitempty" bson:"item_id,omitempty"` } +var _ Descriptor = &ItemId{} + func (i *ItemId) New() Descriptor { return &ItemId{} } @@ -32,7 +38,7 @@ func (i *ItemId) Map() map[string]any { func (i *ItemId) FromParts(parts []string) error { if len(parts) != 8 || parts[6] != ItemsPrefix { - return ErrInvalid + return ErrInvalidID } if err := i.CollectionId.FromParts(parts[:6]); err != nil { @@ -46,7 +52,7 @@ func (i *ItemId) FromParts(parts []string) error { func (i *ItemId) FromMap(m map[string]any) error { i.ItemID = m["item_id"].(string) if i.ItemID == "" { - return fmt.Errorf("%w: ItemId required", ErrInvalid) + return fmt.Errorf("%w: ItemId required", ErrInvalidID) } return i.CollectionId.FromMap(m) @@ -54,7 +60,21 @@ func (i *ItemId) FromMap(m map[string]any) error { func (i *ItemId) Validate() error { if i.ItemID == "" { - return fmt.Errorf("%w: ItemId required", ErrInvalid) + return fmt.Errorf("%w: ItemId required", ErrInvalidID) } return i.CollectionId.Validate() } +func NewItemId(i items.Item) *ObjectId { + return &ObjectId{Descriptor: &ItemId{ + CollectionId: CollectionId{ + EnvironmentId: EnvironmentId{ + SpaceId: SpaceId{ + SpaceID: i.SpaceID, + }, + EnvironmentID: i.EnvID, + }, + CollectionID: i.CollectionID, + }, + ItemID: i.ID, + }} +} diff --git a/id/organization.go b/id/organization.go index 7f03bb98..03fd47fc 100644 --- a/id/organization.go +++ b/id/organization.go @@ -1,6 +1,10 @@ package id -import "fmt" +import ( + "fmt" + + "git.perx.ru/perxis/perxis-go/pkg/organizations" +) const ( Organization = "organization" @@ -25,7 +29,7 @@ func (id *OrganizationId) String() string { func (id *OrganizationId) FromParts(parts []string) error { if len(parts) != 2 || parts[0] != OrganizationsPrefix { - return ErrInvalid + return ErrInvalidID } id.OrganizationID = parts[1] return nil @@ -41,14 +45,18 @@ func (id *OrganizationId) Map() map[string]any { 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 fmt.Errorf("%w: OrganizationId required", ErrInvalidID) } return nil } func (id *OrganizationId) Validate() error { if id.OrganizationID == "" { - return fmt.Errorf("%w: OrganizationId required", ErrInvalid) + return fmt.Errorf("%w: OrganizationId required", ErrInvalidID) } return nil } + +func NewOrganizationId(o organizations.Organization) *ObjectId { + return &ObjectId{Descriptor: &OrganizationId{OrganizationID: o.ID}} +} diff --git a/id/registry.go b/id/registry.go index 7d12fe2f..89b779c9 100644 --- a/id/registry.go +++ b/id/registry.go @@ -40,7 +40,7 @@ func (r *Registry) FromParts(s string) (*ObjectId, error) { } } - return nil, fmt.Errorf("%w: %s", ErrInvalid, s) + return nil, fmt.Errorf("%w: %s", ErrInvalidID, s) } func (r *Registry) FromMap(m map[string]interface{}) (*ObjectId, error) { @@ -57,11 +57,13 @@ func (r *Registry) FromMap(m map[string]interface{}) (*ObjectId, error) { return &ObjectId{Descriptor: id}, nil } - return nil, fmt.Errorf("%s: %s", t, ErrInvalid) + return nil, fmt.Errorf("%s: %s", t, ErrInvalidID) } func (r *Registry) FromObject(v interface{}) (*ObjectId, error) { t := reflect.TypeOf(v) + fmt.Println(t.String()) + fmt.Println(r.handlers) if handler, ok := r.handlers[t]; ok { i := handler(v) if i == nil { diff --git a/id/revision.go b/id/revision.go index 6d6c369f..f8a2ecb4 100644 --- a/id/revision.go +++ b/id/revision.go @@ -12,6 +12,8 @@ type RevisionId struct { RevisionID string `json:"rev_id" bson:"rev_id,omitempty"` } +var _ Descriptor = &RevisionId{} + func (id *RevisionId) New() Descriptor { return &RevisionId{} } @@ -25,7 +27,7 @@ func (id *RevisionId) String() string { func (id *RevisionId) FromParts(parts []string) error { if len(parts) != 10 || parts[8] != RevisionsPrefix { - return ErrInvalid + return ErrInvalidID } if err := id.ItemId.FromParts(parts[:8]); err != nil { return err @@ -44,7 +46,7 @@ func (id *RevisionId) Map() map[string]any { 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) + return fmt.Errorf("%w: RevisionId required", ErrInvalidID) } if err := id.ItemId.FromMap(m); err != nil { @@ -55,8 +57,26 @@ func (id *RevisionId) FromMap(m map[string]any) error { func (id *RevisionId) Validate() error { if id.RevisionID == "" { - return fmt.Errorf("%w: RevisionId required", ErrInvalid) + return fmt.Errorf("%w: RevisionId required", ErrInvalidID) } return id.ItemId.Validate() } + +func NewRevisionID(spaceID, envID, collID, itemID, id string) *ObjectId { + return &ObjectId{Descriptor: &RevisionId{ + ItemId: ItemId{ + CollectionId: CollectionId{ + EnvironmentId: EnvironmentId{ + SpaceId: SpaceId{ + SpaceID: spaceID, + }, + EnvironmentID: envID, + }, + CollectionID: collID, + }, + ItemID: itemID, + }, + RevisionID: id, + }} +} diff --git a/id/role.go b/id/role.go index 6644aea4..4e507d92 100644 --- a/id/role.go +++ b/id/role.go @@ -1,6 +1,10 @@ package id -import "fmt" +import ( + "fmt" + + "git.perx.ru/perxis/perxis-go/pkg/roles" +) const ( Role = "role" @@ -26,7 +30,7 @@ func (id *RoleId) String() string { func (id *RoleId) FromParts(parts []string) error { if len(parts) != 4 || parts[2] != RolesPrefix { - return ErrInvalid + return ErrInvalidID } if err := id.SpaceId.FromParts(parts[:2]); err != nil { return err @@ -45,15 +49,23 @@ func (id *RoleId) Map() map[string]any { 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 fmt.Errorf("%w: RoleID required", ErrInvalidID) } return id.SpaceId.FromMap(m) } func (id *RoleId) Validate() error { if id.RoleID == "" { - return fmt.Errorf("%w: RoleID required", ErrInvalid) + return fmt.Errorf("%w: RoleID required", ErrInvalidID) } return id.SpaceId.Validate() } +func NewRoleId(r roles.Role) *ObjectId { + return &ObjectId{Descriptor: &RoleId{ + SpaceId: SpaceId{ + SpaceID: r.SpaceID, + }, + RoleID: r.ID, + }} +} diff --git a/id/schema.go b/id/schema.go index ad59a14b..b1280f81 100644 --- a/id/schema.go +++ b/id/schema.go @@ -7,6 +7,8 @@ const ( SchemaPrefix = "schema" ) +var _ Descriptor = &SchemaId{} + type SchemaId struct { EnvironmentId CollectionID string `json:"col_id" bson:"col_id,omitempty"` @@ -31,7 +33,7 @@ func (id *SchemaId) Map() map[string]any { func (id *SchemaId) FromParts(parts []string) error { if len(parts) != 6 || parts[4] != SchemaPrefix { - return ErrInvalid + return ErrInvalidID } if err := id.EnvironmentId.FromParts(parts[:4]); err != nil { return err @@ -43,14 +45,26 @@ func (id *SchemaId) FromParts(parts []string) error { 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 fmt.Errorf("%w: SchemaID required", ErrInvalidID) } return id.EnvironmentId.FromMap(m) } func (id *SchemaId) Validate() error { if id.CollectionID == "" { - return fmt.Errorf("%w: SchemaID required", ErrInvalid) + return fmt.Errorf("%w: SchemaID required", ErrInvalidID) } return id.EnvironmentId.Validate() } + +func NewSchemaId(spaceID, envID, id string) *ObjectId { + return &ObjectId{Descriptor: &SchemaId{ + EnvironmentId: EnvironmentId{ + SpaceId: SpaceId{ + SpaceID: spaceID, + }, + EnvironmentID: envID, + }, + CollectionID: id, + }} +} diff --git a/id/service.go b/id/service.go index 08dba539..29c44ec6 100644 --- a/id/service.go +++ b/id/service.go @@ -25,7 +25,7 @@ func (id *ServiceId) String() string { func (id *ServiceId) FromParts(parts []string) error { if len(parts) != 2 || parts[0] != ServicesPrefix { - return ErrInvalid + return ErrInvalidID } id.ServiceID = parts[1] return nil @@ -41,14 +41,18 @@ func (id *ServiceId) Map() map[string]any { func (id *ServiceId) FromMap(m map[string]any) error { id.ServiceID, _ = m["service_id"].(string) if id.ServiceID == "" { - return fmt.Errorf("%w: ServiceId required", ErrInvalid) + return fmt.Errorf("%w: ServiceId required", ErrInvalidID) } return nil } func (id *ServiceId) Validate() error { if id.ServiceID == "" { - return fmt.Errorf("%w: ServiceId required", ErrInvalid) + return fmt.Errorf("%w: ServiceId required", ErrInvalidID) } return nil } + +func NewServiceID(id string) *ObjectId { + return &ObjectId{Descriptor: &ServiceId{ServiceID: id}} +} diff --git a/id/space.go b/id/space.go index 2cd8d143..a9d88bc6 100644 --- a/id/space.go +++ b/id/space.go @@ -2,6 +2,8 @@ package id import ( "fmt" + + "git.perx.ru/perxis/perxis-go/pkg/spaces" ) const ( @@ -27,7 +29,7 @@ func (id *SpaceId) String() string { func (id *SpaceId) FromParts(parts []string) error { if len(parts) != 2 || parts[0] != SpacesPrefix { - return ErrInvalid + return ErrInvalidID } id.SpaceID = parts[1] @@ -44,14 +46,18 @@ func (id *SpaceId) Map() map[string]any { func (id *SpaceId) FromMap(m map[string]any) error { id.SpaceID, _ = m["space_id"].(string) if id.SpaceID == "" { - return fmt.Errorf("%w: SpaceId required", ErrInvalid) + return fmt.Errorf("%w: SpaceId required", ErrInvalidID) } return nil } func (id *SpaceId) Validate() error { if id.SpaceID == "" { - return fmt.Errorf("%w: SpaceId required", ErrInvalid) + return fmt.Errorf("%w: SpaceId required", ErrInvalidID) } return nil } + +func NewSpaceId(s spaces.Space) *ObjectId { + return &ObjectId{Descriptor: &SpaceId{SpaceID: s.ID}} +} diff --git a/id/system.go b/id/system.go index 3efa4b9c..28eb6e04 100644 --- a/id/system.go +++ b/id/system.go @@ -4,6 +4,8 @@ const System = "system" type SystemId struct{} +var _ Descriptor = &SystemId{} + func (id *SystemId) New() Descriptor { return &SystemId{} } @@ -12,10 +14,11 @@ func (id *SystemId) Type() string { return System } func (id *SystemId) String() string { return string(Separator) + System } func (id *SystemId) FromParts(parts []string) error { if len(parts) != 1 || parts[0] != System { - return ErrInvalid + return ErrInvalidID } return nil } func (id *SystemId) Map() map[string]any { return map[string]any{"type": System} } func (id *SystemId) FromMap(m map[string]any) error { return nil } func (id *SystemId) Validate() error { return nil } +func (id *SystemId) NewSystemId() *ObjectId { return &ObjectId{Descriptor: &SystemId{}} } diff --git a/id/system/system.go b/id/system/system.go index 713fca34..77084f5d 100644 --- a/id/system/system.go +++ b/id/system/system.go @@ -6,6 +6,7 @@ import ( "git.perx.ru/perxis/perxis-go/id" "git.perx.ru/perxis/perxis-go/pkg/auth" + "git.perx.ru/perxis/perxis-go/pkg/clients" "git.perx.ru/perxis/perxis-go/pkg/collections" "git.perx.ru/perxis/perxis-go/pkg/environments" "git.perx.ru/perxis/perxis-go/pkg/items" @@ -17,6 +18,10 @@ import ( func Handler(obj any) *id.ObjectId { switch val := obj.(type) { + case *organizations.Organization: + var i id.OrganizationId + i.OrganizationID = val.ID + return id.MustObjectId(&i) case *spaces.Space: var i id.SpaceId i.SpaceID = val.ID @@ -43,9 +48,10 @@ func Handler(obj any) *id.ObjectId { var i id.UserId i.UserID = val.ID return id.MustObjectId(&i) - case *organizations.Organization: - var i id.OrganizationId - i.OrganizationID = val.ID + case *clients.Client: + var i id.ClientId + i.SpaceID = val.SpaceID + i.ClientID = val.ID return id.MustObjectId(&i) case *roles.Role: var i id.RoleId @@ -77,13 +83,13 @@ func Register(r *id.Registry) { r.RegisterObjectHandler(reflect.TypeOf(&environments.Environment{}), Handler) r.RegisterObjectHandler(reflect.TypeOf(&collections.Collection{}), Handler) r.RegisterObjectHandler(reflect.TypeOf(&items.Item{}), Handler) + r.RegisterObjectHandler(reflect.TypeOf(&clients.Client{}), Handler) r.RegisterObjectHandler(reflect.TypeOf(&roles.Role{}), Handler) + r.RegisterObjectHandler(reflect.TypeOf(&users.User{}), Handler) r.RegisterObjectHandler(reflect.TypeOf(&auth.UserPrincipal{}), Handler) r.RegisterObjectHandler(reflect.TypeOf(&auth.ClientPrincipal{}), Handler) r.RegisterObjectHandler(reflect.TypeOf(&auth.SystemPrincipal{}), Handler) r.RegisterObjectHandler(reflect.TypeOf(&auth.Anonymous{}), Handler) - - // TODO: Добавить региÑтрацию schema, revision, service непонÑтно как делать } func init() { diff --git a/id/test/object_id_test.go b/id/test/object_id_test.go index 437b3bb2..f97e50e4 100644 --- a/id/test/object_id_test.go +++ b/id/test/object_id_test.go @@ -1,16 +1,180 @@ package test import ( + "testing" + "git.perx.ru/perxis/perxis-go/id" _ "git.perx.ru/perxis/perxis-go/id/system" + "git.perx.ru/perxis/perxis-go/pkg/clients" "git.perx.ru/perxis/perxis-go/pkg/collections" "git.perx.ru/perxis/perxis-go/pkg/environments" "git.perx.ru/perxis/perxis-go/pkg/items" + "git.perx.ru/perxis/perxis-go/pkg/organizations" + "git.perx.ru/perxis/perxis-go/pkg/roles" "git.perx.ru/perxis/perxis-go/pkg/spaces" + "git.perx.ru/perxis/perxis-go/pkg/users" "github.com/stretchr/testify/require" - "testing" ) +func Test_OrganizationId(t *testing.T) { + + tests := []struct { + name string + in any + out string + result *id.ObjectId + err error + }{ + { + name: "valid string", + in: "/orgs/<org_id>", + result: &id.ObjectId{Descriptor: &id.OrganizationId{OrganizationID: "<org_id>"}}, + }, + { + name: "valid object", + in: &organizations.Organization{ID: "<org_id>"}, + out: "/orgs/<org_id>", + result: &id.ObjectId{Descriptor: &id.OrganizationId{OrganizationID: "<org_id>"}}, + }, + { + name: "valid map", + in: map[string]any{"type": "organization", "organization_id": "<org_id>"}, + out: "/orgs/<org_id>", + result: &id.ObjectId{Descriptor: &id.OrganizationId{OrganizationID: "<org_id>"}}, + }, + { + name: "invalid map", + in: map[string]any{"type": "organization"}, + out: "/orgs/<org_id>", + result: &id.ObjectId{Descriptor: &id.OrganizationId{OrganizationID: "<org_id>"}}, + err: id.ErrInvalidID, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + i, err := id.NewObjectId(tt.in) + + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + + require.NoError(t, err) + require.Equal(t, tt.result, i) + if tt.out == "" { + require.Equal(t, tt.in, i.String()) + } else { + require.Equal(t, tt.out, i.String()) + } + }) + } +} + +func Test_ServiceId(t *testing.T) { + + tests := []struct { + name string + in any + out string + result *id.ObjectId + err error + }{ + { + name: "valid string", + in: "/services/<service_id>", + result: &id.ObjectId{Descriptor: &id.ServiceId{ServiceID: "<service_id>"}}, + }, + { + name: "valid map", + in: map[string]any{"type": "service", "service_id": "<service_id>"}, + out: "/services/<service_id>", + result: &id.ObjectId{Descriptor: &id.ServiceId{ServiceID: "<service_id>"}}, + }, + { + name: "invalid map", + in: map[string]any{"type": "service"}, + out: "/services/<service_id>", + result: &id.ObjectId{Descriptor: &id.ServiceId{ServiceID: "<service_id>"}}, + err: id.ErrInvalidID, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + i, err := id.NewObjectId(tt.in) + + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + + require.NoError(t, err) + require.Equal(t, tt.result, i) + if tt.out == "" { + require.Equal(t, tt.in, i.String()) + } else { + require.Equal(t, tt.out, i.String()) + } + }) + } +} + +func Test_UserId(t *testing.T) { + + tests := []struct { + name string + in any + out string + result *id.ObjectId + err error + }{ + { + name: "valid string", + in: "/users/<user_id>", + result: &id.ObjectId{Descriptor: &id.UserId{UserID: "<user_id>"}}, + }, + { + name: "valid object", + in: &users.User{ID: "<user_id>"}, + out: "/users/<user_id>", + result: &id.ObjectId{Descriptor: &id.UserId{UserID: "<user_id>"}}, + }, + { + name: "valid map", + in: map[string]any{"type": "user", "user_id": "<user_id>"}, + out: "/users/<user_id>", + result: &id.ObjectId{Descriptor: &id.UserId{UserID: "<user_id>"}}, + }, + { + name: "invalid map", + in: map[string]any{"type": "user"}, + out: "/users/<user_id>", + result: &id.ObjectId{Descriptor: &id.UserId{UserID: "<user_id>"}}, + err: id.ErrInvalidID, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + i, err := id.NewObjectId(tt.in) + + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + + require.NoError(t, err) + require.Equal(t, tt.result, i) + if tt.out == "" { + require.Equal(t, tt.in, i.String()) + } else { + require.Equal(t, tt.out, i.String()) + } + }) + } +} + func Test_SpaceId(t *testing.T) { tests := []struct { @@ -42,7 +206,7 @@ func Test_SpaceId(t *testing.T) { in: map[string]any{"type": "space"}, out: "/spaces/<space_id>", result: &id.ObjectId{Descriptor: &id.SpaceId{SpaceID: "<space_id>"}}, - err: id.ErrInvalid, + err: id.ErrInvalidID, }, } @@ -90,7 +254,7 @@ func Test_EnvironmentId(t *testing.T) { SpaceId: id.SpaceId{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>", }}, - err: id.ErrInvalid, + err: id.ErrInvalidID, }, { name: "valid object", @@ -118,7 +282,7 @@ func Test_EnvironmentId(t *testing.T) { SpaceId: id.SpaceId{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>", }}, - err: id.ErrInvalid, + err: id.ErrInvalidID, }, { name: "invalid map 2", @@ -128,7 +292,179 @@ func Test_EnvironmentId(t *testing.T) { SpaceId: id.SpaceId{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>", }}, - err: id.ErrInvalid, + err: id.ErrInvalidID, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + i, err := id.NewObjectId(tt.in) + + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + + require.NoError(t, err) + require.Equal(t, tt.result, i) + if tt.out == "" { + require.Equal(t, tt.in, i.String()) + } else { + require.Equal(t, tt.out, i.String()) + } + }) + } +} + +func Test_ClientId(t *testing.T) { + + tests := []struct { + name string + in any + out string + result *id.ObjectId + err error + }{ + { + name: "valid string", + in: "/spaces/<space_id>/clients/<client_id>", + result: &id.ObjectId{Descriptor: &id.ClientId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + ClientID: "<client_id>", + }}, + }, + { + name: "invalid string", + in: "/clients/<client_id>", + result: &id.ObjectId{Descriptor: &id.ClientId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + ClientID: "<client_id>", + }}, + err: id.ErrInvalidID, + }, + { + name: "valid object", + in: &clients.Client{SpaceID: "<space_id>", ID: "<client_id>"}, + out: "/spaces/<space_id>/clients/<client_id>", + result: &id.ObjectId{Descriptor: &id.ClientId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + ClientID: "<client_id>", + }}, + }, + { + name: "valid map", + in: map[string]any{"type": "client", "space_id": "<space_id>", "client_id": "<client_id>"}, + out: "/spaces/<space_id>/clients/<client_id>", + result: &id.ObjectId{Descriptor: &id.ClientId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + ClientID: "<client_id>", + }}, + }, + { + name: "invalid map 1", + in: map[string]any{"type": "client", "space_id": "<space_id>"}, + out: "/spaces/<space_id>/clients/<client_id>", + result: &id.ObjectId{Descriptor: &id.ClientId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + ClientID: "<client_id>", + }}, + err: id.ErrInvalidID, + }, + { + name: "invalid map 2", + in: map[string]any{"type": "client", "client_id": "<client_id>"}, + out: "/spaces/<space_id>/clients/<client_id>", + result: &id.ObjectId{Descriptor: &id.ClientId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + ClientID: "<client_id>", + }}, + err: id.ErrInvalidID, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + i, err := id.NewObjectId(tt.in) + + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + + require.NoError(t, err) + require.Equal(t, tt.result, i) + if tt.out == "" { + require.Equal(t, tt.in, i.String()) + } else { + require.Equal(t, tt.out, i.String()) + } + }) + } +} + +func Test_RoleId(t *testing.T) { + + tests := []struct { + name string + in any + out string + result *id.ObjectId + err error + }{ + { + name: "valid string", + in: "/spaces/<space_id>/roles/<role_id>", + result: &id.ObjectId{Descriptor: &id.RoleId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + RoleID: "<role_id>", + }}, + }, + { + name: "invalid string", + in: "/roles/<role_id>", + result: &id.ObjectId{Descriptor: &id.RoleId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + RoleID: "<role_id>", + }}, + err: id.ErrInvalidID, + }, + { + name: "valid object", + in: &roles.Role{SpaceID: "<space_id>", ID: "<role_id>"}, + out: "/spaces/<space_id>/roles/<role_id>", + result: &id.ObjectId{Descriptor: &id.RoleId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + RoleID: "<role_id>", + }}, + }, + { + name: "valid map", + in: map[string]any{"type": "role", "space_id": "<space_id>", "role_id": "<role_id>"}, + out: "/spaces/<space_id>/roles/<role_id>", + result: &id.ObjectId{Descriptor: &id.RoleId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + RoleID: "<role_id>", + }}, + }, + { + name: "invalid map 1", + in: map[string]any{"type": "client", "space_id": "<space_id>"}, + out: "/spaces/<space_id>/roles/<role_id>", + result: &id.ObjectId{Descriptor: &id.RoleId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + RoleID: "<role_id>", + }}, + err: id.ErrInvalidID, + }, + { + name: "invalid map 2", + in: map[string]any{"type": "role", "role_id": "<role_id>"}, + out: "/spaces/<space_id>/roles/<role_id>", + result: &id.ObjectId{Descriptor: &id.RoleId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + RoleID: "<role_id>", + }}, + err: id.ErrInvalidID, }, } @@ -187,7 +523,54 @@ func Test_CollectionId(t *testing.T) { CollectionID: "<collection_id>", }}, }, - // TODO: Add test cases. + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + i, err := id.NewObjectId(tt.in) + + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + + require.NoError(t, err) + require.Equal(t, tt.result, i) + if tt.out == "" { + require.Equal(t, tt.in, i.String()) + } else { + require.Equal(t, tt.out, i.String()) + } + }) + } +} + +func Test_SchemaId(t *testing.T) { + + tests := []struct { + name string + in any + out string + result *id.ObjectId + err error + }{ + { + name: "valid string", + in: "/spaces/<space_id>/envs/<env_id>/schema/<collection_id>", + result: &id.ObjectId{Descriptor: &id.SchemaId{ + EnvironmentId: id.EnvironmentId{SpaceId: id.SpaceId{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, + CollectionID: "<collection_id>", + }}, + }, + { + name: "valid map", + in: map[string]any{"type": "schema", "space_id": "<space_id>", "env_id": "<env_id>", "col_id": "<collection_id>"}, + out: "/spaces/<space_id>/envs/<env_id>/schema/<collection_id>", + result: &id.ObjectId{Descriptor: &id.SchemaId{ + EnvironmentId: id.EnvironmentId{SpaceId: id.SpaceId{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, + CollectionID: "<collection_id>", + }}, + }, } for _, tt := range tests { @@ -263,7 +646,6 @@ func Test_ItemId(t *testing.T) { ItemID: "<item_id>", }}, }, - // TODO: Add test cases. } for _, tt := range tests { @@ -330,7 +712,72 @@ func Test_FieldId(t *testing.T) { Field: "<field>", }}, }, - // TODO: Add test cases. + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + i, err := id.NewObjectId(tt.in) + + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + + require.NoError(t, err) + require.Equal(t, tt.result, i) + if tt.out == "" { + require.Equal(t, tt.in, i.String()) + } else { + require.Equal(t, tt.out, i.String()) + } + }) + } +} + +func Test_RevisionId(t *testing.T) { + + tests := []struct { + name string + in any + out string + result *id.ObjectId + err error + }{ + { + name: "valid string", + in: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/revs/<rev_id>", + result: &id.ObjectId{Descriptor: &id.RevisionId{ + ItemId: id.ItemId{ + CollectionId: id.CollectionId{ + EnvironmentId: id.EnvironmentId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + EnvironmentID: "<env_id>", + }, + CollectionID: "<collection_id>", + }, + ItemID: "<item_id>", + }, + RevisionID: "<rev_id>", + }}, + }, + { + name: "valid map", + in: map[string]any{"type": "revision", "space_id": "<space_id>", "env_id": "<env_id>", "col_id": "<collection_id>", "item_id": "<item_id>", "rev_id": "<rev_id>"}, + out: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/revs/<rev_id>", + result: &id.ObjectId{Descriptor: &id.RevisionId{ + ItemId: id.ItemId{ + CollectionId: id.CollectionId{ + EnvironmentId: id.EnvironmentId{ + SpaceId: id.SpaceId{SpaceID: "<space_id>"}, + EnvironmentID: "<env_id>", + }, + CollectionID: "<collection_id>", + }, + ItemID: "<item_id>", + }, + RevisionID: "<rev_id>", + }}, + }, } for _, tt := range tests { diff --git a/id/user.go b/id/user.go index ab8ddfa2..8b4100b0 100644 --- a/id/user.go +++ b/id/user.go @@ -1,6 +1,10 @@ package id -import "fmt" +import ( + "fmt" + + "git.perx.ru/perxis/perxis-go/pkg/users" +) const ( User = "user" @@ -25,7 +29,7 @@ func (id *UserId) String() string { func (id *UserId) FromParts(parts []string) error { if len(parts) != 2 || parts[0] != UsersPrefix { - return ErrInvalid + return ErrInvalidID } id.UserID = parts[1] return nil @@ -41,14 +45,18 @@ func (id *UserId) Map() map[string]any { func (id *UserId) FromMap(m map[string]any) error { id.UserID, _ = m["user_id"].(string) if id.UserID == "" { - return fmt.Errorf("%w: UserId required", ErrInvalid) + return fmt.Errorf("%w: UserId required", ErrInvalidID) } return nil } func (id *UserId) Validate() error { if id.UserID == "" { - return fmt.Errorf("%w: UserId required", ErrInvalid) + return fmt.Errorf("%w: UserId required", ErrInvalidID) } return nil } + +func NewUserId(u users.User) *ObjectId { + return &ObjectId{Descriptor: &UserId{UserID: u.ID}} +} -- GitLab