adds the getPostIDs func to ensure conversations complies with standard data paging patterns --- #### Does this PR need a docs update or release note? - [x] ⛔ No #### Type of change - [x] 🌻 Feature #### Issue(s) * #4536 #### Test Plan - [x] ⚡ Unit test - [x] 💚 E2E
151 lines
4.2 KiB
Go
151 lines
4.2 KiB
Go
package exchange
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/microsoft/kiota-abstractions-go/serialization"
|
|
|
|
"github.com/alcionai/corso/src/internal/m365/graph"
|
|
"github.com/alcionai/corso/src/pkg/backup/details"
|
|
"github.com/alcionai/corso/src/pkg/control"
|
|
"github.com/alcionai/corso/src/pkg/count"
|
|
"github.com/alcionai/corso/src/pkg/fault"
|
|
"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"
|
|
)
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// backup
|
|
// ---------------------------------------------------------------------------
|
|
|
|
type backupHandler interface {
|
|
itemEnumerator() addedAndRemovedItemGetter
|
|
itemHandler() itemGetterSerializer
|
|
NewContainerCache(userID string) (string, graph.ContainerResolver)
|
|
}
|
|
|
|
type addedAndRemovedItemGetter interface {
|
|
GetAddedAndRemovedItemIDs(
|
|
ctx context.Context,
|
|
user, containerID, oldDeltaToken string,
|
|
cc api.CallConfig,
|
|
) (pagers.AddedAndRemoved, error)
|
|
}
|
|
|
|
type itemGetterSerializer interface {
|
|
GetItem(
|
|
ctx context.Context,
|
|
user, itemID string,
|
|
immutableIDs bool,
|
|
errs *fault.Bus,
|
|
) (serialization.Parsable, *details.ExchangeInfo, error)
|
|
Serialize(
|
|
ctx context.Context,
|
|
item serialization.Parsable,
|
|
user, itemID string,
|
|
) ([]byte, error)
|
|
}
|
|
|
|
func BackupHandlers(ac api.Client) map[path.CategoryType]backupHandler {
|
|
return map[path.CategoryType]backupHandler{
|
|
path.ContactsCategory: newContactBackupHandler(ac),
|
|
path.EmailCategory: newMailBackupHandler(ac),
|
|
path.EventsCategory: newEventBackupHandler(ac),
|
|
}
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// restore
|
|
// ---------------------------------------------------------------------------
|
|
|
|
type restoreHandler interface {
|
|
itemRestorer
|
|
containerAPI
|
|
getItemsByCollisionKeyser
|
|
NewContainerCache(userID string) graph.ContainerResolver
|
|
FormatRestoreDestination(
|
|
destinationContainerName string,
|
|
collectionFullPath path.Path,
|
|
) *path.Builder
|
|
}
|
|
|
|
// runs the item restoration (ie: item creation) process
|
|
// for a single item, whose summary contents are held in
|
|
// the body property.
|
|
type itemRestorer interface {
|
|
restore(
|
|
ctx context.Context,
|
|
body []byte,
|
|
userID, destinationID string,
|
|
collisionKeyToItemID map[string]string,
|
|
collisionPolicy control.CollisionPolicy,
|
|
errs *fault.Bus,
|
|
ctr *count.Bus,
|
|
) (*details.ExchangeInfo, error)
|
|
}
|
|
|
|
// produces structs that interface with the graph/cache_container
|
|
// CachedContainer interface.
|
|
type containerAPI interface {
|
|
containerByNamer
|
|
|
|
// POSTs the creation of a new container
|
|
CreateContainer(
|
|
ctx context.Context,
|
|
userID, parentContainerID, containerName string,
|
|
) (graph.Container, error)
|
|
DefaultRootContainer() string
|
|
}
|
|
|
|
type containerByNamer interface {
|
|
// searches for a container by name.
|
|
GetContainerByName(
|
|
ctx context.Context,
|
|
userID, parentContainerID, containerName string,
|
|
) (graph.Container, error)
|
|
}
|
|
|
|
// primary interface controller for all per-cateogry restoration behavior.
|
|
func RestoreHandlers(
|
|
ac api.Client,
|
|
) map[path.CategoryType]restoreHandler {
|
|
return map[path.CategoryType]restoreHandler{
|
|
path.ContactsCategory: newContactRestoreHandler(ac),
|
|
path.EmailCategory: newMailRestoreHandler(ac),
|
|
path.EventsCategory: newEventRestoreHandler(ac),
|
|
}
|
|
}
|
|
|
|
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,
|
|
userID, containerID string,
|
|
) (map[string]string, error)
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// other interfaces
|
|
// ---------------------------------------------------------------------------
|
|
|
|
type postItemer[T any] interface {
|
|
PostItem(
|
|
ctx context.Context,
|
|
userID, containerID string,
|
|
body T,
|
|
) (T, error)
|
|
}
|
|
|
|
type deleteItemer interface {
|
|
DeleteItem(
|
|
ctx context.Context,
|
|
userID, itemID string,
|
|
) error
|
|
}
|