add GroupByID to services (#4396)
Adds a groupByID call to services, and adds CallConfig to the group by id api fn. --- #### Does this PR need a docs update or release note? - [x] ⛔ No #### Type of change - [x] 🌻 Feature #### Issue(s) * #3988 #### Test Plan - [x] 💚 E2E
This commit is contained in:
parent
c3f94fd7f7
commit
e5647a809d
@ -55,7 +55,10 @@ func ProduceBackupCollections(
|
|||||||
"group_id", clues.Hide(bpc.ProtectedResource.ID()),
|
"group_id", clues.Hide(bpc.ProtectedResource.ID()),
|
||||||
"group_name", clues.Hide(bpc.ProtectedResource.Name()))
|
"group_name", clues.Hide(bpc.ProtectedResource.Name()))
|
||||||
|
|
||||||
group, err := ac.Groups().GetByID(ctx, bpc.ProtectedResource.ID())
|
group, err := ac.Groups().GetByID(
|
||||||
|
ctx,
|
||||||
|
bpc.ProtectedResource.ID(),
|
||||||
|
api.CallConfig{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, false, clues.Wrap(err, "getting group").WithClues(ctx)
|
return nil, nil, false, clues.Wrap(err, "getting group").WithClues(ctx)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,18 +7,15 @@ import (
|
|||||||
"github.com/microsoftgraph/msgraph-sdk-go/models"
|
"github.com/microsoftgraph/msgraph-sdk-go/models"
|
||||||
|
|
||||||
"github.com/alcionai/corso/src/pkg/filters"
|
"github.com/alcionai/corso/src/pkg/filters"
|
||||||
|
"github.com/alcionai/corso/src/pkg/services/m365/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
type getByIDer interface {
|
|
||||||
GetByID(ctx context.Context, identifier string) (models.Groupable, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsServiceEnabled(
|
func IsServiceEnabled(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
gbi getByIDer,
|
gbi api.GetByIDer[models.Groupable],
|
||||||
resource string,
|
resource string,
|
||||||
) (bool, error) {
|
) (bool, error) {
|
||||||
resp, err := gbi.GetByID(ctx, resource)
|
resp, err := gbi.GetByID(ctx, resource, api.CallConfig{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, clues.Wrap(err, "getting group").WithClues(ctx)
|
return false, clues.Wrap(err, "getting group").WithClues(ctx)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import (
|
|||||||
|
|
||||||
"github.com/alcionai/corso/src/internal/m365/graph"
|
"github.com/alcionai/corso/src/internal/m365/graph"
|
||||||
"github.com/alcionai/corso/src/internal/tester"
|
"github.com/alcionai/corso/src/internal/tester"
|
||||||
|
"github.com/alcionai/corso/src/pkg/services/m365/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
type EnabledUnitSuite struct {
|
type EnabledUnitSuite struct {
|
||||||
@ -22,14 +23,18 @@ func TestEnabledUnitSuite(t *testing.T) {
|
|||||||
suite.Run(t, &EnabledUnitSuite{Suite: tester.NewUnitSuite(t)})
|
suite.Run(t, &EnabledUnitSuite{Suite: tester.NewUnitSuite(t)})
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ getByIDer = mockGBI{}
|
var _ api.GetByIDer[models.Groupable] = mockGBI{}
|
||||||
|
|
||||||
type mockGBI struct {
|
type mockGBI struct {
|
||||||
group models.Groupable
|
group models.Groupable
|
||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m mockGBI) GetByID(ctx context.Context, identifier string) (models.Groupable, error) {
|
func (m mockGBI) GetByID(
|
||||||
|
ctx context.Context,
|
||||||
|
identifier string,
|
||||||
|
_ api.CallConfig,
|
||||||
|
) (models.Groupable, error) {
|
||||||
return m.group, m.err
|
return m.group, m.err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,13 +61,13 @@ func (suite *EnabledUnitSuite) TestIsServiceEnabled() {
|
|||||||
|
|
||||||
table := []struct {
|
table := []struct {
|
||||||
name string
|
name string
|
||||||
mock func(context.Context) getByIDer
|
mock func(context.Context) api.GetByIDer[models.Groupable]
|
||||||
expect assert.BoolAssertionFunc
|
expect assert.BoolAssertionFunc
|
||||||
expectErr assert.ErrorAssertionFunc
|
expectErr assert.ErrorAssertionFunc
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "ok",
|
name: "ok",
|
||||||
mock: func(ctx context.Context) getByIDer {
|
mock: func(ctx context.Context) api.GetByIDer[models.Groupable] {
|
||||||
return mockGBI{
|
return mockGBI{
|
||||||
group: unified,
|
group: unified,
|
||||||
}
|
}
|
||||||
@ -72,7 +77,7 @@ func (suite *EnabledUnitSuite) TestIsServiceEnabled() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "non-unified group",
|
name: "non-unified group",
|
||||||
mock: func(ctx context.Context) getByIDer {
|
mock: func(ctx context.Context) api.GetByIDer[models.Groupable] {
|
||||||
return mockGBI{
|
return mockGBI{
|
||||||
group: nonUnified,
|
group: nonUnified,
|
||||||
}
|
}
|
||||||
@ -82,7 +87,7 @@ func (suite *EnabledUnitSuite) TestIsServiceEnabled() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "group not found",
|
name: "group not found",
|
||||||
mock: func(ctx context.Context) getByIDer {
|
mock: func(ctx context.Context) api.GetByIDer[models.Groupable] {
|
||||||
return mockGBI{
|
return mockGBI{
|
||||||
err: graph.Stack(ctx, odErrMsg(string(graph.RequestResourceNotFound), "message")),
|
err: graph.Stack(ctx, odErrMsg(string(graph.RequestResourceNotFound), "message")),
|
||||||
}
|
}
|
||||||
@ -92,7 +97,7 @@ func (suite *EnabledUnitSuite) TestIsServiceEnabled() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "arbitrary error",
|
name: "arbitrary error",
|
||||||
mock: func(ctx context.Context) getByIDer {
|
mock: func(ctx context.Context) api.GetByIDer[models.Groupable] {
|
||||||
return mockGBI{
|
return mockGBI{
|
||||||
err: assert.AnError,
|
err: assert.AnError,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -126,3 +126,15 @@ func (c Client) Get(
|
|||||||
type CallConfig struct {
|
type CallConfig struct {
|
||||||
Expand []string
|
Expand []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// common interfaces
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
type GetByIDer[T any] interface {
|
||||||
|
GetByID(
|
||||||
|
ctx context.Context,
|
||||||
|
identifier string,
|
||||||
|
cc CallConfig,
|
||||||
|
) (T, error)
|
||||||
|
}
|
||||||
|
|||||||
@ -102,6 +102,7 @@ const filterGroupByDisplayNameQueryTmpl = "displayName eq '%s'"
|
|||||||
func (c Groups) GetByID(
|
func (c Groups) GetByID(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
identifier string,
|
identifier string,
|
||||||
|
_ CallConfig, // matching standards
|
||||||
) (models.Groupable, error) {
|
) (models.Groupable, error) {
|
||||||
service, err := c.Service()
|
service, err := c.Service()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -234,9 +235,9 @@ func IsTeam(ctx context.Context, mg models.Groupable) bool {
|
|||||||
func (c Groups) GetIDAndName(
|
func (c Groups) GetIDAndName(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
groupID string,
|
groupID string,
|
||||||
_ CallConfig, // not currently supported
|
cc CallConfig,
|
||||||
) (string, string, error) {
|
) (string, string, error) {
|
||||||
s, err := c.GetByID(ctx, groupID)
|
s, err := c.GetByID(ctx, groupID, cc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
|
|||||||
@ -121,7 +121,7 @@ func (suite *GroupsIntgSuite) TestGroups_GetByID() {
|
|||||||
groupsAPI = suite.its.ac.Groups()
|
groupsAPI = suite.its.ac.Groups()
|
||||||
)
|
)
|
||||||
|
|
||||||
grp, err := groupsAPI.GetByID(ctx, groupID)
|
grp, err := groupsAPI.GetByID(ctx, groupID, api.CallConfig{})
|
||||||
require.NoError(t, err, clues.ToCore(err))
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
table := []struct {
|
table := []struct {
|
||||||
@ -157,7 +157,7 @@ func (suite *GroupsIntgSuite) TestGroups_GetByID() {
|
|||||||
ctx, flush := tester.NewContext(t)
|
ctx, flush := tester.NewContext(t)
|
||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
_, err := groupsAPI.GetByID(ctx, test.id)
|
_, err := groupsAPI.GetByID(ctx, test.id, api.CallConfig{})
|
||||||
test.expectErr(t, err, clues.ToCore(err))
|
test.expectErr(t, err, clues.ToCore(err))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,6 +28,27 @@ type Group struct {
|
|||||||
IsTeam bool
|
IsTeam bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GroupByID retrieves a specific group.
|
||||||
|
func GroupByID(
|
||||||
|
ctx context.Context,
|
||||||
|
acct account.Account,
|
||||||
|
id string,
|
||||||
|
) (*Group, error) {
|
||||||
|
ac, err := makeAC(ctx, acct, path.GroupsService)
|
||||||
|
if err != nil {
|
||||||
|
return nil, clues.Stack(err).WithClues(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
cc := api.CallConfig{}
|
||||||
|
|
||||||
|
g, err := ac.Groups().GetByID(ctx, id, cc)
|
||||||
|
if err != nil {
|
||||||
|
return nil, clues.Stack(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return parseGroup(ctx, g)
|
||||||
|
}
|
||||||
|
|
||||||
// GroupsCompat returns a list of groups in the specified M365 tenant.
|
// GroupsCompat returns a list of groups in the specified M365 tenant.
|
||||||
func GroupsCompat(ctx context.Context, acct account.Account) ([]*Group, error) {
|
func GroupsCompat(ctx context.Context, acct account.Account) ([]*Group, error) {
|
||||||
errs := fault.New(true)
|
errs := fault.New(true)
|
||||||
|
|||||||
@ -41,6 +41,24 @@ func (suite *GroupsIntgSuite) SetupSuite() {
|
|||||||
suite.acct = tconfig.NewM365Account(t)
|
suite.acct = tconfig.NewM365Account(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *GroupsIntgSuite) TestGroupByID() {
|
||||||
|
t := suite.T()
|
||||||
|
|
||||||
|
ctx, flush := tester.NewContext(t)
|
||||||
|
defer flush()
|
||||||
|
|
||||||
|
graph.InitializeConcurrencyLimiter(ctx, true, 4)
|
||||||
|
|
||||||
|
gid := tconfig.M365TeamID(t)
|
||||||
|
|
||||||
|
group, err := m365.GroupByID(ctx, suite.acct, gid)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
require.NotNil(t, group)
|
||||||
|
|
||||||
|
assert.Equal(t, gid, group.ID, "must match expected id")
|
||||||
|
assert.NotEmpty(t, group.DisplayName)
|
||||||
|
}
|
||||||
|
|
||||||
func (suite *GroupsIntgSuite) TestGroups() {
|
func (suite *GroupsIntgSuite) TestGroups() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user