ryanfkeepers e1ed5275dc use query params in all handlers
backup handlers are all re-using the same inputs for
tenantID and protected resource ID.  In some cases we're
storing those values in the handler, other cases we don't.
This pr seeks to normalize backup handler design by expecting
a common structure for holding the resource and tenant ids.
2024-01-26 12:48:16 -07:00

209 lines
5.8 KiB
Go

package drive
import (
"context"
"github.com/microsoftgraph/msgraph-sdk-go/drives"
"github.com/microsoftgraph/msgraph-sdk-go/models"
"github.com/alcionai/corso/src/internal/common/idname"
"github.com/alcionai/corso/src/pkg/backup/details"
"github.com/alcionai/corso/src/pkg/control"
"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/pagers"
"github.com/alcionai/corso/src/pkg/services/m365/custom"
)
type ItemInfoAugmenter interface {
// AugmentItemInfo will populate a details.<Service>Info struct
// with properties from the drive item. ItemSize is passed in
// separately for restore processes because the local itemable
// doesn't have its size value updated as a side effect of creation,
// and kiota drops any SetSize update.
AugmentItemInfo(
dii details.ItemInfo,
resource idname.Provider,
item *custom.DriveItem,
size int64,
parentPath *path.Builder,
) details.ItemInfo
}
// ---------------------------------------------------------------------------
// backup
// ---------------------------------------------------------------------------
type BackupHandler interface {
ItemInfoAugmenter
api.Getter
GetItemPermissioner
GetItemer
GetRootFolderer
EnumerateDriveItemsDeltaer
// NewDrivePager produces a pager that fetches all drives for the
// protected resource in the handler. Differs from the restore
// drive pager in that it does not acccept a resource parameter.
NewDrivePager(fields []string) pagers.NonDeltaHandler[models.Driveable]
// PathPrefix constructs the service and category specific path prefix for
// the given values.
PathPrefix(driveID string) (path.Path, error)
// MetadataPathPrefix returns the prefix path for metadata
MetadataPathPrefix() (path.Path, error)
// CanonicalPath constructs the service and category specific path for
// the given values.
CanonicalPath(folders *path.Builder) (path.Path, error)
// ServiceCat returns the service and category used by this implementation.
ServiceCat() (path.ServiceType, path.CategoryType)
// FormatDisplayPath creates a human-readable string to represent the
// provided path.
FormatDisplayPath(driveName string, parentPath *path.Builder) string
NewLocationIDer(driveID string, elems ...string) details.LocationIDer
// scope wrapper funcs
IsAllPass() bool
IncludesDir(dir string) bool
}
type GetItemPermissioner interface {
GetItemPermission(
ctx context.Context,
driveID, itemID string,
) (models.PermissionCollectionResponseable, error)
}
type GetItemer interface {
GetItem(
ctx context.Context,
driveID, itemID string,
) (models.DriveItemable, error)
}
type EnumerateDriveItemsDeltaer interface {
EnumerateDriveItemsDelta(
ctx context.Context,
driveID, prevDeltaLink string,
cc api.CallConfig,
) pagers.NextPageResulter[models.DriveItemable]
}
// ---------------------------------------------------------------------------
// restore
// ---------------------------------------------------------------------------
type RestoreHandler interface {
DeleteItemer
DeleteItemPermissioner
GetFolderByNamer
GetItemsByCollisionKeyser
GetRootFolderer
ItemInfoAugmenter
NewItemContentUploader
PostDriver
PostItemInContainerer
DeleteItemPermissioner
UpdateItemPermissioner
UpdateItemLinkSharer
NewDrivePagerer
}
type DeleteItemer interface {
DeleteItem(
ctx context.Context,
driveID, itemID string,
) error
}
type DeleteItemPermissioner interface {
DeleteItemPermission(
ctx context.Context,
driveID, itemID, permissionID string,
) error
}
type GetItemsByCollisionKeyser interface {
// GetItemsInContainerByCollisionKey looks up all items currently in
// the container, and returns them in a map[collisionKey]itemID.
// The collision key is uniquely defined by each category of data.
// Collision key checks are used during restore to handle the on-
// collision restore configurations that cause the item restore to get
// skipped, replaced, or copied.
GetItemsInContainerByCollisionKey(
ctx context.Context,
driveID, containerID string,
) (map[string]api.DriveItemIDType, error)
}
type NewItemContentUploader interface {
// NewItemContentUpload creates an upload session which is used as a writer
// for large item content.
NewItemContentUpload(
ctx context.Context,
driveID, itemID string,
) (models.UploadSessionable, error)
}
type UpdateItemPermissioner interface {
PostItemPermissionUpdate(
ctx context.Context,
driveID, itemID string,
body *drives.ItemItemsItemInvitePostRequestBody,
) (drives.ItemItemsItemInviteResponseable, error)
}
type UpdateItemLinkSharer interface {
PostItemLinkShareUpdate(
ctx context.Context,
driveID, itemID string,
body *drives.ItemItemsItemCreateLinkPostRequestBody,
) (models.Permissionable, error)
}
type PostDriver interface {
PostDrive(
ctx context.Context,
protectedResourceID, driveName string,
) (models.Driveable, error)
}
type PostItemInContainerer interface {
PostItemInContainer(
ctx context.Context,
driveID, parentFolderID string,
newItem models.DriveItemable,
onCollision control.CollisionPolicy,
) (models.DriveItemable, error)
}
type GetFolderByNamer interface {
GetFolderByName(
ctx context.Context,
driveID, parentFolderID, folderID string,
) (models.DriveItemable, error)
}
type GetRootFolderer interface {
// GetRootFolder gets the root folder for the drive.
GetRootFolder(
ctx context.Context,
driveID string,
) (models.DriveItemable, error)
}
// NewDrivePagerer produces a pager that fetches all drives for the
// protected resource in the handler. Differs from the backup
// drive pager in that it accepts a resource parameter.
type NewDrivePagerer interface {
NewDrivePager(
protectedResourceID string,
fields []string,
) pagers.NonDeltaHandler[models.Driveable]
}