package teammembership import ( "fmt" portainer "github.com/portainer/portainer/api" "github.com/portainer/portainer/api/dataservices" "github.com/rs/zerolog/log" ) // BucketName represents the name of the bucket where this service stores data. const BucketName = "team_membership" // Service represents a service for managing environment(endpoint) data. type Service struct { dataservices.BaseDataService[portainer.TeamMembership, portainer.TeamMembershipID] } // NewService creates a new instance of a service. func NewService(connection portainer.Connection) (*Service, error) { err := connection.SetServiceName(BucketName) if err != nil { return nil, err } return &Service{ BaseDataService: dataservices.BaseDataService[portainer.TeamMembership, portainer.TeamMembershipID]{ Bucket: BucketName, Connection: connection, }, }, nil } func (service *Service) Tx(tx portainer.Transaction) ServiceTx { return ServiceTx{ BaseDataServiceTx: dataservices.BaseDataServiceTx[portainer.TeamMembership, portainer.TeamMembershipID]{ Bucket: BucketName, Connection: service.Connection, Tx: tx, }, } } // TeamMembershipsByUserID return an array containing all the TeamMembership objects where the specified userID is present. func (service *Service) TeamMembershipsByUserID(userID portainer.UserID) ([]portainer.TeamMembership, error) { var memberships = make([]portainer.TeamMembership, 0) return memberships, service.Connection.GetAll( BucketName, &portainer.TeamMembership{}, dataservices.FilterFn(&memberships, func(e portainer.TeamMembership) bool { return e.UserID == userID }), ) } // TeamMembershipsByTeamID return an array containing all the TeamMembership objects where the specified teamID is present. func (service *Service) TeamMembershipsByTeamID(teamID portainer.TeamID) ([]portainer.TeamMembership, error) { var memberships = make([]portainer.TeamMembership, 0) return memberships, service.Connection.GetAll( BucketName, &portainer.TeamMembership{}, dataservices.FilterFn(&memberships, func(e portainer.TeamMembership) bool { return e.TeamID == teamID }), ) } // CreateTeamMembership creates a new TeamMembership object. func (service *Service) Create(membership *portainer.TeamMembership) error { return service.Connection.CreateObject( BucketName, func(id uint64) (int, any) { membership.ID = portainer.TeamMembershipID(id) return int(membership.ID), membership }, ) } // DeleteTeamMembershipByUserID deletes all the TeamMembership object associated to a UserID. func (service *Service) DeleteTeamMembershipByUserID(userID portainer.UserID) error { return service.Connection.DeleteAllObjects( BucketName, &portainer.TeamMembership{}, func(obj any) (id int, ok bool) { membership, ok := obj.(*portainer.TeamMembership) if !ok { log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to TeamMembership object") //return fmt.Errorf("Failed to convert to TeamMembership object: %s", obj) return -1, false } if membership.UserID == userID { return int(membership.ID), true } return -1, false }) } // DeleteTeamMembershipByTeamID deletes all the TeamMembership object associated to a TeamID. func (service *Service) DeleteTeamMembershipByTeamID(teamID portainer.TeamID) error { return service.Connection.DeleteAllObjects( BucketName, &portainer.TeamMembership{}, func(obj any) (id int, ok bool) { membership, ok := obj.(*portainer.TeamMembership) if !ok { log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to TeamMembership object") //return fmt.Errorf("Failed to convert to TeamMembership object: %s", obj) return -1, false } if membership.TeamID == teamID { return int(membership.ID), true } return -1, false }) } func (service *Service) DeleteTeamMembershipByTeamIDAndUserID(teamID portainer.TeamID, userID portainer.UserID) error { return service.Connection.DeleteAllObjects( BucketName, &portainer.TeamMembership{}, func(obj any) (id int, ok bool) { membership, ok := obj.(*portainer.TeamMembership) if !ok { log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to TeamMembership object") //return fmt.Errorf("Failed to convert to TeamMembership object: %s", obj) return -1, false } if membership.TeamID == teamID && membership.UserID == userID { return int(membership.ID), true } return -1, false }) }