82 lines
2.0 KiB
Go
82 lines
2.0 KiB
Go
package data
|
|
|
|
import (
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/core/block/editor/state"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/data/threadmodels"
|
|
)
|
|
|
|
type ACLContext struct {
|
|
Tree *Tree
|
|
ACLState *ACLState
|
|
DocState *state.State
|
|
}
|
|
|
|
func createTreeFromThread(t threadmodels.Thread, fromStart bool) (*Tree, error) {
|
|
treeBuilder := NewTreeBuilder(t, threadmodels.NewEd25519Decoder())
|
|
return treeBuilder.Build(fromStart)
|
|
}
|
|
|
|
func createACLStateFromThread(
|
|
t threadmodels.Thread,
|
|
identity string,
|
|
key threadmodels.EncryptionPrivKey,
|
|
decoder threadmodels.SigningPubKeyDecoder,
|
|
fromStart bool) (*ACLContext, error) {
|
|
tree, err := createTreeFromThread(t, fromStart)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
aclTreeBuilder := NewACLTreeBuilder(t, decoder)
|
|
aclTree, err := aclTreeBuilder.Build()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if !fromStart {
|
|
snapshotValidator := NewSnapshotValidator(aclTree, identity, key, decoder)
|
|
valid, err := snapshotValidator.ValidateSnapshot(tree.root)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !valid {
|
|
// TODO: think about what to do if the snapshot is invalid - should we rebuild the tree without it
|
|
return createACLStateFromThread(t, identity, key, decoder, true)
|
|
}
|
|
}
|
|
|
|
aclBuilder, err := NewACLStateBuilder(tree, identity, key, decoder)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
aclState, err := aclBuilder.Build()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &ACLContext{
|
|
Tree: tree,
|
|
ACLState: aclState,
|
|
}, nil
|
|
}
|
|
|
|
func createDocumentStateFromThread(
|
|
t threadmodels.Thread,
|
|
identity string,
|
|
key threadmodels.EncryptionPrivKey,
|
|
decoder threadmodels.SigningPubKeyDecoder) (*ACLContext, error) {
|
|
context, err := createACLStateFromThread(t, identity, key, decoder, false)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
docStateBuilder := newDocumentStateBuilder(context.Tree, context.ACLState)
|
|
docState, err := docStateBuilder.build()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
context.DocState = docState
|
|
|
|
return context, nil
|
|
}
|