111 lines
2.8 KiB
Go
111 lines
2.8 KiB
Go
package m365
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/microsoftgraph/msgraph-beta-sdk-go/models"
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/alcionai/corso/src/internal/connector"
|
|
"github.com/alcionai/corso/src/internal/connector/discovery"
|
|
"github.com/alcionai/corso/src/pkg/account"
|
|
)
|
|
|
|
type User struct {
|
|
PrincipalName string
|
|
ID string
|
|
Name string
|
|
}
|
|
|
|
// Users returns a list of users in the specified M365 tenant
|
|
// TODO: Implement paging support
|
|
func Users(ctx context.Context, m365Account account.Account) ([]*User, error) {
|
|
gc, err := connector.NewGraphConnector(ctx, m365Account, connector.Users)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not initialize M365 graph connection")
|
|
}
|
|
|
|
users, err := discovery.Users(ctx, gc.Service, m365Account.ID())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ret := make([]*User, 0, len(users))
|
|
|
|
for _, u := range users {
|
|
pu, err := parseUser(u)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ret = append(ret, pu)
|
|
}
|
|
|
|
return ret, nil
|
|
}
|
|
|
|
func UserIDs(ctx context.Context, m365Account account.Account) ([]string, error) {
|
|
users, err := Users(ctx, m365Account)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ret := make([]string, 0, len(users))
|
|
for _, u := range users {
|
|
ret = append(ret, u.ID)
|
|
}
|
|
|
|
return ret, nil
|
|
}
|
|
|
|
// UserPNs retrieves all user principleNames in the tenant. Principle Names
|
|
// can be used analogous userIDs in graph API queries.
|
|
func UserPNs(ctx context.Context, m365Account account.Account) ([]string, error) {
|
|
users, err := Users(ctx, m365Account)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ret := make([]string, 0, len(users))
|
|
for _, u := range users {
|
|
ret = append(ret, u.PrincipalName)
|
|
}
|
|
|
|
return ret, nil
|
|
}
|
|
|
|
// SiteURLs returns a list of SharePoint site WebURLs in the specified M365 tenant
|
|
func SiteURLs(ctx context.Context, m365Account account.Account) ([]string, error) {
|
|
gc, err := connector.NewGraphConnector(ctx, m365Account, connector.Sites)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not initialize M365 graph connection")
|
|
}
|
|
|
|
return gc.GetSiteWebURLs(), nil
|
|
}
|
|
|
|
// SiteURLs returns a list of SharePoint sites IDs in the specified M365 tenant
|
|
func SiteIDs(ctx context.Context, m365Account account.Account) ([]string, error) {
|
|
gc, err := connector.NewGraphConnector(ctx, m365Account, connector.Sites)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not initialize M365 graph connection")
|
|
}
|
|
|
|
return gc.GetSiteIDs(), nil
|
|
}
|
|
|
|
// parseUser extracts information from `models.Userable` we care about
|
|
func parseUser(item models.Userable) (*User, error) {
|
|
if item.GetUserPrincipalName() == nil {
|
|
return nil, errors.Errorf("no principal name for User: %s", *item.GetId())
|
|
}
|
|
|
|
u := &User{PrincipalName: *item.GetUserPrincipalName(), ID: *item.GetId()}
|
|
|
|
if item.GetDisplayName() != nil {
|
|
u.Name = *item.GetDisplayName()
|
|
}
|
|
|
|
return u, nil
|
|
}
|