1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-08-04 05:15:25 +02:00

refactor(teams): migrate teams to react [EE-2273] (#6691)

closes [EE-2273]
This commit is contained in:
Chaim Lev-Ari 2022-09-02 18:30:34 +03:00 committed by GitHub
parent 9b02f575ef
commit f9427c8fb2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
97 changed files with 1929 additions and 938 deletions

View file

@ -4,6 +4,7 @@ import (
"net/http"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response"
"github.com/portainer/portainer/api/http/security"
)
@ -13,6 +14,7 @@ import (
// @description List teams. For non-administrator users, will only list the teams they are member of.
// @description **Access policy**: restricted
// @tags teams
// @param onlyLedTeams query boolean false "Only list teams that the user is leader of"
// @security ApiKeyAuth
// @security jwt
// @produce json
@ -22,15 +24,23 @@ import (
func (handler *Handler) teamList(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
teams, err := handler.DataStore.Team().Teams()
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to retrieve teams from the database", err}
return httperror.InternalServerError("Unable to retrieve teams from the database", err)
}
securityContext, err := security.RetrieveRestrictedRequestContext(r)
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to retrieve info from request context", err}
return httperror.InternalServerError("Unable to retrieve info from request context", err)
}
filteredTeams := security.FilterUserTeams(teams, securityContext)
onlyLedTeams, _ := request.RetrieveBooleanQueryParameter(r, "onlyLedTeams", true)
filteredTeams := teams
if onlyLedTeams {
filteredTeams = security.FilterLeaderTeams(filteredTeams, securityContext)
}
filteredTeams = security.FilterUserTeams(filteredTeams, securityContext)
return response.JSON(w, filteredTeams)
}

View file

@ -27,17 +27,22 @@ func FilterUserTeams(teams []portainer.Team, context *RestrictedRequestContext)
// FilterLeaderTeams filters teams based on user role.
// Team leaders only have access to team they lead.
func FilterLeaderTeams(teams []portainer.Team, context *RestrictedRequestContext) []portainer.Team {
filteredTeams := teams
filteredTeams := []portainer.Team{}
if context.IsTeamLeader {
filteredTeams = make([]portainer.Team, 0)
for _, membership := range context.UserMemberships {
for _, team := range teams {
if team.ID == membership.TeamID && membership.Role == portainer.TeamLeader {
filteredTeams = append(filteredTeams, team)
break
}
}
if !context.IsTeamLeader {
return filteredTeams
}
leaderSet := map[portainer.TeamID]bool{}
for _, membership := range context.UserMemberships {
if membership.Role == portainer.TeamLeader && membership.UserID == context.UserID {
leaderSet[membership.TeamID] = true
}
}
for _, team := range teams {
if leaderSet[team.ID] {
filteredTeams = append(filteredTeams, team)
}
}