1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-07 21:47:02 +09:00
any-sync/commonspace/spacestorage/migration/aclmigrator.go
2025-05-13 15:29:05 +02:00

63 lines
2.1 KiB
Go

package migration
import (
"context"
"fmt"
"slices"
anystore "github.com/anyproto/any-store"
"github.com/anyproto/any-sync/commonspace/headsync/headstorage"
"github.com/anyproto/any-sync/commonspace/object/accountdata"
"github.com/anyproto/any-sync/commonspace/object/acl/list"
"github.com/anyproto/any-sync/commonspace/object/acl/recordverifier"
"github.com/anyproto/any-sync/commonspace/spacestorage/oldstorage"
"github.com/anyproto/any-sync/consensus/consensusproto"
)
func migrateAclList(ctx context.Context, oldStorage oldstorage.ListStorage, headStorage headstorage.HeadStorage, store anystore.DB) (list.AclList, error) {
rootChange, err := oldStorage.Root()
if err != nil {
return nil, fmt.Errorf("migration: failed to get acl root change: %w", err)
}
head, err := oldStorage.Head()
if err != nil {
return nil, fmt.Errorf("migration: failed to get acl head: %w", err)
}
aclStorage, err := list.NewStorage(ctx, rootChange.Id, headStorage, store)
if err != nil {
return nil, fmt.Errorf("migration: failed to create acl storage: %w", err)
}
keys, err := accountdata.NewRandom()
if err != nil {
return nil, fmt.Errorf("migration: failed to generate keys: %w", err)
}
aclList, err := list.BuildAclListWithIdentity(keys, aclStorage, recordverifier.New())
if err != nil {
return nil, fmt.Errorf("migration: failed to build acl list: %w", err)
}
var (
allRecords []*consensusproto.RawRecordWithId
rec *consensusproto.RawRecordWithId
cur = head
builder = aclList.RecordBuilder()
)
for rec == nil || rec.Id != rootChange.Id {
rec, err = oldStorage.GetRawRecord(ctx, cur)
if err != nil {
return nil, fmt.Errorf("migration: failed to get acl record: %w", err)
}
allRecords = append(allRecords, rec)
res, err := builder.UnmarshallWithId(rec)
if err != nil {
return nil, fmt.Errorf("migration: failed to unmarshall acl record: %w", err)
}
cur = res.PrevId
}
slices.Reverse(allRecords)
err = aclList.AddRawRecords(allRecords)
if err != nil {
return nil, fmt.Errorf("migration: failed to add acl records: %w", err)
}
return aclList, nil
}