diff --git a/data/document.go b/data/document.go index 375fede1..ebad98dc 100644 --- a/data/document.go +++ b/data/document.go @@ -11,14 +11,18 @@ type AccountData struct { } type Document struct { - thread threadmodels.Thread - stateProvider InitialStateProvider - accountData AccountData - decoder threadmodels.SigningPubKeyDecoder - aclTree *Tree - fullTree *Tree - aclTreeBuilder *ACLTreeBuilder - aclStateBuilder *ACLStateBuilder + thread threadmodels.Thread + stateProvider InitialStateProvider + accountData *AccountData + decoder threadmodels.SigningPubKeyDecoder + + treeBuilder *TreeBuilder + aclTreeBuilder *ACLTreeBuilder + aclStateBuilder *ACLStateBuilder + snapshotValidator *SnapshotValidator + docStateBuilder *documentStateBuilder + + docContext *documentContext } type UpdateResult int @@ -33,12 +37,19 @@ const ( func NewDocument( thread threadmodels.Thread, stateProvider InitialStateProvider, - accountData AccountData) *Document { + accountData *AccountData) *Document { + decoder := threadmodels.NewEd25519Decoder() return &Document{ - thread: thread, - stateProvider: stateProvider, - accountData: accountData, - decoder: threadmodels.NewEd25519Decoder(), + thread: thread, + stateProvider: stateProvider, + accountData: accountData, + decoder: decoder, + aclTreeBuilder: NewACLTreeBuilder(thread, decoder), + treeBuilder: NewTreeBuilder(thread, decoder), + snapshotValidator: NewSnapshotValidator(decoder, accountData), + aclStateBuilder: NewACLStateBuilder(decoder, accountData), + docStateBuilder: newDocumentStateBuilder(stateProvider), + docContext: &documentContext{}, } } @@ -47,10 +58,51 @@ func (d *Document) Update(changes []*pb.ACLChange) (DocumentState, UpdateResult, } func (d *Document) Build() (DocumentState, error) { - //treeBuilder := NewTreeBuilder(d.thread, threadmodels.NewEd25519Decoder()) + return d.build(false) +} - //return treeBuilder.Build(fromStart) - return nil, nil +func (d *Document) build(fromStart bool) (DocumentState, error) { + d.treeBuilder.Init() + d.aclTreeBuilder.Init() + + var err error + d.docContext.fullTree, err = d.treeBuilder.Build(fromStart) + if err != nil { + return nil, err + } + + d.docContext.aclTree, err = d.aclTreeBuilder.Build() + if err != nil { + return nil, err + } + + if !fromStart { + d.snapshotValidator.Init(d.docContext.aclTree) + valid, err := d.snapshotValidator.ValidateSnapshot(d.docContext.fullTree.root) + if err != nil { + return nil, err + } + if !valid { + return d.build(true) + } + } + err = d.aclStateBuilder.Init(d.docContext.fullTree) + if err != nil { + return nil, err + } + + d.docContext.aclState, err = d.aclStateBuilder.Build() + if err != nil { + return nil, err + } + + d.docStateBuilder.init(d.docContext.aclState, d.docContext.fullTree) + d.docContext.docState, err = d.docStateBuilder.build() + if err != nil { + return nil, err + } + + return d.docContext.docState, nil } func (d *Document) State() DocumentState { diff --git a/data/documentcontext.go b/data/documentcontext.go index eb4ff5cd..5d723e9a 100644 --- a/data/documentcontext.go +++ b/data/documentcontext.go @@ -1,32 +1,8 @@ package data -import "github.com/anytypeio/go-anytype-infrastructure-experiments/data/threadmodels" - type documentContext struct { - aclTree *Tree - fullTree *Tree - identity string - encryptionKey threadmodels.EncryptionPrivKey - decoder threadmodels.SigningPubKeyDecoder - aclState *ACLState - docState DocumentState - changeCache map[string]*Change - identityKeys map[string]threadmodels.SigningPubKey -} - -func newDocumentContext( - identity string, - encryptionKey threadmodels.EncryptionPrivKey, - decoder threadmodels.SigningPubKeyDecoder) *documentContext { - return &documentContext{ - aclTree: &Tree{}, - fullTree: &Tree{}, - identity: identity, - encryptionKey: encryptionKey, - decoder: decoder, - aclState: nil, - docState: nil, - changeCache: make(map[string]*Change), - identityKeys: make(map[string]threadmodels.SigningPubKey), - } + aclTree *Tree + fullTree *Tree + aclState *ACLState + docState DocumentState }