remove optionIdentifier (#2001)

## Description

the exchange optionIdentifier performs almost
all the same functions as the path category.  In
many cases, it is actually a translation of the
other value.  This cleanup will cascade into
the creation of an api layer for the graph client.

## Does this PR need a docs update or release note?

- [x]  No 

## Type of change

- [x] 🐹 Trivial/Minor

## Issue(s)

* #1967

## Test Plan

- [x]  Unit test
- [x] 💚 E2E
This commit is contained in:
Keepers 2023-01-02 14:18:52 -07:00 committed by GitHub
parent 7561645fb2
commit 23a3cd6e16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 78 additions and 176 deletions

View File

@ -101,7 +101,7 @@ func runDisplayM365JSON(
switch cat {
case path.EmailCategory, path.EventsCategory, path.ContactsCategory:
get, serializeFunc = exchange.GetQueryAndSerializeFunc(exchange.CategoryToOptionIdentifier(cat))
get, serializeFunc = exchange.GetQueryAndSerializeFunc(cat)
default:
return fmt.Errorf("unable to process category: %s", cat)
}

View File

@ -59,9 +59,9 @@ type Collection struct {
// service - client/adapter pair used to access M365 back store
service graph.Servicer
collectionType optionIdentifier
statusUpdater support.StatusUpdater
ctrl control.Options
category path.CategoryType
statusUpdater support.StatusUpdater
ctrl control.Options
// FullPath is the current hierarchical path used by this collection.
fullPath path.Path
@ -86,14 +86,14 @@ type Collection struct {
func NewCollection(
user string,
curr, prev path.Path,
collectionType optionIdentifier,
category path.CategoryType,
service graph.Servicer,
statusUpdater support.StatusUpdater,
ctrlOpts control.Options,
doNotMergeItems bool,
) Collection {
collection := Collection{
collectionType: collectionType,
category: category,
ctrl: ctrlOpts,
data: make(chan data.Stream, collectionChannelBufferSize),
doNotMergeItems: doNotMergeItems,
@ -135,13 +135,13 @@ func (col *Collection) Items() <-chan data.Stream {
// GetQueryAndSerializeFunc helper function that returns the two functions functions
// required to convert M365 identifier into a byte array filled with the serialized data
func GetQueryAndSerializeFunc(optID optionIdentifier) (GraphRetrievalFunc, GraphSerializeFunc) {
switch optID {
case contacts:
func GetQueryAndSerializeFunc(category path.CategoryType) (GraphRetrievalFunc, GraphSerializeFunc) {
switch category {
case path.ContactsCategory:
return RetrieveContactDataForUser, serializeAndStreamContact
case events:
case path.EventsCategory:
return RetrieveEventDataForUser, serializeAndStreamEvent
case messages:
case path.EmailCategory:
return RetrieveMessageDataForUser, serializeAndStreamMessage
// Unsupported options returns nil, nil
default:
@ -195,9 +195,9 @@ func (col *Collection) streamItems(ctx context.Context) {
// get QueryBasedonIdentifier
// verify that it is the correct type in called function
// serializationFunction
query, serializeFunc := GetQueryAndSerializeFunc(col.collectionType)
query, serializeFunc := GetQueryAndSerializeFunc(col.category)
if query == nil {
errs = fmt.Errorf("unrecognized collection type: %s", col.collectionType.String())
errs = fmt.Errorf("unrecognized collection type: %s", col.category)
return
}

View File

@ -1,29 +0,0 @@
// Code generated by "stringer -type=optionIdentifier"; DO NOT EDIT.
package exchange
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[unknown-0]
_ = x[folders-1]
_ = x[calendars-2]
_ = x[events-3]
_ = x[messages-4]
_ = x[users-5]
_ = x[contacts-6]
}
const _optionIdentifier_name = "unknownfolderscalendarseventsmessagesuserscontacts"
var _optionIdentifier_index = [...]uint8{0, 7, 14, 23, 29, 37, 42, 50}
func (i optionIdentifier) String() string {
if i < 0 || i >= optionIdentifier(len(_optionIdentifier_index)-1) {
return "optionIdentifier(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _optionIdentifier_name[_optionIdentifier_index[i]:_optionIdentifier_index[i+1]]
}

View File

@ -4,9 +4,6 @@ import (
"fmt"
msuser "github.com/microsoftgraph/msgraph-sdk-go/users"
"github.com/pkg/errors"
"github.com/alcionai/corso/src/pkg/path"
)
// -----------------------------------------------------------------------
@ -15,98 +12,59 @@ import (
// selectors for M365 objects
// -----------------------------------------------------------------------
var (
fieldsForCalendars = map[string]int{
"changeKey": 1,
"events": 2,
"id": 3,
"isDefaultCalendar": 4,
"name": 5,
"owner": 6,
fieldsForCalendars = map[string]struct{}{
"changeKey": {},
"events": {},
"id": {},
"isDefaultCalendar": {},
"name": {},
"owner": {},
}
fieldsForEvents = map[string]int{
"calendar": 1,
"end": 2,
"id": 3,
"isOnlineMeeting": 4,
"isReminderOn": 5,
"responseStatus": 6,
"responseRequested": 7,
"showAs": 8,
"subject": 9,
fieldsForEvents = map[string]struct{}{
"calendar": {},
"end": {},
"id": {},
"isOnlineMeeting": {},
"isReminderOn": {},
"responseStatus": {},
"responseRequested": {},
"showAs": {},
"subject": {},
}
fieldsForFolders = map[string]int{
"childFolderCount": 1,
"displayName": 2,
"id": 3,
"isHidden": 4,
"parentFolderId": 5,
"totalItemCount": 6,
"unreadItemCount": 7,
fieldsForFolders = map[string]struct{}{
"childFolderCount": {},
"displayName": {},
"id": {},
"isHidden": {},
"parentFolderId": {},
"totalItemCount": {},
"unreadItemCount": {},
}
fieldsForUsers = map[string]int{
"birthday": 1,
"businessPhones": 2,
"city": 3,
"companyName": 4,
"department": 5,
"displayName": 6,
"employeeId": 7,
"id": 8,
"mail": 9,
"userPrincipalName": 10,
fieldsForMessages = map[string]struct{}{
"conservationId": {},
"conversationIndex": {},
"parentFolderId": {},
"subject": {},
"webLink": {},
"id": {},
"isRead": {},
}
fieldsForMessages = map[string]int{
"conservationId": 1,
"conversationIndex": 2,
"parentFolderId": 3,
"subject": 4,
"webLink": 5,
"id": 6,
"isRead": 7,
}
fieldsForContacts = map[string]int{
"id": 1,
"companyName": 2,
"department": 3,
"displayName": 4,
"fileAs": 5,
"givenName": 6,
"manager": 7,
"parentFolderId": 8,
fieldsForContacts = map[string]struct{}{
"id": {},
"companyName": {},
"department": {},
"displayName": {},
"fileAs": {},
"givenName": {},
"manager": {},
"parentFolderId": {},
}
)
type optionIdentifier int
//go:generate stringer -type=optionIdentifier
const (
unknown optionIdentifier = iota
folders
calendars
events
messages
users
contacts
)
func CategoryToOptionIdentifier(category path.CategoryType) optionIdentifier {
switch category {
case path.EmailCategory:
return messages
case path.ContactsCategory:
return contacts
case path.EventsCategory:
return events
default:
return unknown
}
}
// -----------------------------------------------------------------------
// exchange.Query Option Section
// These functions can be used to filter a response on M365
@ -117,7 +75,7 @@ func CategoryToOptionIdentifier(category path.CategoryType) optionIdentifier {
func optionsForFolderMessagesDelta(
moreOps []string,
) (*msuser.ItemMailFoldersItemMessagesDeltaRequestBuilderGetRequestConfiguration, error) {
selecting, err := buildOptions(moreOps, messages)
selecting, err := buildOptions(moreOps, fieldsForMessages)
if err != nil {
return nil, err
}
@ -139,7 +97,7 @@ func optionsForCalendars(moreOps []string) (
*msuser.ItemCalendarsRequestBuilderGetRequestConfiguration,
error,
) {
selecting, err := buildOptions(moreOps, calendars)
selecting, err := buildOptions(moreOps, fieldsForCalendars)
if err != nil {
return nil, err
}
@ -160,7 +118,7 @@ func optionsForContactFolders(moreOps []string) (
*msuser.ItemContactFoldersRequestBuilderGetRequestConfiguration,
error,
) {
selecting, err := buildOptions(moreOps, folders)
selecting, err := buildOptions(moreOps, fieldsForFolders)
if err != nil {
return nil, err
}
@ -179,7 +137,7 @@ func optionsForContactFolderByID(moreOps []string) (
*msuser.ItemContactFoldersContactFolderItemRequestBuilderGetRequestConfiguration,
error,
) {
selecting, err := buildOptions(moreOps, folders)
selecting, err := buildOptions(moreOps, fieldsForFolders)
if err != nil {
return nil, err
}
@ -200,7 +158,7 @@ func optionsForContactFolderByID(moreOps []string) (
func optionsForMailFolders(
moreOps []string,
) (*msuser.ItemMailFoldersRequestBuilderGetRequestConfiguration, error) {
selecting, err := buildOptions(moreOps, folders)
selecting, err := buildOptions(moreOps, fieldsForFolders)
if err != nil {
return nil, err
}
@ -221,7 +179,7 @@ func optionsForMailFolders(
func optionsForMailFoldersItem(
moreOps []string,
) (*msuser.ItemMailFoldersMailFolderItemRequestBuilderGetRequestConfiguration, error) {
selecting, err := buildOptions(moreOps, folders)
selecting, err := buildOptions(moreOps, fieldsForFolders)
if err != nil {
return nil, err
}
@ -239,7 +197,7 @@ func optionsForMailFoldersItem(
func optionsForContactFoldersItemDelta(
moreOps []string,
) (*msuser.ItemContactFoldersItemContactsDeltaRequestBuilderGetRequestConfiguration, error) {
selecting, err := buildOptions(moreOps, contacts)
selecting, err := buildOptions(moreOps, fieldsForContacts)
if err != nil {
return nil, err
}
@ -258,7 +216,7 @@ func optionsForContactFoldersItemDelta(
// optionsForEvents ensures valid option inputs for exchange.Events
// @return is first call in Events().GetWithRequestConfigurationAndResponseHandler(options, handler)
func optionsForEvents(moreOps []string) (*msuser.ItemEventsRequestBuilderGetRequestConfiguration, error) {
selecting, err := buildOptions(moreOps, events)
selecting, err := buildOptions(moreOps, fieldsForEvents)
if err != nil {
return nil, err
}
@ -277,7 +235,7 @@ func optionsForEvents(moreOps []string) (*msuser.ItemEventsRequestBuilderGetRequ
func optionsForEventsByCalendar(
moreOps []string,
) (*msuser.ItemCalendarsItemEventsRequestBuilderGetRequestConfiguration, error) {
selecting, err := buildOptions(moreOps, events)
selecting, err := buildOptions(moreOps, fieldsForEvents)
if err != nil {
return nil, err
}
@ -297,7 +255,7 @@ func optionsForEventsByCalendar(
func optionsForContactChildFolders(
moreOps []string,
) (*msuser.ItemContactFoldersItemChildFoldersRequestBuilderGetRequestConfiguration, error) {
selecting, err := buildOptions(moreOps, contacts)
selecting, err := buildOptions(moreOps, fieldsForContacts)
if err != nil {
return nil, err
}
@ -315,7 +273,7 @@ func optionsForContactChildFolders(
// optionsForContacts transforms options into select query for MailContacts
// @return is the first call in Contacts().GetWithRequestConfigurationAndResponseHandler(options, handler)
func optionsForContacts(moreOps []string) (*msuser.ItemContactsRequestBuilderGetRequestConfiguration, error) {
selecting, err := buildOptions(moreOps, contacts)
selecting, err := buildOptions(moreOps, fieldsForContacts)
if err != nil {
return nil, err
}
@ -333,39 +291,15 @@ func optionsForContacts(moreOps []string) (*msuser.ItemContactsRequestBuilderGet
// buildOptions - Utility Method for verifying if select options are valid for the m365 object type
// @return is a pair. The first is a string literal of allowable options based on the object type,
// the second is an error. An error is returned if an unsupported option or optionIdentifier was used
func buildOptions(options []string, optID optionIdentifier) ([]string, error) {
var (
allowedOptions map[string]int
returnedOptions = []string{"id"}
)
func buildOptions(fields []string, allowed map[string]struct{}) ([]string, error) {
returnedOptions := []string{"id"}
switch optID {
case calendars:
allowedOptions = fieldsForCalendars
case contacts:
allowedOptions = fieldsForContacts
case events:
allowedOptions = fieldsForEvents
case folders:
allowedOptions = fieldsForFolders
case users:
allowedOptions = fieldsForUsers
case messages:
allowedOptions = fieldsForMessages
case unknown:
fallthrough
default:
return nil, errors.New("unsupported option")
}
for _, entry := range options {
_, ok := allowedOptions[entry]
for _, entry := range fields {
_, ok := allowed[entry]
if !ok {
return nil, fmt.Errorf("unsupported element passed to buildOptions: %v", entry)
return nil, fmt.Errorf("unsupported field: %v", entry)
}
returnedOptions = append(returnedOptions, entry)
}
return returnedOptions, nil
return append(returnedOptions, fields...), nil
}

View File

@ -44,7 +44,6 @@ func filterContainersAndFillCollections(
) error {
var (
errs error
oi = CategoryToOptionIdentifier(qp.Category)
// folder ID -> delta url or folder path lookups
deltaURLs = map[string]string{}
currPaths = map[string]string{}
@ -119,7 +118,7 @@ func filterContainersAndFillCollections(
qp.ResourceOwner,
currPath,
prevPath,
oi,
scope.Category().PathType(),
service,
statusUpdater,
ctrlOpts,
@ -169,7 +168,7 @@ func filterContainersAndFillCollections(
qp.ResourceOwner,
nil, // marks the collection as deleted
prevPath,
oi,
scope.Category().PathType(),
service,
statusUpdater,
ctrlOpts,

View File

@ -37,14 +37,12 @@ func RestoreExchangeObject(
return nil, fmt.Errorf("restore policy: %s not supported for RestoreExchangeObject", policy)
}
setting := CategoryToOptionIdentifier(category)
switch setting {
case messages:
switch category {
case path.EmailCategory:
return RestoreMailMessage(ctx, bits, service, control.Copy, destination, user)
case contacts:
case path.ContactsCategory:
return RestoreExchangeContact(ctx, bits, service, control.Copy, destination, user)
case events:
case path.EventsCategory:
return RestoreExchangeEvent(ctx, bits, service, control.Copy, destination, user)
default:
return nil, fmt.Errorf("type: %s not supported for RestoreExchangeObject", category)