2024-01-26 14:20:11 -08:00

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
}