Gc option extract (#653)
Content Separation `query_options.go` created for `exchange package.
This commit is contained in:
parent
88a318a7c0
commit
a2a5260d3f
222
src/internal/connector/exchange/query_options.go
Normal file
222
src/internal/connector/exchange/query_options.go
Normal file
@ -0,0 +1,222 @@
|
|||||||
|
package exchange
|
||||||
|
|
||||||
|
import (
|
||||||
|
msuser "github.com/microsoftgraph/msgraph-sdk-go/users"
|
||||||
|
mscontacts "github.com/microsoftgraph/msgraph-sdk-go/users/item/contacts"
|
||||||
|
msevents "github.com/microsoftgraph/msgraph-sdk-go/users/item/events"
|
||||||
|
msfolder "github.com/microsoftgraph/msgraph-sdk-go/users/item/mailfolders"
|
||||||
|
msmessage "github.com/microsoftgraph/msgraph-sdk-go/users/item/messages"
|
||||||
|
msitem "github.com/microsoftgraph/msgraph-sdk-go/users/item/messages/item"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// Constant Section
|
||||||
|
// Defines the allowable strings that can be passed into
|
||||||
|
// selectors for M365 objects
|
||||||
|
//------------------------------------------------------------
|
||||||
|
var (
|
||||||
|
fieldsForEvents = map[string]int{
|
||||||
|
"calendar": 1,
|
||||||
|
"end": 2,
|
||||||
|
"id": 3,
|
||||||
|
"isOnlineMeeting": 4,
|
||||||
|
"isReminderOn": 5,
|
||||||
|
"responseStatus": 6,
|
||||||
|
"responseRequested": 7,
|
||||||
|
"showAs": 8,
|
||||||
|
"subject": 9,
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldsForFolders = map[string]int{
|
||||||
|
"childFolderCount": 1,
|
||||||
|
"displayName": 2,
|
||||||
|
"id": 3,
|
||||||
|
"isHidden": 4,
|
||||||
|
"parentFolderId": 5,
|
||||||
|
"totalItemCount": 6,
|
||||||
|
"unreadItemCount": 7,
|
||||||
|
}
|
||||||
|
|
||||||
|
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]int{
|
||||||
|
"conservationId": 1,
|
||||||
|
"conversationIndex": 2,
|
||||||
|
"parentFolderId": 3,
|
||||||
|
"subject": 4,
|
||||||
|
"webLink": 5,
|
||||||
|
"id": 6,
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldsForContacts = map[string]int{
|
||||||
|
"id": 1,
|
||||||
|
"companyName": 2,
|
||||||
|
"department": 3,
|
||||||
|
"displayName": 4,
|
||||||
|
"fileAs": 5,
|
||||||
|
"givenName": 6,
|
||||||
|
"manager": 7,
|
||||||
|
"parentFolderId": 8,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
type optionIdentifier int
|
||||||
|
|
||||||
|
//go:generate stringer -type=optionIdentifier
|
||||||
|
const (
|
||||||
|
unknown optionIdentifier = iota
|
||||||
|
folders
|
||||||
|
events
|
||||||
|
messages
|
||||||
|
users
|
||||||
|
contacts
|
||||||
|
)
|
||||||
|
|
||||||
|
//---------------------------------------------------
|
||||||
|
// exchange.Query Option Section
|
||||||
|
//------------------------------------------------
|
||||||
|
|
||||||
|
// optionsForMessages - used to select allowable options for exchange.Mail types
|
||||||
|
// @param moreOps is []string of options(e.g. "parentFolderId, subject")
|
||||||
|
// @return is first call in Messages().GetWithRequestConfigurationAndResponseHandler
|
||||||
|
func optionsForMessages(moreOps []string) (*msmessage.MessagesRequestBuilderGetRequestConfiguration, error) {
|
||||||
|
selecting, err := buildOptions(moreOps, messages)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
requestParameters := &msmessage.MessagesRequestBuilderGetQueryParameters{
|
||||||
|
Select: selecting,
|
||||||
|
}
|
||||||
|
options := &msmessage.MessagesRequestBuilderGetRequestConfiguration{
|
||||||
|
QueryParameters: requestParameters,
|
||||||
|
}
|
||||||
|
return options, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// optionsForSingleMessage to select allowable option for a singular exchange.Mail object
|
||||||
|
// @params moreOps is []string of options (e.g. subject, content.Type)
|
||||||
|
// @return is first call in MessageById().GetWithRequestConfigurationAndResponseHandler
|
||||||
|
func OptionsForSingleMessage(moreOps []string) (*msitem.MessageItemRequestBuilderGetRequestConfiguration, error) {
|
||||||
|
selecting, err := buildOptions(moreOps, messages)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
requestParams := &msitem.MessageItemRequestBuilderGetQueryParameters{
|
||||||
|
Select: selecting,
|
||||||
|
}
|
||||||
|
options := &msitem.MessageItemRequestBuilderGetRequestConfiguration{
|
||||||
|
QueryParameters: requestParams,
|
||||||
|
}
|
||||||
|
return options, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// optionsForMailFolders transforms the options into a more dynamic call for MailFolders.
|
||||||
|
// @param moreOps is a []string of options(e.g. "displayName", "isHidden")
|
||||||
|
// @return is first call in MailFolders().GetWithRequestConfigurationAndResponseHandler(options, handler)
|
||||||
|
func optionsForMailFolders(moreOps []string) (*msfolder.MailFoldersRequestBuilderGetRequestConfiguration, error) {
|
||||||
|
selecting, err := buildOptions(moreOps, folders)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
requestParameters := &msfolder.MailFoldersRequestBuilderGetQueryParameters{
|
||||||
|
Select: selecting,
|
||||||
|
}
|
||||||
|
options := &msfolder.MailFoldersRequestBuilderGetRequestConfiguration{
|
||||||
|
QueryParameters: requestParameters,
|
||||||
|
}
|
||||||
|
return options, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// optionsForEvents ensures valid option inputs for exchange.Events
|
||||||
|
// @return is first call in Events().GetWithRequestConfigurationAndResponseHandler(options, handler)
|
||||||
|
func optionsForEvents(moreOps []string) (*msevents.EventsRequestBuilderGetRequestConfiguration, error) {
|
||||||
|
selecting, err := buildOptions(moreOps, events)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
requestParameters := &msevents.EventsRequestBuilderGetQueryParameters{
|
||||||
|
Select: selecting,
|
||||||
|
}
|
||||||
|
options := &msevents.EventsRequestBuilderGetRequestConfiguration{
|
||||||
|
QueryParameters: requestParameters,
|
||||||
|
}
|
||||||
|
return options, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// optionsForContacts transforms options into select query for MailContacts
|
||||||
|
// @return is the first call in Contacts().GetWithRequestConfigurationAndResponseHandler(options, handler)
|
||||||
|
func optionsForContacts(moreOps []string) (*mscontacts.ContactsRequestBuilderGetRequestConfiguration, error) {
|
||||||
|
selecting, err := buildOptions(moreOps, contacts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
requestParameters := &mscontacts.ContactsRequestBuilderGetQueryParameters{
|
||||||
|
Select: selecting,
|
||||||
|
}
|
||||||
|
options := &mscontacts.ContactsRequestBuilderGetRequestConfiguration{
|
||||||
|
QueryParameters: requestParameters,
|
||||||
|
}
|
||||||
|
return options, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func optionsForUsers(moreOps []string) (*msuser.UsersRequestBuilderGetRequestConfiguration, error) {
|
||||||
|
selecting, err := buildOptions(moreOps, users)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
requestParams := &msuser.UsersRequestBuilderGetQueryParameters{
|
||||||
|
Select: selecting,
|
||||||
|
}
|
||||||
|
options := &msuser.UsersRequestBuilderGetRequestConfiguration{
|
||||||
|
QueryParameters: requestParams,
|
||||||
|
}
|
||||||
|
return options, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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"}
|
||||||
|
|
||||||
|
switch optID {
|
||||||
|
case events:
|
||||||
|
allowedOptions = fieldsForEvents
|
||||||
|
case contacts:
|
||||||
|
allowedOptions = fieldsForContacts
|
||||||
|
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]
|
||||||
|
if !ok {
|
||||||
|
return nil, errors.New("unsupported option")
|
||||||
|
}
|
||||||
|
|
||||||
|
returnedOptions = append(returnedOptions, entry)
|
||||||
|
}
|
||||||
|
return returnedOptions, nil
|
||||||
|
}
|
||||||
@ -6,12 +6,6 @@ import (
|
|||||||
absser "github.com/microsoft/kiota-abstractions-go/serialization"
|
absser "github.com/microsoft/kiota-abstractions-go/serialization"
|
||||||
msgraphgocore "github.com/microsoftgraph/msgraph-sdk-go-core"
|
msgraphgocore "github.com/microsoftgraph/msgraph-sdk-go-core"
|
||||||
"github.com/microsoftgraph/msgraph-sdk-go/models"
|
"github.com/microsoftgraph/msgraph-sdk-go/models"
|
||||||
msuser "github.com/microsoftgraph/msgraph-sdk-go/users"
|
|
||||||
mscontacts "github.com/microsoftgraph/msgraph-sdk-go/users/item/contacts"
|
|
||||||
msevents "github.com/microsoftgraph/msgraph-sdk-go/users/item/events"
|
|
||||||
msfolder "github.com/microsoftgraph/msgraph-sdk-go/users/item/mailfolders"
|
|
||||||
msmessage "github.com/microsoftgraph/msgraph-sdk-go/users/item/messages"
|
|
||||||
msitem "github.com/microsoftgraph/msgraph-sdk-go/users/item/messages/item"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/alcionai/corso/internal/connector/graph"
|
"github.com/alcionai/corso/internal/connector/graph"
|
||||||
@ -20,81 +14,12 @@ import (
|
|||||||
"github.com/alcionai/corso/pkg/selectors"
|
"github.com/alcionai/corso/pkg/selectors"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
fieldsForEvents = map[string]int{
|
|
||||||
"calendar": 1,
|
|
||||||
"end": 2,
|
|
||||||
"id": 3,
|
|
||||||
"isOnlineMeeting": 4,
|
|
||||||
"isReminderOn": 5,
|
|
||||||
"responseStatus": 6,
|
|
||||||
"responseRequested": 7,
|
|
||||||
"showAs": 8,
|
|
||||||
"subject": 9,
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldsForFolders = map[string]int{
|
|
||||||
"childFolderCount": 1,
|
|
||||||
"displayName": 2,
|
|
||||||
"id": 3,
|
|
||||||
"isHidden": 4,
|
|
||||||
"parentFolderId": 5,
|
|
||||||
"totalItemCount": 6,
|
|
||||||
"unreadItemCount": 7,
|
|
||||||
}
|
|
||||||
|
|
||||||
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]int{
|
|
||||||
"conservationId": 1,
|
|
||||||
"conversationIndex": 2,
|
|
||||||
"parentFolderId": 3,
|
|
||||||
"subject": 4,
|
|
||||||
"webLink": 5,
|
|
||||||
"id": 6,
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldsForContacts = map[string]int{
|
|
||||||
"id": 1,
|
|
||||||
"companyName": 2,
|
|
||||||
"department": 3,
|
|
||||||
"displayName": 4,
|
|
||||||
"fileAs": 5,
|
|
||||||
"givenName": 6,
|
|
||||||
"manager": 7,
|
|
||||||
"parentFolderId": 8,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
type optionIdentifier int
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
mailCategory = "mail"
|
mailCategory = "mail"
|
||||||
contactsCategory = "contacts"
|
contactsCategory = "contacts"
|
||||||
eventsCategory = "events"
|
eventsCategory = "events"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:generate stringer -type=optionIdentifier
|
|
||||||
const (
|
|
||||||
unknown optionIdentifier = iota
|
|
||||||
folders
|
|
||||||
events
|
|
||||||
messages
|
|
||||||
users
|
|
||||||
contacts
|
|
||||||
)
|
|
||||||
|
|
||||||
// GraphQuery represents functions which perform exchange-specific queries
|
// GraphQuery represents functions which perform exchange-specific queries
|
||||||
// into M365 backstore. Responses -> returned items will only contain the information
|
// into M365 backstore. Responses -> returned items will only contain the information
|
||||||
// that is included in the options
|
// that is included in the options
|
||||||
@ -504,140 +429,3 @@ func CollectMailFolders(
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------
|
|
||||||
// exchange.Query Option Section
|
|
||||||
//------------------------------------------------
|
|
||||||
|
|
||||||
// optionsForMessages - used to select allowable options for exchange.Mail types
|
|
||||||
// @param moreOps is []string of options(e.g. "parentFolderId, subject")
|
|
||||||
// @return is first call in Messages().GetWithRequestConfigurationAndResponseHandler
|
|
||||||
func optionsForMessages(moreOps []string) (*msmessage.MessagesRequestBuilderGetRequestConfiguration, error) {
|
|
||||||
selecting, err := buildOptions(moreOps, messages)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
requestParameters := &msmessage.MessagesRequestBuilderGetQueryParameters{
|
|
||||||
Select: selecting,
|
|
||||||
}
|
|
||||||
options := &msmessage.MessagesRequestBuilderGetRequestConfiguration{
|
|
||||||
QueryParameters: requestParameters,
|
|
||||||
}
|
|
||||||
return options, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// optionsForSingleMessage to select allowable option for a singular exchange.Mail object
|
|
||||||
// @params moreOps is []string of options (e.g. subject, content.Type)
|
|
||||||
// @return is first call in MessageById().GetWithRequestConfigurationAndResponseHandler
|
|
||||||
func OptionsForSingleMessage(moreOps []string) (*msitem.MessageItemRequestBuilderGetRequestConfiguration, error) {
|
|
||||||
selecting, err := buildOptions(moreOps, messages)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
requestParams := &msitem.MessageItemRequestBuilderGetQueryParameters{
|
|
||||||
Select: selecting,
|
|
||||||
}
|
|
||||||
options := &msitem.MessageItemRequestBuilderGetRequestConfiguration{
|
|
||||||
QueryParameters: requestParams,
|
|
||||||
}
|
|
||||||
return options, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// optionsForMailFolders transforms the options into a more dynamic call for MailFolders.
|
|
||||||
// @param moreOps is a []string of options(e.g. "displayName", "isHidden")
|
|
||||||
// @return is first call in MailFolders().GetWithRequestConfigurationAndResponseHandler(options, handler)
|
|
||||||
func optionsForMailFolders(moreOps []string) (*msfolder.MailFoldersRequestBuilderGetRequestConfiguration, error) {
|
|
||||||
selecting, err := buildOptions(moreOps, folders)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
requestParameters := &msfolder.MailFoldersRequestBuilderGetQueryParameters{
|
|
||||||
Select: selecting,
|
|
||||||
}
|
|
||||||
options := &msfolder.MailFoldersRequestBuilderGetRequestConfiguration{
|
|
||||||
QueryParameters: requestParameters,
|
|
||||||
}
|
|
||||||
return options, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// optionsForEvents ensures valid option inputs for exchange.Events
|
|
||||||
// @return is first call in Events().GetWithRequestConfigurationAndResponseHandler(options, handler)
|
|
||||||
func optionsForEvents(moreOps []string) (*msevents.EventsRequestBuilderGetRequestConfiguration, error) {
|
|
||||||
selecting, err := buildOptions(moreOps, events)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
requestParameters := &msevents.EventsRequestBuilderGetQueryParameters{
|
|
||||||
Select: selecting,
|
|
||||||
}
|
|
||||||
options := &msevents.EventsRequestBuilderGetRequestConfiguration{
|
|
||||||
QueryParameters: requestParameters,
|
|
||||||
}
|
|
||||||
return options, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// optionsForContacts transforms options into select query for MailContacts
|
|
||||||
// @return is the first call in Contacts().GetWithRequestConfigurationAndResponseHandler(options, handler)
|
|
||||||
func optionsForContacts(moreOps []string) (*mscontacts.ContactsRequestBuilderGetRequestConfiguration, error) {
|
|
||||||
selecting, err := buildOptions(moreOps, contacts)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
requestParameters := &mscontacts.ContactsRequestBuilderGetQueryParameters{
|
|
||||||
Select: selecting,
|
|
||||||
}
|
|
||||||
options := &mscontacts.ContactsRequestBuilderGetRequestConfiguration{
|
|
||||||
QueryParameters: requestParameters,
|
|
||||||
}
|
|
||||||
return options, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func optionsForUsers(moreOps []string) (*msuser.UsersRequestBuilderGetRequestConfiguration, error) {
|
|
||||||
selecting, err := buildOptions(moreOps, users)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
requestParams := &msuser.UsersRequestBuilderGetQueryParameters{
|
|
||||||
Select: selecting,
|
|
||||||
}
|
|
||||||
options := &msuser.UsersRequestBuilderGetRequestConfiguration{
|
|
||||||
QueryParameters: requestParams,
|
|
||||||
}
|
|
||||||
return options, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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"}
|
|
||||||
|
|
||||||
switch optID {
|
|
||||||
case events:
|
|
||||||
allowedOptions = fieldsForEvents
|
|
||||||
case contacts:
|
|
||||||
allowedOptions = fieldsForContacts
|
|
||||||
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]
|
|
||||||
if !ok {
|
|
||||||
return nil, errors.New("unsupported option")
|
|
||||||
}
|
|
||||||
|
|
||||||
returnedOptions = append(returnedOptions, entry)
|
|
||||||
}
|
|
||||||
return returnedOptions, nil
|
|
||||||
}
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user