WIP ACLTree

This commit is contained in:
mcrakhman 2022-07-08 12:31:06 +02:00 committed by Mikhail Iudin
parent 45024837ff
commit ed06aadd21
No known key found for this signature in database
GPG Key ID: FAAAA8BAABDFF1C0
3 changed files with 130 additions and 11 deletions

View File

@ -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")
} }

View File

@ -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

View File

@ -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