87 lines
2.6 KiB
Go
87 lines
2.6 KiB
Go
|
package tenant
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"github.com/influxdata/influxdb"
|
||
|
"github.com/influxdata/influxdb/kv"
|
||
|
)
|
||
|
|
||
|
// FindUserResourceMappings returns a list of UserResourceMappings that match filter and the total count of matching mappings.
|
||
|
func (s *Service) FindUserResourceMappings(ctx context.Context, filter influxdb.UserResourceMappingFilter, opt ...influxdb.FindOptions) ([]*influxdb.UserResourceMapping, int, error) {
|
||
|
var urms []*influxdb.UserResourceMapping
|
||
|
err := s.store.View(ctx, func(tx kv.Tx) error {
|
||
|
u, err := s.store.ListURMs(ctx, tx, filter, opt...)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
urms = u
|
||
|
return nil
|
||
|
})
|
||
|
if err != nil {
|
||
|
return nil, 0, err
|
||
|
}
|
||
|
return urms, len(urms), nil
|
||
|
}
|
||
|
|
||
|
// CreateUserResourceMapping creates a user resource mapping.
|
||
|
func (s *Service) CreateUserResourceMapping(ctx context.Context, m *influxdb.UserResourceMapping) error {
|
||
|
err := s.store.Update(ctx, func(tx kv.Tx) error {
|
||
|
return s.store.CreateURM(ctx, tx, m)
|
||
|
})
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// DeleteUserResourceMapping deletes a user resource mapping.
|
||
|
func (s *Service) DeleteUserResourceMapping(ctx context.Context, resourceID, userID influxdb.ID) error {
|
||
|
err := s.store.Update(ctx, func(tx kv.Tx) error {
|
||
|
_, err := s.store.GetURM(ctx, tx, resourceID, userID)
|
||
|
if err != nil {
|
||
|
return ErrURMNotFound
|
||
|
}
|
||
|
return s.store.DeleteURM(ctx, tx, resourceID, userID)
|
||
|
})
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// addOrgRelationToResource duplicates the organizations user resource mappings for this new resource
|
||
|
func (s *Service) addOrgRelationToResource(ctx context.Context, tx kv.Tx, orgID, resourceID influxdb.ID, resourceType influxdb.ResourceType) error {
|
||
|
urms, err := s.store.ListURMs(ctx, tx, influxdb.UserResourceMappingFilter{
|
||
|
ResourceID: orgID,
|
||
|
})
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
for _, urm := range urms {
|
||
|
err := s.store.CreateURM(ctx, tx, &influxdb.UserResourceMapping{
|
||
|
UserID: urm.UserID,
|
||
|
UserType: urm.UserType,
|
||
|
MappingType: urm.MappingType,
|
||
|
ResourceType: resourceType,
|
||
|
ResourceID: resourceID,
|
||
|
})
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
|
||
|
}
|
||
|
|
||
|
// removeResourceRelations allows us to clean up any resource relationship that would have normally been left over after a delete action of a resource.
|
||
|
func (s *Service) removeResourceRelations(ctx context.Context, tx kv.Tx, resourceID influxdb.ID) error {
|
||
|
urms, err := s.store.ListURMs(ctx, tx, influxdb.UserResourceMappingFilter{
|
||
|
ResourceID: resourceID,
|
||
|
})
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
for _, urm := range urms {
|
||
|
err := s.store.DeleteURM(ctx, tx, urm.ResourceID, urm.UserID)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|