GC: Iteration Cleanup (#878)
## Description Small refactor. Moves Path functions from iterator to `service_functions.go` Introduces getCollectionPath which combines the two previous functions and reduces code complexity ## Type of change <!--- Please check the type of change your PR introduces: ---> - [x] 🐹 Trivial/Minor ## Issue(s) <!-- Can reference multiple issues. Use one of the following "magic words" - "closes, fixes" to auto-close the Github issue. --> * #<issue> ## Test Plan - [x] ⚡ Unit test
This commit is contained in:
parent
09343c0220
commit
14c437b48f
@ -13,6 +13,7 @@ import (
|
|||||||
|
|
||||||
"github.com/alcionai/corso/src/internal/connector/graph"
|
"github.com/alcionai/corso/src/internal/connector/graph"
|
||||||
"github.com/alcionai/corso/src/internal/connector/support"
|
"github.com/alcionai/corso/src/internal/connector/support"
|
||||||
|
"github.com/alcionai/corso/src/internal/path"
|
||||||
"github.com/alcionai/corso/src/pkg/account"
|
"github.com/alcionai/corso/src/pkg/account"
|
||||||
"github.com/alcionai/corso/src/pkg/selectors"
|
"github.com/alcionai/corso/src/pkg/selectors"
|
||||||
)
|
)
|
||||||
@ -354,3 +355,103 @@ func SetupExchangeCollectionVars(scope selectors.ExchangeScope) (
|
|||||||
|
|
||||||
return nil, nil, nil, errors.New("exchange scope option not supported")
|
return nil, nil, nil, errors.New("exchange scope option not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// maybeGetAndPopulateFolderResolver gets a folder resolver if one is available for
|
||||||
|
// this category of data. If one is not available, returns nil so that other
|
||||||
|
// logic in the caller can complete as long as they check if the resolver is not
|
||||||
|
// nil. If an error occurs populating the resolver, returns an error.
|
||||||
|
func maybeGetAndPopulateFolderResolver(
|
||||||
|
ctx context.Context,
|
||||||
|
qp graph.QueryParams,
|
||||||
|
category path.CategoryType,
|
||||||
|
) (graph.ContainerResolver, error) {
|
||||||
|
var res graph.ContainerResolver
|
||||||
|
|
||||||
|
switch category {
|
||||||
|
case path.EmailCategory:
|
||||||
|
service, err := createService(qp.Credentials, qp.FailFast)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
res = &mailFolderCache{
|
||||||
|
userID: qp.User,
|
||||||
|
gs: service,
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := res.Populate(ctx); err != nil {
|
||||||
|
return nil, errors.Wrap(err, "populating directory resolver")
|
||||||
|
}
|
||||||
|
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveCollectionPath(
|
||||||
|
ctx context.Context,
|
||||||
|
resolver graph.ContainerResolver,
|
||||||
|
tenantID, user, folderID string,
|
||||||
|
category path.CategoryType,
|
||||||
|
) (path.Path, error) {
|
||||||
|
if resolver == nil {
|
||||||
|
// Allows caller to default to old-style path.
|
||||||
|
return nil, errors.WithStack(errNilResolver)
|
||||||
|
}
|
||||||
|
|
||||||
|
p, err := resolver.IDToPath(ctx, folderID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "resolving folder ID")
|
||||||
|
}
|
||||||
|
|
||||||
|
return p.ToDataLayerExchangePathForCategory(
|
||||||
|
tenantID,
|
||||||
|
user,
|
||||||
|
category,
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getCollectionPath(
|
||||||
|
ctx context.Context,
|
||||||
|
qp graph.QueryParams,
|
||||||
|
resolver graph.ContainerResolver,
|
||||||
|
directory string,
|
||||||
|
category path.CategoryType,
|
||||||
|
) (path.Path, error) {
|
||||||
|
returnPath, err := resolveCollectionPath(
|
||||||
|
ctx,
|
||||||
|
resolver,
|
||||||
|
qp.Credentials.TenantID,
|
||||||
|
qp.User,
|
||||||
|
directory,
|
||||||
|
category,
|
||||||
|
)
|
||||||
|
if err == nil {
|
||||||
|
return returnPath, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
aPath, err1 := path.Builder{}.Append(directory).
|
||||||
|
ToDataLayerExchangePathForCategory(
|
||||||
|
qp.Credentials.TenantID,
|
||||||
|
qp.User,
|
||||||
|
category,
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
if err1 == nil {
|
||||||
|
return aPath, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil,
|
||||||
|
support.WrapAndAppend(
|
||||||
|
fmt.Sprintf(
|
||||||
|
"both path generate functions failed for %s:%s:%s",
|
||||||
|
qp.User,
|
||||||
|
category,
|
||||||
|
directory),
|
||||||
|
err,
|
||||||
|
err1,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
@ -25,64 +25,6 @@ type GraphIterateFunc func(
|
|||||||
statusUpdater support.StatusUpdater,
|
statusUpdater support.StatusUpdater,
|
||||||
) func(any) bool
|
) func(any) bool
|
||||||
|
|
||||||
// maybeGetAndPopulateFolderResolver gets a folder resolver if one is available for
|
|
||||||
// this category of data. If one is not available, returns nil so that other
|
|
||||||
// logic in the caller can complete as long as they check if the resolver is not
|
|
||||||
// nil. If an error occurs populating the resolver, returns an error.
|
|
||||||
func maybeGetAndPopulateFolderResolver(
|
|
||||||
ctx context.Context,
|
|
||||||
qp graph.QueryParams,
|
|
||||||
category path.CategoryType,
|
|
||||||
) (graph.ContainerResolver, error) {
|
|
||||||
var res graph.ContainerResolver
|
|
||||||
|
|
||||||
switch category {
|
|
||||||
case path.EmailCategory:
|
|
||||||
service, err := createService(qp.Credentials, qp.FailFast)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
res = &mailFolderCache{
|
|
||||||
userID: qp.User,
|
|
||||||
gs: service,
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := res.Populate(ctx); err != nil {
|
|
||||||
return nil, errors.Wrap(err, "populating directory resolver")
|
|
||||||
}
|
|
||||||
|
|
||||||
return res, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resolveCollectionPath(
|
|
||||||
ctx context.Context,
|
|
||||||
resolver graph.ContainerResolver,
|
|
||||||
tenantID, user, folderID string,
|
|
||||||
category path.CategoryType,
|
|
||||||
) (path.Path, error) {
|
|
||||||
if resolver == nil {
|
|
||||||
// Allows caller to default to old-style path.
|
|
||||||
return nil, errors.WithStack(errNilResolver)
|
|
||||||
}
|
|
||||||
|
|
||||||
p, err := resolver.IDToPath(ctx, folderID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "resolving folder ID")
|
|
||||||
}
|
|
||||||
|
|
||||||
return p.ToDataLayerExchangePathForCategory(
|
|
||||||
tenantID,
|
|
||||||
user,
|
|
||||||
category,
|
|
||||||
false,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IterateSelectAllDescendablesForCollection utility function for
|
// IterateSelectAllDescendablesForCollection utility function for
|
||||||
// Iterating through MessagesCollectionResponse or ContactsCollectionResponse,
|
// Iterating through MessagesCollectionResponse or ContactsCollectionResponse,
|
||||||
// objects belonging to any folder are
|
// objects belonging to any folder are
|
||||||
@ -99,6 +41,8 @@ func IterateSelectAllDescendablesForCollections(
|
|||||||
collectionType optionIdentifier
|
collectionType optionIdentifier
|
||||||
category path.CategoryType
|
category path.CategoryType
|
||||||
resolver graph.ContainerResolver
|
resolver graph.ContainerResolver
|
||||||
|
dirPath path.Path
|
||||||
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
return func(pageItem any) bool {
|
return func(pageItem any) bool {
|
||||||
@ -132,34 +76,19 @@ func IterateSelectAllDescendablesForCollections(
|
|||||||
// Saving to messages to list. Indexed by folder
|
// Saving to messages to list. Indexed by folder
|
||||||
directory := *entry.GetParentFolderId()
|
directory := *entry.GetParentFolderId()
|
||||||
|
|
||||||
dirPath, err := path.Builder{}.Append(directory).ToDataLayerExchangePathForCategory(
|
|
||||||
qp.Credentials.TenantID,
|
|
||||||
qp.User,
|
|
||||||
category,
|
|
||||||
false,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
// This really shouldn't happen unless we have a bad category.
|
|
||||||
errUpdater("converting to resource path", err)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, ok = collections[directory]; !ok {
|
if _, ok = collections[directory]; !ok {
|
||||||
newPath, err := resolveCollectionPath(
|
dirPath, err = getCollectionPath(
|
||||||
ctx,
|
ctx,
|
||||||
|
qp,
|
||||||
resolver,
|
resolver,
|
||||||
qp.Credentials.TenantID,
|
|
||||||
qp.User,
|
|
||||||
directory,
|
directory,
|
||||||
category,
|
category,
|
||||||
)
|
)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !errors.Is(err, errNilResolver) {
|
errUpdater(
|
||||||
errUpdater("", err)
|
"failure during IterateSelectAllDescendablesForCollections",
|
||||||
}
|
err,
|
||||||
} else {
|
)
|
||||||
dirPath = newPath
|
|
||||||
}
|
}
|
||||||
|
|
||||||
service, err := createService(qp.Credentials, qp.FailFast)
|
service, err := createService(qp.Credentials, qp.FailFast)
|
||||||
@ -254,7 +183,7 @@ func IterateSelectAllEventsFromCalendars(
|
|||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// we shouldn't ever hit this error
|
// we should never hit this error
|
||||||
errUpdater("converting to resource path", err)
|
errUpdater("converting to resource path", err)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -356,33 +285,20 @@ func IterateFilterFolderDirectoriesForCollections(
|
|||||||
|
|
||||||
directory := *folder.GetId()
|
directory := *folder.GetId()
|
||||||
|
|
||||||
dirPath, err := path.Builder{}.Append(directory).ToDataLayerExchangePathForCategory(
|
dirPath, err := getCollectionPath(
|
||||||
qp.Credentials.TenantID,
|
|
||||||
qp.User,
|
|
||||||
path.EmailCategory,
|
|
||||||
false,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
// we shouldn't ever hit this error.
|
|
||||||
errUpdater("converting to resource path", err)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
p, err := resolveCollectionPath(
|
|
||||||
ctx,
|
ctx,
|
||||||
|
qp,
|
||||||
resolver,
|
resolver,
|
||||||
qp.Credentials.TenantID,
|
|
||||||
qp.User,
|
|
||||||
directory,
|
directory,
|
||||||
path.EmailCategory,
|
path.EmailCategory,
|
||||||
)
|
)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !errors.Is(err, errNilResolver) {
|
errUpdater(
|
||||||
errUpdater("", err)
|
"failure converting path during IterateFilterFolderDirectoriesForCollections",
|
||||||
}
|
err,
|
||||||
} else {
|
)
|
||||||
dirPath = p
|
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
service, err = createService(qp.Credentials, qp.FailFast)
|
service, err = createService(qp.Credentials, qp.FailFast)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user