Centralize metadata suffix definitions (#5134)
<!-- PR description--> Centralizing the suffixes so that group mailbox and future services can also use them. * Move `.meta`, `.data`, `.dirmeta` definitions from `internal/m365/collection/drive/metadata` pkg to `pkg/services/m365/api/graph/metadata`. * Adjust package names in misc places. * No logic change. * We should probably keep all metadata definitions and code in one place, i.e. relocate drive metadata definitions to `pkg/services/m365/api/graph/metadata`. This is a bigger change, we can do it later. --- #### Does this PR need a docs update or release note? - [ ] ✅ Yes, it's included - [ ] 🕐 Yes, but in a later PR - [x] ⛔ No #### Type of change <!--- Please check the type of change your PR introduces: ---> - [ ] 🌻 Feature - [ ] 🐛 Bugfix - [ ] 🗺️ Documentation - [ ] 🤖 Supportability/Tests - [ ] 💻 CI/Deployment - [x] 🧹 Tech Debt/Cleanup #### Issue(s) <!-- Can reference multiple issues. Use one of the following "magic words" - "closes, fixes" to auto-close the Github issue. --> * #<issue> #### Test Plan <!-- How will this be tested prior to merging.--> - [x] 💪 Manual - [ ] ⚡ Unit test - [ ] 💚 E2E
This commit is contained in:
parent
683f163df1
commit
8133da3087
@ -27,7 +27,6 @@ import (
|
||||
strTD "github.com/alcionai/corso/src/internal/common/str/testdata"
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
dataMock "github.com/alcionai/corso/src/internal/data/mock"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
exchMock "github.com/alcionai/corso/src/internal/m365/service/exchange/mock"
|
||||
istats "github.com/alcionai/corso/src/internal/stats"
|
||||
"github.com/alcionai/corso/src/internal/tester"
|
||||
@ -38,6 +37,7 @@ import (
|
||||
"github.com/alcionai/corso/src/pkg/fault"
|
||||
"github.com/alcionai/corso/src/pkg/logger"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
storeTD "github.com/alcionai/corso/src/pkg/storage/testdata"
|
||||
)
|
||||
|
||||
|
||||
@ -16,7 +16,6 @@ import (
|
||||
"github.com/alcionai/corso/src/internal/common/idname"
|
||||
"github.com/alcionai/corso/src/internal/common/ptr"
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
"github.com/alcionai/corso/src/internal/m365/support"
|
||||
"github.com/alcionai/corso/src/internal/observe"
|
||||
"github.com/alcionai/corso/src/pkg/backup/details"
|
||||
@ -29,6 +28,7 @@ import (
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/custom"
|
||||
)
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@ import (
|
||||
"github.com/alcionai/corso/src/internal/common/ptr"
|
||||
"github.com/alcionai/corso/src/internal/common/readers"
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
odmetadata "github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
metaTD "github.com/alcionai/corso/src/internal/m365/collection/drive/metadata/testdata"
|
||||
odTD "github.com/alcionai/corso/src/internal/m365/service/onedrive/testdata"
|
||||
"github.com/alcionai/corso/src/internal/m365/support"
|
||||
@ -34,6 +34,7 @@ import (
|
||||
"github.com/alcionai/corso/src/pkg/fault"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/custom"
|
||||
)
|
||||
|
||||
@ -73,13 +74,13 @@ func (suite *CollectionUnitSuite) TestCollection() {
|
||||
stubMetaID = "testMetaID"
|
||||
stubMetaEntityID = "email@provider.com"
|
||||
stubMetaRoles = []string{"read", "write"}
|
||||
stubMeta = metadata.Metadata{
|
||||
stubMeta = odmetadata.Metadata{
|
||||
FileName: stubItemName,
|
||||
Permissions: []metadata.Permission{
|
||||
Permissions: []odmetadata.Permission{
|
||||
{
|
||||
ID: stubMetaID,
|
||||
EntityID: stubMetaEntityID,
|
||||
EntityType: metadata.GV2User,
|
||||
EntityType: odmetadata.GV2User,
|
||||
Roles: stubMetaRoles,
|
||||
Expiration: &now,
|
||||
},
|
||||
@ -208,7 +209,7 @@ func (suite *CollectionUnitSuite) TestCollection() {
|
||||
mbh.GetErrs = []error{test.getErr}
|
||||
mbh.GI = getsItem{Err: assert.AnError}
|
||||
|
||||
pcr := metaTD.NewStubPermissionResponse(metadata.GV2User, stubMetaID, stubMetaEntityID, stubMetaRoles)
|
||||
pcr := metaTD.NewStubPermissionResponse(odmetadata.GV2User, stubMetaID, stubMetaEntityID, stubMetaRoles)
|
||||
mbh.GIP = getsItemPermission{Perm: pcr}
|
||||
|
||||
coll, err := NewCollection(
|
||||
@ -294,7 +295,7 @@ func (suite *CollectionUnitSuite) TestCollection() {
|
||||
assert.Equal(t, readers.DefaultSerializationVersion, rr.Format().Version)
|
||||
assert.False(t, rr.Format().DelInFlight)
|
||||
|
||||
readMeta := metadata.Metadata{}
|
||||
readMeta := odmetadata.Metadata{}
|
||||
err = json.NewDecoder(rr).Decode(&readMeta)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
|
||||
@ -14,7 +14,6 @@ import (
|
||||
"github.com/alcionai/corso/src/internal/common/prefixmatcher"
|
||||
"github.com/alcionai/corso/src/internal/common/ptr"
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts"
|
||||
"github.com/alcionai/corso/src/internal/m365/support"
|
||||
bupMD "github.com/alcionai/corso/src/pkg/backup/metadata"
|
||||
@ -26,6 +25,7 @@ import (
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/pagers"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/custom"
|
||||
)
|
||||
|
||||
@ -9,9 +9,9 @@ import (
|
||||
"golang.org/x/exp/maps"
|
||||
|
||||
"github.com/alcionai/corso/src/internal/common/ptr"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
"github.com/alcionai/corso/src/pkg/logger"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/custom"
|
||||
)
|
||||
|
||||
|
||||
@ -7,13 +7,13 @@ import (
|
||||
"github.com/alcionai/clues"
|
||||
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
"github.com/alcionai/corso/src/internal/version"
|
||||
"github.com/alcionai/corso/src/pkg/control"
|
||||
"github.com/alcionai/corso/src/pkg/export"
|
||||
"github.com/alcionai/corso/src/pkg/fault"
|
||||
"github.com/alcionai/corso/src/pkg/metrics"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
)
|
||||
|
||||
func NewExportCollection(
|
||||
|
||||
@ -12,9 +12,9 @@ import (
|
||||
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
dataMock "github.com/alcionai/corso/src/internal/data/mock"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
"github.com/alcionai/corso/src/internal/tester"
|
||||
"github.com/alcionai/corso/src/internal/version"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
)
|
||||
|
||||
type ExportUnitSuite struct {
|
||||
|
||||
@ -19,7 +19,6 @@ import (
|
||||
"github.com/alcionai/corso/src/internal/common/ptr"
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
dataMock "github.com/alcionai/corso/src/internal/data/mock"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts"
|
||||
"github.com/alcionai/corso/src/internal/m365/support"
|
||||
"github.com/alcionai/corso/src/internal/tester"
|
||||
@ -34,6 +33,7 @@ import (
|
||||
"github.com/alcionai/corso/src/pkg/selectors"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
apiMock "github.com/alcionai/corso/src/pkg/services/m365/api/mock"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/pagers"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/custom"
|
||||
|
||||
@ -10,12 +10,13 @@ import (
|
||||
"github.com/alcionai/corso/src/internal/common/ptr"
|
||||
"github.com/alcionai/corso/src/internal/common/syncd"
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
odmetadata "github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
"github.com/alcionai/corso/src/internal/version"
|
||||
"github.com/alcionai/corso/src/pkg/fault"
|
||||
"github.com/alcionai/corso/src/pkg/logger"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
)
|
||||
|
||||
// empty string is used to indicate that a permission cannot be restored
|
||||
@ -23,20 +24,20 @@ const nonRestorablePermission = ""
|
||||
|
||||
func getParentMetadata(
|
||||
parentPath path.Path,
|
||||
parentDirToMeta syncd.MapTo[metadata.Metadata],
|
||||
) (metadata.Metadata, error) {
|
||||
parentDirToMeta syncd.MapTo[odmetadata.Metadata],
|
||||
) (odmetadata.Metadata, error) {
|
||||
parentMeta, ok := parentDirToMeta.Load(parentPath.String())
|
||||
if !ok {
|
||||
drivePath, err := path.ToDrivePath(parentPath)
|
||||
if err != nil {
|
||||
return metadata.Metadata{}, clues.Wrap(err, "invalid restore path")
|
||||
return odmetadata.Metadata{}, clues.Wrap(err, "invalid restore path")
|
||||
}
|
||||
|
||||
if len(drivePath.Folders) != 0 {
|
||||
return metadata.Metadata{}, clues.Wrap(err, "computing item permissions")
|
||||
return odmetadata.Metadata{}, clues.Wrap(err, "computing item permissions")
|
||||
}
|
||||
|
||||
parentMeta = metadata.Metadata{}
|
||||
parentMeta = odmetadata.Metadata{}
|
||||
}
|
||||
|
||||
return parentMeta, nil
|
||||
@ -49,9 +50,9 @@ func getCollectionMetadata(
|
||||
caches *restoreCaches,
|
||||
backupVersion int,
|
||||
restorePerms bool,
|
||||
) (metadata.Metadata, error) {
|
||||
) (odmetadata.Metadata, error) {
|
||||
if !restorePerms || backupVersion < version.OneDrive1DataAndMetaFiles {
|
||||
return metadata.Metadata{}, nil
|
||||
return odmetadata.Metadata{}, nil
|
||||
}
|
||||
|
||||
var (
|
||||
@ -61,13 +62,13 @@ func getCollectionMetadata(
|
||||
|
||||
if len(drivePath.Folders) == 0 {
|
||||
// No permissions for root folder
|
||||
return metadata.Metadata{}, nil
|
||||
return odmetadata.Metadata{}, nil
|
||||
}
|
||||
|
||||
if backupVersion < version.OneDrive4DirIncludesPermissions {
|
||||
colMeta, err := getParentMetadata(fullPath, caches.ParentDirToMeta)
|
||||
if err != nil {
|
||||
return metadata.Metadata{}, clues.Wrap(err, "collection metadata")
|
||||
return odmetadata.Metadata{}, clues.Wrap(err, "collection metadata")
|
||||
}
|
||||
|
||||
return colMeta, nil
|
||||
@ -82,7 +83,7 @@ func getCollectionMetadata(
|
||||
|
||||
meta, err := FetchAndReadMetadata(ctx, dc, metaName)
|
||||
if err != nil {
|
||||
return metadata.Metadata{}, clues.Wrap(err, "collection metadata")
|
||||
return odmetadata.Metadata{}, clues.Wrap(err, "collection metadata")
|
||||
}
|
||||
|
||||
return meta, nil
|
||||
@ -93,9 +94,9 @@ func getCollectionMetadata(
|
||||
func computePreviousLinkShares(
|
||||
ctx context.Context,
|
||||
originDir path.Path,
|
||||
parentMetas syncd.MapTo[metadata.Metadata],
|
||||
) ([]metadata.LinkShare, error) {
|
||||
linkShares := []metadata.LinkShare{}
|
||||
parentMetas syncd.MapTo[odmetadata.Metadata],
|
||||
) ([]odmetadata.LinkShare, error) {
|
||||
linkShares := []odmetadata.LinkShare{}
|
||||
ctx = clues.Add(ctx, "origin_dir", originDir)
|
||||
|
||||
parent, err := originDir.Dir()
|
||||
@ -122,7 +123,7 @@ func computePreviousLinkShares(
|
||||
|
||||
// Any change in permissions would change it to custom
|
||||
// permission set and so we can filter on that.
|
||||
if meta.SharingMode == metadata.SharingModeCustom {
|
||||
if meta.SharingMode == odmetadata.SharingModeCustom {
|
||||
linkShares = append(linkShares, meta.LinkShares...)
|
||||
}
|
||||
|
||||
@ -143,11 +144,11 @@ func computePreviousMetadata(
|
||||
ctx context.Context,
|
||||
originDir path.Path,
|
||||
// map parent dir -> parent's metadata
|
||||
parentMetas syncd.MapTo[metadata.Metadata],
|
||||
) (metadata.Metadata, error) {
|
||||
parentMetas syncd.MapTo[odmetadata.Metadata],
|
||||
) (odmetadata.Metadata, error) {
|
||||
var (
|
||||
parent path.Path
|
||||
meta metadata.Metadata
|
||||
meta odmetadata.Metadata
|
||||
|
||||
err error
|
||||
ok bool
|
||||
@ -158,26 +159,26 @@ func computePreviousMetadata(
|
||||
for {
|
||||
parent, err = parent.Dir()
|
||||
if err != nil {
|
||||
return metadata.Metadata{}, clues.WrapWC(ctx, err, "getting parent")
|
||||
return odmetadata.Metadata{}, clues.WrapWC(ctx, err, "getting parent")
|
||||
}
|
||||
|
||||
ictx := clues.Add(ctx, "parent_dir", parent)
|
||||
|
||||
drivePath, err := path.ToDrivePath(parent)
|
||||
if err != nil {
|
||||
return metadata.Metadata{}, clues.WrapWC(ictx, err, "transforming dir to drivePath")
|
||||
return odmetadata.Metadata{}, clues.WrapWC(ictx, err, "transforming dir to drivePath")
|
||||
}
|
||||
|
||||
if len(drivePath.Folders) == 0 {
|
||||
return metadata.Metadata{}, nil
|
||||
return odmetadata.Metadata{}, nil
|
||||
}
|
||||
|
||||
meta, ok = parentMetas.Load(parent.String())
|
||||
if !ok {
|
||||
return metadata.Metadata{}, clues.NewWC(ictx, "no metadata found for parent folder: "+parent.String())
|
||||
return odmetadata.Metadata{}, clues.NewWC(ictx, "no metadata found for parent folder: "+parent.String())
|
||||
}
|
||||
|
||||
if meta.SharingMode == metadata.SharingModeCustom {
|
||||
if meta.SharingMode == odmetadata.SharingModeCustom {
|
||||
return meta, nil
|
||||
}
|
||||
}
|
||||
@ -195,7 +196,7 @@ func UpdatePermissions(
|
||||
udip updateDeleteItemPermissioner,
|
||||
driveID string,
|
||||
itemID string,
|
||||
permAdded, permRemoved []metadata.Permission,
|
||||
permAdded, permRemoved []odmetadata.Permission,
|
||||
oldPermIDToNewID syncd.MapTo[string],
|
||||
errs *fault.Bus,
|
||||
) error {
|
||||
@ -260,7 +261,7 @@ func UpdatePermissions(
|
||||
|
||||
// TODO: sitegroup support. Currently errors with "One or more users could not be resolved",
|
||||
// likely due to the site group entityID consisting of a single integer (ex: 4)
|
||||
if len(roles) == 0 || p.EntityType == metadata.GV2SiteGroup {
|
||||
if len(roles) == 0 || p.EntityType == odmetadata.GV2SiteGroup {
|
||||
continue
|
||||
}
|
||||
|
||||
@ -315,7 +316,7 @@ func UpdateLinkShares(
|
||||
upils updateDeleteItemLinkSharer,
|
||||
driveID string,
|
||||
itemID string,
|
||||
lsAdded, lsRemoved []metadata.LinkShare,
|
||||
lsAdded, lsRemoved []odmetadata.LinkShare,
|
||||
oldLinkShareIDToNewID syncd.MapTo[string],
|
||||
errs *fault.Bus,
|
||||
) (bool, error) {
|
||||
@ -347,7 +348,7 @@ func UpdateLinkShares(
|
||||
for _, iden := range ls.Entities {
|
||||
// TODO: sitegroup support. Currently errors with "One or more users could not be resolved",
|
||||
// likely due to the site group entityID consisting of a single integer (ex: 4)
|
||||
if iden.EntityType == metadata.GV2SiteGroup {
|
||||
if iden.EntityType == odmetadata.GV2SiteGroup {
|
||||
continue
|
||||
}
|
||||
|
||||
@ -457,11 +458,11 @@ func UpdateLinkShares(
|
||||
|
||||
func filterUnavailableEntitiesInLinkShare(
|
||||
ctx context.Context,
|
||||
linkShares []metadata.LinkShare,
|
||||
linkShares []odmetadata.LinkShare,
|
||||
availableEntities ResourceIDNames,
|
||||
oldLinkShareIDToNewID syncd.MapTo[string],
|
||||
) []metadata.LinkShare {
|
||||
filtered := []metadata.LinkShare{}
|
||||
) []odmetadata.LinkShare {
|
||||
filtered := []odmetadata.LinkShare{}
|
||||
|
||||
if availableEntities.Users == nil || availableEntities.Groups == nil {
|
||||
// This should not be happening unless we missed to fill in the caches
|
||||
@ -470,20 +471,20 @@ func filterUnavailableEntitiesInLinkShare(
|
||||
}
|
||||
|
||||
for _, p := range linkShares {
|
||||
entities := []metadata.Entity{}
|
||||
entities := []odmetadata.Entity{}
|
||||
|
||||
for _, e := range p.Entities {
|
||||
available := false
|
||||
|
||||
switch e.EntityType {
|
||||
case metadata.GV2User:
|
||||
case odmetadata.GV2User:
|
||||
// Link shares with external users won't have IDs
|
||||
if len(e.ID) == 0 && len(e.Email) > 0 {
|
||||
available = true
|
||||
} else {
|
||||
_, available = availableEntities.Users.NameOf(e.ID)
|
||||
}
|
||||
case metadata.GV2Group:
|
||||
case odmetadata.GV2Group:
|
||||
_, available = availableEntities.Groups.NameOf(e.ID)
|
||||
default:
|
||||
// We only know about users and groups
|
||||
@ -513,26 +514,26 @@ func filterUnavailableEntitiesInLinkShare(
|
||||
|
||||
func filterUnavailableEntitiesInPermissions(
|
||||
ctx context.Context,
|
||||
perms []metadata.Permission,
|
||||
perms []odmetadata.Permission,
|
||||
availableEntities ResourceIDNames,
|
||||
oldPermIDToNewID syncd.MapTo[string],
|
||||
) []metadata.Permission {
|
||||
) []odmetadata.Permission {
|
||||
if availableEntities.Users == nil || availableEntities.Groups == nil {
|
||||
// This should not be happening unless we missed to fill in the caches
|
||||
logger.Ctx(ctx).Info("no available entities, not filtering link shares")
|
||||
return perms
|
||||
}
|
||||
|
||||
filtered := []metadata.Permission{}
|
||||
filtered := []odmetadata.Permission{}
|
||||
|
||||
for _, p := range perms {
|
||||
available := false
|
||||
|
||||
switch p.EntityType {
|
||||
case metadata.GV2User:
|
||||
case odmetadata.GV2User:
|
||||
_, ok := availableEntities.Users.NameOf(p.EntityID)
|
||||
available = available || ok
|
||||
case metadata.GV2Group:
|
||||
case odmetadata.GV2Group:
|
||||
_, ok := availableEntities.Groups.NameOf(p.EntityID)
|
||||
available = available || ok
|
||||
default:
|
||||
@ -564,11 +565,11 @@ func RestorePermissions(
|
||||
driveID string,
|
||||
itemID string,
|
||||
itemPath path.Path,
|
||||
current metadata.Metadata,
|
||||
current odmetadata.Metadata,
|
||||
caches *restoreCaches,
|
||||
errs *fault.Bus,
|
||||
) {
|
||||
if current.SharingMode == metadata.SharingModeInherited {
|
||||
if current.SharingMode == odmetadata.SharingModeInherited {
|
||||
return
|
||||
}
|
||||
|
||||
@ -582,7 +583,7 @@ func RestorePermissions(
|
||||
}
|
||||
|
||||
if previousLinkShares != nil {
|
||||
lsAdded, lsRemoved := metadata.DiffLinkShares(previousLinkShares, current.LinkShares)
|
||||
lsAdded, lsRemoved := odmetadata.DiffLinkShares(previousLinkShares, current.LinkShares)
|
||||
lsAdded = filterUnavailableEntitiesInLinkShare(ctx, lsAdded, caches.AvailableEntities, caches.OldLinkShareIDToNewID)
|
||||
|
||||
// Link shares have to be updated before permissions as we have to
|
||||
@ -608,7 +609,7 @@ func RestorePermissions(
|
||||
return
|
||||
}
|
||||
|
||||
permAdded, permRemoved := metadata.DiffPermissions(previous.Permissions, current.Permissions)
|
||||
permAdded, permRemoved := odmetadata.DiffPermissions(previous.Permissions, current.Permissions)
|
||||
permAdded = filterUnavailableEntitiesInPermissions(ctx, permAdded, caches.AvailableEntities, caches.OldPermIDToNewID)
|
||||
|
||||
if didReset {
|
||||
@ -617,7 +618,7 @@ func RestorePermissions(
|
||||
// that an item has as they too will be removed.
|
||||
logger.Ctx(ctx).Debug("link share creation reset all inherited permissions")
|
||||
|
||||
permRemoved = []metadata.Permission{}
|
||||
permRemoved = []odmetadata.Permission{}
|
||||
permAdded = current.Permissions
|
||||
}
|
||||
|
||||
|
||||
@ -17,7 +17,7 @@ import (
|
||||
"github.com/alcionai/corso/src/internal/common/ptr"
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
"github.com/alcionai/corso/src/internal/diagnostics"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
odmetadata "github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
"github.com/alcionai/corso/src/internal/m365/support"
|
||||
"github.com/alcionai/corso/src/internal/observe"
|
||||
"github.com/alcionai/corso/src/internal/operations/inject"
|
||||
@ -31,6 +31,7 @@ import (
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/custom"
|
||||
)
|
||||
|
||||
@ -552,7 +553,7 @@ func CreateRestoreFolders(
|
||||
drivePath *path.DrivePath,
|
||||
restoreDir *path.Builder,
|
||||
folderPath path.Path,
|
||||
folderMetadata metadata.Metadata,
|
||||
folderMetadata odmetadata.Metadata,
|
||||
caches *restoreCaches,
|
||||
restorePerms bool,
|
||||
errs *fault.Bus,
|
||||
@ -876,12 +877,12 @@ func FetchAndReadMetadata(
|
||||
ctx context.Context,
|
||||
fibn data.FetchItemByNamer,
|
||||
metaName string,
|
||||
) (metadata.Metadata, error) {
|
||||
) (odmetadata.Metadata, error) {
|
||||
ctx = clues.Add(ctx, "meta_file_name", metaName)
|
||||
|
||||
metaFile, err := fibn.FetchItemByName(ctx, metaName)
|
||||
if err != nil {
|
||||
return metadata.Metadata{}, clues.Wrap(err, "getting item metadata")
|
||||
return odmetadata.Metadata{}, clues.Wrap(err, "getting item metadata")
|
||||
}
|
||||
|
||||
metaReader := metaFile.ToReader()
|
||||
@ -889,25 +890,25 @@ func FetchAndReadMetadata(
|
||||
|
||||
meta, err := getMetadata(metaReader)
|
||||
if err != nil {
|
||||
return metadata.Metadata{}, clues.Wrap(err, "deserializing item metadata")
|
||||
return odmetadata.Metadata{}, clues.Wrap(err, "deserializing item metadata")
|
||||
}
|
||||
|
||||
return meta, nil
|
||||
}
|
||||
|
||||
// getMetadata read and parses the metadata info for an item
|
||||
func getMetadata(metar io.ReadCloser) (metadata.Metadata, error) {
|
||||
var meta metadata.Metadata
|
||||
func getMetadata(metar io.ReadCloser) (odmetadata.Metadata, error) {
|
||||
var meta odmetadata.Metadata
|
||||
// `metar` will be nil for the top level container folder
|
||||
if metar != nil {
|
||||
metaraw, err := io.ReadAll(metar)
|
||||
if err != nil {
|
||||
return metadata.Metadata{}, err
|
||||
return odmetadata.Metadata{}, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(metaraw, &meta)
|
||||
if err != nil {
|
||||
return metadata.Metadata{}, err
|
||||
return odmetadata.Metadata{}, err
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@ import (
|
||||
"github.com/alcionai/corso/src/internal/common/ptr"
|
||||
"github.com/alcionai/corso/src/internal/common/readers"
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
odmetadata "github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
odStub "github.com/alcionai/corso/src/internal/m365/service/onedrive/stub"
|
||||
m365Stub "github.com/alcionai/corso/src/internal/m365/stub"
|
||||
"github.com/alcionai/corso/src/internal/tester"
|
||||
@ -29,6 +29,7 @@ import (
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/selectors"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
)
|
||||
|
||||
func testElementsMatch[T any](
|
||||
@ -693,7 +694,7 @@ func compareExchangeEvent(
|
||||
checkEvent(t, expectedEvent, itemEvent)
|
||||
}
|
||||
|
||||
func permissionEqual(expected metadata.Permission, got metadata.Permission) bool {
|
||||
func permissionEqual(expected odmetadata.Permission, got odmetadata.Permission) bool {
|
||||
if !strings.EqualFold(expected.Email, got.Email) {
|
||||
return false
|
||||
}
|
||||
@ -722,7 +723,7 @@ func permissionEqual(expected metadata.Permission, got metadata.Permission) bool
|
||||
return true
|
||||
}
|
||||
|
||||
func linkSharesEqual(expected metadata.LinkShare, got metadata.LinkShare) bool {
|
||||
func linkSharesEqual(expected odmetadata.LinkShare, got odmetadata.LinkShare) bool {
|
||||
if !strings.EqualFold(expected.Link.Scope, got.Link.Scope) {
|
||||
return false
|
||||
}
|
||||
@ -815,8 +816,8 @@ func compareDriveItem(
|
||||
|
||||
if isMeta {
|
||||
var (
|
||||
itemMeta metadata.Metadata
|
||||
expectedMeta metadata.Metadata
|
||||
itemMeta odmetadata.Metadata
|
||||
expectedMeta odmetadata.Metadata
|
||||
)
|
||||
|
||||
err = json.Unmarshal(buf, &itemMeta)
|
||||
@ -859,7 +860,7 @@ func compareDriveItem(
|
||||
assert.Equal(t, expectedMeta.SharingMode, itemMeta.SharingMode, "sharing mode")
|
||||
|
||||
// We cannot restore owner permissions, so skip checking them
|
||||
itemPerms := []metadata.Permission{}
|
||||
itemPerms := []odmetadata.Permission{}
|
||||
|
||||
for _, p := range itemMeta.Permissions {
|
||||
if p.Roles[0] != "owner" {
|
||||
|
||||
@ -8,41 +8,42 @@ import (
|
||||
"github.com/alcionai/clues"
|
||||
"github.com/google/uuid"
|
||||
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
odmetadata "github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts"
|
||||
m365Stub "github.com/alcionai/corso/src/internal/m365/stub"
|
||||
"github.com/alcionai/corso/src/internal/version"
|
||||
"github.com/alcionai/corso/src/pkg/backup/details"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
)
|
||||
|
||||
// For any version post this(inclusive), we expect to be using IDs for
|
||||
// permission instead of email
|
||||
const versionPermissionSwitchedToID = version.OneDrive4DirIncludesPermissions
|
||||
|
||||
func getMetadata(fileName string, meta MetaData, permUseID bool) metadata.Metadata {
|
||||
if meta.SharingMode != metadata.SharingModeCustom {
|
||||
return metadata.Metadata{
|
||||
func getMetadata(fileName string, meta MetaData, permUseID bool) odmetadata.Metadata {
|
||||
if meta.SharingMode != odmetadata.SharingModeCustom {
|
||||
return odmetadata.Metadata{
|
||||
FileName: fileName,
|
||||
SharingMode: meta.SharingMode,
|
||||
}
|
||||
}
|
||||
|
||||
testMeta := metadata.Metadata{FileName: fileName}
|
||||
testMeta := odmetadata.Metadata{FileName: fileName}
|
||||
|
||||
if len(meta.Perms.User) != 0 {
|
||||
// In case of permissions, the id will usually be same for same
|
||||
// user/role combo unless deleted and readded, but we have to do
|
||||
// this as we only have two users of which one is already taken.
|
||||
id := uuid.NewString()
|
||||
uperm := metadata.Permission{ID: id, Roles: meta.Perms.Roles}
|
||||
uperm := odmetadata.Permission{ID: id, Roles: meta.Perms.Roles}
|
||||
|
||||
uperm.Email = meta.Perms.User
|
||||
if permUseID {
|
||||
uperm.EntityID = meta.Perms.EntityID
|
||||
}
|
||||
|
||||
testMeta.Permissions = []metadata.Permission{uperm}
|
||||
testMeta.Permissions = []odmetadata.Permission{uperm}
|
||||
}
|
||||
|
||||
if len(meta.LinkShares) != 0 {
|
||||
@ -61,9 +62,9 @@ func getMetadata(fileName string, meta MetaData, permUseID bool) metadata.Metada
|
||||
roles = []string{"read"}
|
||||
}
|
||||
|
||||
ls := metadata.LinkShare{
|
||||
ls := odmetadata.LinkShare{
|
||||
ID: id, // id is required for mapping from parent
|
||||
Link: metadata.LinkShareLink{
|
||||
Link: odmetadata.LinkShareLink{
|
||||
Scope: ls.Scope,
|
||||
Type: ls.Type,
|
||||
WebURL: id,
|
||||
@ -86,13 +87,13 @@ type PermData struct {
|
||||
}
|
||||
|
||||
type LinkShareData struct {
|
||||
Entities []metadata.Entity
|
||||
Entities []odmetadata.Entity
|
||||
Scope string
|
||||
Type string
|
||||
}
|
||||
|
||||
type MetaData struct {
|
||||
SharingMode metadata.SharingMode
|
||||
SharingMode odmetadata.SharingMode
|
||||
Perms PermData
|
||||
LinkShares []LinkShareData
|
||||
}
|
||||
|
||||
@ -9,10 +9,10 @@ import (
|
||||
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
dataMock "github.com/alcionai/corso/src/internal/data/mock"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
exchMock "github.com/alcionai/corso/src/internal/m365/service/exchange/mock"
|
||||
"github.com/alcionai/corso/src/pkg/control"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
)
|
||||
|
||||
type ColInfo struct {
|
||||
|
||||
@ -7,8 +7,8 @@ import (
|
||||
|
||||
"github.com/alcionai/clues"
|
||||
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
)
|
||||
|
||||
// Max number of items for which we will print details. If there are
|
||||
|
||||
@ -13,12 +13,12 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts"
|
||||
"github.com/alcionai/corso/src/internal/tester"
|
||||
"github.com/alcionai/corso/src/internal/version"
|
||||
"github.com/alcionai/corso/src/pkg/dttm"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
)
|
||||
|
||||
// ------------------------------------------------------------
|
||||
|
||||
@ -10,7 +10,6 @@ import (
|
||||
"github.com/alcionai/corso/src/internal/common/idname"
|
||||
"github.com/alcionai/corso/src/internal/data"
|
||||
"github.com/alcionai/corso/src/internal/kopia"
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
"github.com/alcionai/corso/src/internal/model"
|
||||
"github.com/alcionai/corso/src/internal/operations"
|
||||
"github.com/alcionai/corso/src/internal/streamstore"
|
||||
@ -19,6 +18,7 @@ import (
|
||||
"github.com/alcionai/corso/src/pkg/backup/details"
|
||||
"github.com/alcionai/corso/src/pkg/fault"
|
||||
"github.com/alcionai/corso/src/pkg/selectors"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
"github.com/alcionai/corso/src/pkg/store"
|
||||
)
|
||||
|
||||
|
||||
@ -1,17 +1,16 @@
|
||||
package metadata
|
||||
|
||||
import (
|
||||
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
)
|
||||
|
||||
func IsMetadataFile(p path.Path) bool {
|
||||
switch p.Service() {
|
||||
case path.OneDriveService:
|
||||
return metadata.HasMetaSuffix(p.Item())
|
||||
return HasMetaSuffix(p.Item())
|
||||
|
||||
case path.SharePointService, path.GroupsService:
|
||||
return p.Category() == path.LibrariesCategory && metadata.HasMetaSuffix(p.Item())
|
||||
return p.Category() == path.LibrariesCategory && HasMetaSuffix(p.Item())
|
||||
|
||||
default:
|
||||
return false
|
||||
|
||||
@ -9,7 +9,6 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
odmetadata "github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
|
||||
"github.com/alcionai/corso/src/internal/tester"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/services/m365/api/graph/metadata"
|
||||
@ -29,12 +28,12 @@ var (
|
||||
|
||||
notMetaSuffixes = []string{
|
||||
"",
|
||||
odmetadata.DataFileSuffix,
|
||||
metadata.DataFileSuffix,
|
||||
}
|
||||
|
||||
metaSuffixes = []string{
|
||||
odmetadata.MetaFileSuffix,
|
||||
odmetadata.DirMetaFileSuffix,
|
||||
metadata.MetaFileSuffix,
|
||||
metadata.DirMetaFileSuffix,
|
||||
}
|
||||
|
||||
cases = []testCase{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user