Documentation ¶
Overview ¶
Package attributes represents an implementation of InterfaceCustomAttributes declared in "github.com/ottemo/commerce/app/models" package.
In order to use it you should just embed ModelCustomAttributes in your actor, you can found sample usage in "github.com/app/actors/product" package.
Index ¶
- Constants
- type ModelCustomAttributes
- func (it *ModelCustomAttributes) AddNewAttribute(newAttribute models.StructAttributeInfo) error
- func (it *ModelCustomAttributes) EditAttribute(attributeName string, attributeValues models.StructAttributeInfo) error
- func (it *ModelCustomAttributes) FromHashMap(input map[string]interface{}) error
- func (it *ModelCustomAttributes) Get(attribute string) interface{}
- func (it *ModelCustomAttributes) GetAttributesInfo() []models.StructAttributeInfo
- func (it *ModelCustomAttributes) GetCustomAttributeCollectionName() string
- func (it *ModelCustomAttributes) GetInstance() interface{}
- func (it *ModelCustomAttributes) RemoveAttribute(attributeName string) error
- func (it *ModelCustomAttributes) Set(attribute string, value interface{}) error
- func (it *ModelCustomAttributes) ToHashMap() map[string]interface{}
- type ModelExternalAttributes
- func (it *ModelExternalAttributes) AddExternalAttributes(delegate models.InterfaceAttributesDelegate) error
- func (it *ModelExternalAttributes) Delete() error
- func (it *ModelExternalAttributes) FromHashMap(input map[string]interface{}) error
- func (it *ModelExternalAttributes) Get(attribute string) interface{}
- func (it *ModelExternalAttributes) GetAttributesInfo() []models.StructAttributeInfo
- func (it *ModelExternalAttributes) GetID() string
- func (it *ModelExternalAttributes) GetImplementationName() string
- func (it *ModelExternalAttributes) GetInstance() interface{}
- func (it *ModelExternalAttributes) GetModelName() string
- func (it *ModelExternalAttributes) ListExternalAttributes() map[string]models.InterfaceAttributesDelegate
- func (it *ModelExternalAttributes) Load(id string) error
- func (it *ModelExternalAttributes) RemoveExternalAttributes(delegate models.InterfaceAttributesDelegate) error
- func (it *ModelExternalAttributes) Save() error
- func (it *ModelExternalAttributes) Set(attribute string, value interface{}) error
- func (it *ModelExternalAttributes) SetID(id string) error
- func (it *ModelExternalAttributes) ToHashMap() map[string]interface{}
Examples ¶
Constants ¶
const ( ConstCollectionNameCustomAttributes = "custom_attributes" ConstErrorModule = "attributes" ConstErrorLevel = env.ConstErrorLevelHelper )
Package global constants
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ModelCustomAttributes ¶
type ModelCustomAttributes struct {
// contains filtered or unexported fields
}
ModelCustomAttributes type represents a set of attributes which could be modified (edited/added/removed) dynamically. The implementation relays on InterfaceCollection which is used to store values and have ability to add/remove columns on a fly.
func CustomAttributes ¶
func CustomAttributes(model string, collection string) (*ModelCustomAttributes, error)
CustomAttributes initializes helper instance before usage
func (*ModelCustomAttributes) AddNewAttribute ¶
func (it *ModelCustomAttributes) AddNewAttribute(newAttribute models.StructAttributeInfo) error
AddNewAttribute extends collection with new custom attribute
func (*ModelCustomAttributes) EditAttribute ¶
func (it *ModelCustomAttributes) EditAttribute(attributeName string, attributeValues models.StructAttributeInfo) error
EditAttribute modifies custom attribute for collection
func (*ModelCustomAttributes) FromHashMap ¶
func (it *ModelCustomAttributes) FromHashMap(input map[string]interface{}) error
FromHashMap represents object as map[string]interface{}
func (*ModelCustomAttributes) Get ¶
func (it *ModelCustomAttributes) Get(attribute string) interface{}
Get returns object attribute value or nil
func (*ModelCustomAttributes) GetAttributesInfo ¶
func (it *ModelCustomAttributes) GetAttributesInfo() []models.StructAttributeInfo
GetAttributesInfo represents object as map[string]interface{}
func (*ModelCustomAttributes) GetCustomAttributeCollectionName ¶
func (it *ModelCustomAttributes) GetCustomAttributeCollectionName() string
GetCustomAttributeCollectionName returns collection name you can use to fill ModelCustomAttributes struct
func (*ModelCustomAttributes) GetInstance ¶
func (it *ModelCustomAttributes) GetInstance() interface{}
GetInstance returns current instance delegate attached to
func (*ModelCustomAttributes) RemoveAttribute ¶
func (it *ModelCustomAttributes) RemoveAttribute(attributeName string) error
RemoveAttribute removes custom attribute from collection
func (*ModelCustomAttributes) Set ¶
func (it *ModelCustomAttributes) Set(attribute string, value interface{}) error
Set sets attribute value to object or returns error
func (*ModelCustomAttributes) ToHashMap ¶
func (it *ModelCustomAttributes) ToHashMap() map[string]interface{}
ToHashMap fills object attributes from map[string]interface{}
type ModelExternalAttributes ¶
type ModelExternalAttributes struct {
// contains filtered or unexported fields
}
ModelExternalAttributes type represents a set of attributes managed by "external" package (outside of model package) which supposing at least InterfaceObject methods delegation, but also could delegate InterfaceStorable if the methods are implemented in delegate instance.
Workflow diagram:
helper makes proxy for Object/Storable interface methods: Get(), Set(), ListAttributes(), +---------------+ FromHashMap(), ToHashMap(), +------------------+ | Model Package | GetId(), Load(), Save(), Delete() | External package | | | | | | +-------+ | | +----------+ | +---------> Model <---------------------+ +-------------------------> Delegate | | | | +---+---+ | model-helper | | helper-delegate | +----^-----+ | | | | | proxy call | | proxy call | | | | +-------|-------+ | | +--------|---+-----+ | | | | | | | | instance +---------v-v--------------+ | | | +---------------> *ModelExternalAttributes ----------------+ | | Model.New() instantiates +-- -+---------------------+ Delegate.New() | Registering delegate | ExternalAttributes helper | instantiates | for a specific model | which transfers instance | delegate | +----------------------------------+-GetInstance() | helper have reference to model | | +-AddExternalAttributes() <---------------+ +-RemoveExternalAttributes() | +-ListExternalAttributes()
func ExternalAttributes ¶
func ExternalAttributes(instance interface{}) (*ModelExternalAttributes, error)
ExternalAttributes initializes helper for model instance - should be called in model.New()
- "instance" is a reference to object which using helper
Example ¶
ExampleExternalAttributes creates 2 instances of SampleModel
package main import ( "errors" "fmt" "github.com/ottemo/commerce/app/models" "github.com/ottemo/commerce/utils" ) // ----------------------- // SampleModel declaration // ----------------------- // SampleModel type implements InterfaceModel only interface, so it does not // have any attribute at the beginning, it even don't have InterfaceObject and // InterfaceStorable methods implementation, however they are available via // embed ModelExternalAttributes type type SampleModel struct { i string l string d bool s bool *ModelExternalAttributes } // GetModelName returns model name func (it *SampleModel) GetModelName() string { return "Example" } // GetImplementationName returns model implementation name func (it *SampleModel) GetImplementationName() string { return "ExampleObject" } // New constructor for a new instance func (it *SampleModel) New() (models.InterfaceModel, error) { var err error newInstance := new(SampleModel) newInstance.ModelExternalAttributes, err = ExternalAttributes(newInstance) return newInstance, err } // -------------------- // Delegate declaration // -------------------- // SampleDelegate type implements InterfaceAttributesDelegate and have handles // on InterfaceStorable methods which should have call-back on model method call // in order to test it we are pushing the callback status to model instance type SampleDelegate struct { instance interface{} a string b float64 } // New instantiates delegate func (it *SampleDelegate) New(instance interface{}) (models.InterfaceAttributesDelegate, error) { return &SampleDelegate{instance: instance}, nil } // Get is a getter for external attributes func (it *SampleDelegate) Get(attribute string) interface{} { switch attribute { case "a": return it.a case "b": return it.b } return nil } // Set is a setter for external attributes func (it *SampleDelegate) Set(attribute string, value interface{}) error { switch attribute { case "a": it.a = utils.InterfaceToString(value) case "b": it.b = utils.InterfaceToFloat64(value) } return nil } // Load is a modelInstance.Load() method handler for external attributes func (it *SampleDelegate) Load(id string) error { it.instance.(*SampleModel).l = id return nil } // Delete is a modelInstance.Delete() method handler for external attributes func (it *SampleDelegate) Delete() error { it.instance.(*SampleModel).d = true return nil } // Save is a modelInstance.Save() method handler for external attributes func (it *SampleDelegate) Save() error { it.instance.(*SampleModel).s = true return nil } // SetID is a modelInstance.SetID() method handler for external attributes func (it *SampleDelegate) SetID(newID string) error { it.instance.(*SampleModel).i = newID return nil } // GetAttributesInfo is a specification of external attributes func (it *SampleDelegate) GetAttributesInfo() []models.StructAttributeInfo { return []models.StructAttributeInfo{ models.StructAttributeInfo{ Model: "", Collection: "", Attribute: "a", Type: utils.ConstDataTypeText, Label: "A", IsRequired: false, IsStatic: false, Group: "Sample", Editors: "text", }, models.StructAttributeInfo{ Model: "Example", Collection: "", Attribute: "b", Type: utils.ConstDataTypeFloat, Label: "B", IsRequired: false, IsStatic: false, Group: "Sample", Editors: "text", }, } } // ExampleExternalAttributes creates 2 instances of SampleModel func main() { // registering SampleDelegate for SampleModel on attributes "a" and "b" modelInstance, err := new(SampleModel).New() if err != nil { panic(err) } modelEA, ok := modelInstance.(models.InterfaceExternalAttributes) if !ok { panic(errors.New("InterfaceExternalAttributes not impelemented")) } delegate := new(SampleDelegate) if err := modelEA.AddExternalAttributes(delegate); err != nil { panic(err) } // testing result: setting "a", "b" attributes to SampleModel instances and getting them back var obj1, obj2 models.InterfaceObject if x, err := modelInstance.New(); err == nil { if obj1, ok = x.(models.InterfaceObject); !ok { panic(errors.New("InterfaceObject not impelemented")) } } else { panic(err) } if x, err := modelInstance.New(); err == nil { if obj2, ok = x.(models.InterfaceObject); !ok { panic(errors.New("InterfaceObject not impelemented")) } } else { panic(err) } if err = obj1.Set("a", "object1"); err != nil { panic(err) } if err = obj2.Set("a", "object2"); err != nil { panic(err) } if err = obj1.Set("b", 1.2); err != nil { panic(err) } if err = obj2.Set("b", 3.3); err != nil { panic(err) } if obj1.Get("a") != "object1" || obj1.Get("b") != 1.2 || obj2.Get("a") != "object2" || obj2.Get("b") != 3.3 { panic(errors.New(fmt.Sprint("incorrect get values: "+ "obj1.a=", obj1.Get("a"), ", ", "obj1.b=", obj1.Get("b"), ", ", "obj2.a=", obj2.Get("a"), ", ", "obj2.b=", obj2.Get("b"), ))) } if obj1, ok := obj1.(models.InterfaceStorable); ok { if err := obj1.Load("1"); err != nil { panic(err) } if err := obj1.Save(); err != nil { panic(err) } if err := obj1.Delete(); err != nil { panic(err) } if err := obj1.SetID("10"); err != nil { panic(err) } } else { panic(errors.New("models.InterfaceStorable not implemented")) } if obj1, ok := obj1.(*SampleModel); ok { if !obj1.d || !obj1.s || obj1.l != "1" || obj1.i != "10" { panic(errors.New(fmt.Sprint("incorrect get values: "+ "obj1.l=", obj1.l, ", ", "obj1.s=", obj1.s, ", ", "obj1.d=", obj1.d, ", ", "obj1.i=", obj1.i, ))) } } else { panic(errors.New("(*SampleModel) conversion error")) } }
Output:
func (*ModelExternalAttributes) AddExternalAttributes ¶
func (it *ModelExternalAttributes) AddExternalAttributes(delegate models.InterfaceAttributesDelegate) error
AddExternalAttributes registers new delegate for a it's attributes - delegate.GetAttributesInfo()
func (*ModelExternalAttributes) Delete ¶
func (it *ModelExternalAttributes) Delete() error
Delete proxies method to external attribute delegates
func (*ModelExternalAttributes) FromHashMap ¶
func (it *ModelExternalAttributes) FromHashMap(input map[string]interface{}) error
FromHashMap updates delegated attributes from given map
func (*ModelExternalAttributes) Get ¶
func (it *ModelExternalAttributes) Get(attribute string) interface{}
Get returns object attribute value or nil
func (*ModelExternalAttributes) GetAttributesInfo ¶
func (it *ModelExternalAttributes) GetAttributesInfo() []models.StructAttributeInfo
GetAttributesInfo represents object as map[string]interface{}
func (*ModelExternalAttributes) GetID ¶
func (it *ModelExternalAttributes) GetID() string
GetID stub function - callback to instance getID()
func (*ModelExternalAttributes) GetImplementationName ¶
func (it *ModelExternalAttributes) GetImplementationName() string
GetImplementationName stub func for Model interface - doing callback to model instance function if possible
func (*ModelExternalAttributes) GetInstance ¶
func (it *ModelExternalAttributes) GetInstance() interface{}
GetInstance returns current instance delegate attached to
func (*ModelExternalAttributes) GetModelName ¶
func (it *ModelExternalAttributes) GetModelName() string
GetModelName stub func for Model interface - returns model name
func (*ModelExternalAttributes) ListExternalAttributes ¶
func (it *ModelExternalAttributes) ListExternalAttributes() map[string]models.InterfaceAttributesDelegate
ListExternalAttributes returns delegate per attribute mapping
func (*ModelExternalAttributes) Load ¶
func (it *ModelExternalAttributes) Load(id string) error
Load proxies method to external attribute delegates
func (*ModelExternalAttributes) RemoveExternalAttributes ¶
func (it *ModelExternalAttributes) RemoveExternalAttributes(delegate models.InterfaceAttributesDelegate) error
RemoveExternalAttributes removes the delegate for it's attributes - delegate.GetAttributesInfo()
func (*ModelExternalAttributes) Save ¶
func (it *ModelExternalAttributes) Save() error
Save proxies method to external attribute delegates
func (*ModelExternalAttributes) Set ¶
func (it *ModelExternalAttributes) Set(attribute string, value interface{}) error
Set sets attribute value to object or returns error
func (*ModelExternalAttributes) SetID ¶
func (it *ModelExternalAttributes) SetID(id string) error
SetID proxies method to external attribute delegates
func (*ModelExternalAttributes) ToHashMap ¶
func (it *ModelExternalAttributes) ToHashMap() map[string]interface{}
ToHashMap returns delegated attributes in map