WIP ACLTree
This commit is contained in:
parent
45024837ff
commit
ed06aadd21
@ -3,16 +3,9 @@ package acltree
|
|||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/account"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/thread"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/thread"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
||||||
)
|
)
|
||||||
|
|
||||||
func BuildACLTree(t thread.Thread, acc *account.AccountData) (ACLTree, error) {
|
|
||||||
// build tree from thread
|
|
||||||
// validate snapshot
|
|
||||||
// build aclstate -> filter tree
|
|
||||||
// return ACLTree(aclstate+)
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type AddResultSummary int
|
type AddResultSummary int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -31,9 +24,128 @@ type AddResult struct {
|
|||||||
|
|
||||||
type ACLTree interface {
|
type ACLTree interface {
|
||||||
ACLState() *ACLState
|
ACLState() *ACLState
|
||||||
AddChanges(changes ...*Change) (AddResult, error)
|
AddContent(changeContent *ChangeContent) (*Change, error)
|
||||||
|
AddChanges(changes ...*Change) (AddResult, error) // TODO: Make change as interface
|
||||||
Heads() []string
|
Heads() []string
|
||||||
Iterate(func(change *Change) bool)
|
Iterate(func(change *Change) bool)
|
||||||
IterateFrom(string, func(change *Change) bool)
|
IterateFrom(string, func(change *Change) bool)
|
||||||
HasChange(change *Change)
|
HasChange(change *Change) bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type aclTree struct {
|
||||||
|
thread thread.Thread
|
||||||
|
accountData *account.AccountData
|
||||||
|
|
||||||
|
fullTree *Tree
|
||||||
|
aclState *ACLState
|
||||||
|
|
||||||
|
treeBuilder *treeBuilder
|
||||||
|
aclTreeBuilder *aclTreeBuilder
|
||||||
|
aclStateBuilder *aclStateBuilder
|
||||||
|
snapshotValidator *snapshotValidator
|
||||||
|
}
|
||||||
|
|
||||||
|
func BuildACLTree(t thread.Thread, acc *account.AccountData) (ACLTree, error) {
|
||||||
|
decoder := keys.NewEd25519Decoder()
|
||||||
|
aclTreeBuilder := newACLTreeBuilder(t, decoder)
|
||||||
|
treeBuilder := newTreeBuilder(t, decoder)
|
||||||
|
snapshotValidator := newSnapshotValidator(decoder, acc)
|
||||||
|
aclStateBuilder := newACLStateBuilder(decoder, acc)
|
||||||
|
|
||||||
|
aclTree := &aclTree{
|
||||||
|
thread: t,
|
||||||
|
accountData: acc,
|
||||||
|
fullTree: nil,
|
||||||
|
aclState: nil,
|
||||||
|
treeBuilder: treeBuilder,
|
||||||
|
aclTreeBuilder: aclTreeBuilder,
|
||||||
|
aclStateBuilder: aclStateBuilder,
|
||||||
|
snapshotValidator: snapshotValidator,
|
||||||
|
}
|
||||||
|
err := aclTree.rebuildFromThread(false)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return aclTree, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *aclTree) rebuildFromThread(fromStart bool) error {
|
||||||
|
var aclTree *Tree
|
||||||
|
|
||||||
|
a.treeBuilder.init()
|
||||||
|
a.aclTreeBuilder.init()
|
||||||
|
|
||||||
|
var err error
|
||||||
|
a.fullTree, err = a.treeBuilder.build(fromStart)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: remove this from context as this is used only to validate snapshot
|
||||||
|
aclTree, err = a.aclTreeBuilder.build()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !fromStart {
|
||||||
|
err = a.snapshotValidator.init(aclTree)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
valid, err := a.snapshotValidator.validateSnapshot(a.fullTree.root)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !valid {
|
||||||
|
return a.rebuildFromThread(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = a.aclStateBuilder.init(a.fullTree)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
a.aclState, err = a.aclStateBuilder.build()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *aclTree) ACLState() *ACLState {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *aclTree) AddContent(changeContent *ChangeContent) (*Change, error) {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *aclTree) AddChanges(changes ...*Change) (AddResult, error) {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *aclTree) Heads() []string {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *aclTree) Iterate(f func(change *Change) bool) {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *aclTree) IterateFrom(s string, f func(change *Change) bool) {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *aclTree) HasChange(change *Change) bool {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,11 +2,18 @@ package acltree
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/gogo/protobuf/proto"
|
||||||
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/aclchanges/pb"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/aclchanges/pb"
|
||||||
"github.com/textileio/go-threads/crypto/symmetric"
|
"github.com/textileio/go-threads/crypto/symmetric"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type ChangeContent struct {
|
||||||
|
ChangesData proto.Marshaler
|
||||||
|
ACLData *pb.ACLChangeACLData
|
||||||
|
Id string // TODO: this is just for testing, because id should be created automatically from content
|
||||||
|
}
|
||||||
|
|
||||||
// Change is an abstract type for all types of changes
|
// Change is an abstract type for all types of changes
|
||||||
type Change struct {
|
type Change struct {
|
||||||
Next []*Change
|
Next []*Change
|
||||||
|
|||||||
@ -15,7 +15,7 @@ const (
|
|||||||
Nothing
|
Nothing
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: consider abstracting into separate package with iterator
|
// TODO: consider abstracting into separate package with iterator, remove
|
||||||
type Tree struct {
|
type Tree struct {
|
||||||
root *Change
|
root *Change
|
||||||
headIds []string
|
headIds []string
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user