115 lines
2.9 KiB
Go
115 lines
2.9 KiB
Go
package groups
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
|
|
"github.com/microsoft/kiota-abstractions-go/serialization"
|
|
|
|
"github.com/alcionai/corso/src/pkg/backup/details"
|
|
"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"
|
|
"github.com/alcionai/corso/src/pkg/services/m365/api/pagers"
|
|
)
|
|
|
|
// itemer standardizes common behavior that can be expected from all
|
|
// items within a groups collection backup.
|
|
type groupsItemer interface {
|
|
serialization.Parsable
|
|
graph.GetIDer
|
|
graph.GetLastModifiedDateTimer
|
|
}
|
|
|
|
type backupHandler[C graph.GetIDer, I groupsItemer] interface {
|
|
getItemer[I]
|
|
getContainerser[C]
|
|
getContainerItemIDser
|
|
getItemAndAugmentInfoer[C, I]
|
|
includeContainerer[C]
|
|
canonicalPather
|
|
canMakeDeltaQuerieser
|
|
}
|
|
|
|
type getItemAndAugmentInfoer[C graph.GetIDer, I groupsItemer] interface {
|
|
getItemer[I]
|
|
getItemMetadataer[C, I]
|
|
augmentItemInfoer[C]
|
|
}
|
|
|
|
type augmentItemInfoer[C graph.GetIDer] interface {
|
|
// augmentItemInfo completes the groupInfo population with any data
|
|
// owned by the container and not accessible to the item.
|
|
augmentItemInfo(*details.GroupsInfo, C)
|
|
}
|
|
|
|
type getItemer[I groupsItemer] interface {
|
|
getItem(
|
|
ctx context.Context,
|
|
protectedResource string,
|
|
containerIDs path.Elements,
|
|
itemID string,
|
|
) (I, *details.GroupsInfo, error)
|
|
}
|
|
|
|
type getItemMetadataer[C graph.GetIDer, I groupsItemer] interface {
|
|
getItemMetadata(
|
|
ctx context.Context,
|
|
c C,
|
|
) (io.ReadCloser, int, error)
|
|
}
|
|
|
|
// gets all containers for the resource
|
|
type getContainerser[C graph.GetIDer] interface {
|
|
getContainers(
|
|
ctx context.Context,
|
|
cc api.CallConfig,
|
|
) ([]container[C], error)
|
|
}
|
|
|
|
// gets all item IDs (by delta, if possible) in the container
|
|
type getContainerItemIDser interface {
|
|
getContainerItemIDs(
|
|
ctx context.Context,
|
|
containerPath path.Elements,
|
|
prevDelta string,
|
|
cc api.CallConfig,
|
|
) (pagers.AddedAndRemoved, error)
|
|
}
|
|
|
|
// includeContainer evaluates whether the container is included
|
|
// in the provided scope.
|
|
type includeContainerer[C graph.GetIDer] interface {
|
|
includeContainer(
|
|
c C,
|
|
scope selectors.GroupsScope,
|
|
) bool
|
|
}
|
|
|
|
// canonicalPath constructs the service and category specific path for
|
|
// the given builder.
|
|
type canonicalPather interface {
|
|
canonicalPath(
|
|
storageDir path.Elements,
|
|
tenantID string,
|
|
) (path.Path, error)
|
|
}
|
|
|
|
// canMakeDeltaQueries evaluates whether the handler can support a
|
|
// delta query when enumerating its items.
|
|
type canMakeDeltaQuerieser interface {
|
|
canMakeDeltaQueries() bool
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Container management
|
|
// ---------------------------------------------------------------------------
|
|
|
|
type container[C graph.GetIDer] struct {
|
|
storageDirFolders path.Elements
|
|
humanLocation path.Elements
|
|
canMakeDeltaQueries bool
|
|
container C
|
|
}
|