diff options
Diffstat (limited to 'models/org_team.go')
-rw-r--r-- | models/org_team.go | 712 |
1 files changed, 71 insertions, 641 deletions
diff --git a/models/org_team.go b/models/org_team.go index faee23f4f8..cf810cad33 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -9,288 +9,24 @@ import ( "context" "errors" "fmt" - "sort" "strings" "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" + "code.gitea.io/gitea/models/organization" repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) -const ownerTeamName = "Owners" - -// Team represents a organization team. -type Team struct { - ID int64 `xorm:"pk autoincr"` - OrgID int64 `xorm:"INDEX"` - LowerName string - Name string - Description string - AccessMode perm.AccessMode `xorm:"'authorize'"` - Repos []*repo_model.Repository `xorm:"-"` - Members []*user_model.User `xorm:"-"` - NumRepos int - NumMembers int - Units []*TeamUnit `xorm:"-"` - IncludesAllRepositories bool `xorm:"NOT NULL DEFAULT false"` - CanCreateOrgRepo bool `xorm:"NOT NULL DEFAULT false"` -} - -func init() { - db.RegisterModel(new(Team)) - db.RegisterModel(new(TeamUser)) - db.RegisterModel(new(TeamRepo)) - db.RegisterModel(new(TeamUnit)) -} - -// SearchOrgTeamOptions holds the search options -type SearchOrgTeamOptions struct { - db.ListOptions - Keyword string - OrgID int64 - IncludeDesc bool -} - -// GetUserTeamOptions holds the search options. -type GetUserTeamOptions struct { - db.ListOptions - UserID int64 -} - -// SearchMembersOptions holds the search options -type SearchMembersOptions struct { - db.ListOptions -} - -// GetUserTeams search for org teams. Caller is responsible to check permissions. -func GetUserTeams(opts *GetUserTeamOptions) ([]*Team, int64, error) { - if opts.Page <= 0 { - opts.Page = 1 - } - if opts.PageSize == 0 { - // Default limit - opts.PageSize = 10 - } - - sess := db.GetEngine(db.DefaultContext) - - sess = sess.Join("INNER", "team_user", "team_user.team_id = team.id"). - And("team_user.uid=?", opts.UserID) - - count, err := sess. - Count(new(Team)) - if err != nil { - return nil, 0, err - } - - if opts.PageSize == -1 { - opts.PageSize = int(count) - } else { - sess = sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize) - } - - sess = sess.Join("INNER", "team_user", "team_user.team_id = team.id"). - And("team_user.uid=?", opts.UserID) - - teams := make([]*Team, 0, opts.PageSize) - if err = sess. - OrderBy("lower_name"). - Find(&teams); err != nil { - return nil, 0, err - } - - return teams, count, nil -} - -// SearchOrgTeams search for org teams. Caller is responsible to check permissions. -func SearchOrgTeams(opts *SearchOrgTeamOptions) ([]*Team, int64, error) { - if opts.Page <= 0 { - opts.Page = 1 - } - if opts.PageSize == 0 { - // Default limit - opts.PageSize = 10 - } - - cond := builder.NewCond() - - if len(opts.Keyword) > 0 { - lowerKeyword := strings.ToLower(opts.Keyword) - var keywordCond builder.Cond = builder.Like{"lower_name", lowerKeyword} - if opts.IncludeDesc { - keywordCond = keywordCond.Or(builder.Like{"LOWER(description)", lowerKeyword}) - } - cond = cond.And(keywordCond) - } - - cond = cond.And(builder.Eq{"org_id": opts.OrgID}) - - sess := db.GetEngine(db.DefaultContext) - - count, err := sess. - Where(cond). - Count(new(Team)) - if err != nil { - return nil, 0, err - } - - sess = sess.Where(cond) - if opts.PageSize == -1 { - opts.PageSize = int(count) - } else { - sess = sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize) - } - - teams := make([]*Team, 0, opts.PageSize) - if err = sess. - OrderBy("lower_name"). - Find(&teams); err != nil { - return nil, 0, err - } - - return teams, count, nil -} - -// ColorFormat provides a basic color format for a Team -func (t *Team) ColorFormat(s fmt.State) { - if t == nil { - log.ColorFprintf(s, "%d:%s (OrgID: %d) %-v", - log.NewColoredIDValue(0), - "<nil>", - log.NewColoredIDValue(0), - 0) - return - } - log.ColorFprintf(s, "%d:%s (OrgID: %d) %-v", - log.NewColoredIDValue(t.ID), - t.Name, - log.NewColoredIDValue(t.OrgID), - t.AccessMode) -} - -// GetUnits return a list of available units for a team -func (t *Team) GetUnits() error { - return t.getUnits(db.GetEngine(db.DefaultContext)) -} - -func (t *Team) getUnits(e db.Engine) (err error) { - if t.Units != nil { - return nil - } - - t.Units, err = getUnitsByTeamID(e, t.ID) - return err -} - -// GetUnitNames returns the team units names -func (t *Team) GetUnitNames() (res []string) { - if t.AccessMode >= perm.AccessModeAdmin { - return unit.AllUnitKeyNames() - } - - for _, u := range t.Units { - res = append(res, unit.Units[u.Type].NameKey) - } - return -} - -// GetUnitsMap returns the team units permissions -func (t *Team) GetUnitsMap() map[string]string { - m := make(map[string]string) - if t.AccessMode >= perm.AccessModeAdmin { - for _, u := range unit.Units { - m[u.NameKey] = t.AccessMode.String() - } - } else { - for _, u := range t.Units { - m[u.Unit().NameKey] = u.AccessMode.String() - } - } - return m -} - -// IsOwnerTeam returns true if team is owner team. -func (t *Team) IsOwnerTeam() bool { - return t.Name == ownerTeamName -} - -// IsMember returns true if given user is a member of team. -func (t *Team) IsMember(userID int64) bool { - isMember, err := IsTeamMember(t.OrgID, t.ID, userID) - if err != nil { - log.Error("IsMember: %v", err) - return false - } - return isMember -} - -func (t *Team) getRepositories(e db.Engine) error { - if t.Repos != nil { - return nil - } - return e.Join("INNER", "team_repo", "repository.id = team_repo.repo_id"). - Where("team_repo.team_id=?", t.ID). - OrderBy("repository.name"). - Find(&t.Repos) -} - -// GetRepositories returns paginated repositories in team of organization. -func (t *Team) GetRepositories(opts *SearchOrgTeamOptions) error { - if opts.Page == 0 { - return t.getRepositories(db.GetEngine(db.DefaultContext)) - } - - return t.getRepositories(db.GetPaginatedSession(opts)) -} - -func (t *Team) getMembers(e db.Engine) (err error) { - t.Members, err = getTeamMembers(e, t.ID) - return err -} - -// GetMembers returns paginated members in team of organization. -func (t *Team) GetMembers(opts *SearchMembersOptions) (err error) { - if opts.Page == 0 { - return t.getMembers(db.GetEngine(db.DefaultContext)) - } - - return t.getMembers(db.GetPaginatedSession(opts)) -} - -// AddMember adds new membership of the team to the organization, -// the user will have membership to the organization automatically when needed. -func (t *Team) AddMember(userID int64) error { - return AddTeamMember(t, userID) -} - -// RemoveMember removes member from team of organization. -func (t *Team) RemoveMember(userID int64) error { - return RemoveTeamMember(t, userID) -} - -func (t *Team) hasRepository(e db.Engine, repoID int64) bool { - return hasTeamRepo(e, t.OrgID, t.ID, repoID) -} - -// HasRepository returns true if given repository belong to team. -func (t *Team) HasRepository(repoID int64) bool { - return t.hasRepository(db.GetEngine(db.DefaultContext), repoID) -} - -func (t *Team) addRepository(ctx context.Context, repo *repo_model.Repository) (err error) { - e := db.GetEngine(ctx) - if err = addTeamRepo(e, t.OrgID, t.ID, repo.ID); err != nil { +func addRepository(ctx context.Context, t *organization.Team, repo *repo_model.Repository) (err error) { + if err = organization.AddTeamRepo(ctx, t.OrgID, t.ID, repo.ID); err != nil { return err } - if _, err = e.Incr("num_repos").ID(t.ID).Update(new(Team)); err != nil { + if _, err = db.GetEngine(ctx).Incr("num_repos").ID(t.ID).Update(new(organization.Team)); err != nil { return fmt.Errorf("update team: %v", err) } @@ -302,7 +38,7 @@ func (t *Team) addRepository(ctx context.Context, repo *repo_model.Repository) ( // Make all team members watch this repo if enabled in global settings if setting.Service.AutoWatchNewRepos { - if err = t.getMembers(e); err != nil { + if err = t.GetMembersCtx(ctx); err != nil { return fmt.Errorf("getMembers: %v", err) } for _, u := range t.Members { @@ -317,7 +53,7 @@ func (t *Team) addRepository(ctx context.Context, repo *repo_model.Repository) ( // addAllRepositories adds all repositories to the team. // If the team already has some repositories they will be left unchanged. -func (t *Team) addAllRepositories(ctx context.Context) error { +func addAllRepositories(ctx context.Context, t *organization.Team) error { var orgRepos []repo_model.Repository e := db.GetEngine(ctx) if err := e.Where("owner_id = ?", t.OrgID).Find(&orgRepos); err != nil { @@ -325,8 +61,8 @@ func (t *Team) addAllRepositories(ctx context.Context) error { } for _, repo := range orgRepos { - if !t.hasRepository(e, repo.ID) { - if err := t.addRepository(ctx, &repo); err != nil { + if !hasRepository(ctx, t, repo.ID) { + if err := addRepository(ctx, t, &repo); err != nil { return fmt.Errorf("addRepository: %v", err) } } @@ -336,14 +72,14 @@ func (t *Team) addAllRepositories(ctx context.Context) error { } // AddAllRepositories adds all repositories to the team -func (t *Team) AddAllRepositories() (err error) { +func AddAllRepositories(t *organization.Team) (err error) { ctx, committer, err := db.TxContext() if err != nil { return err } defer committer.Close() - if err = t.addAllRepositories(ctx); err != nil { + if err = addAllRepositories(ctx, t); err != nil { return err } @@ -351,10 +87,10 @@ func (t *Team) AddAllRepositories() (err error) { } // AddRepository adds new repository to team of organization. -func (t *Team) AddRepository(repo *repo_model.Repository) (err error) { +func AddRepository(t *organization.Team, repo *repo_model.Repository) (err error) { if repo.OwnerID != t.OrgID { return errors.New("Repository does not belong to organization") - } else if t.HasRepository(repo.ID) { + } else if HasRepository(t, repo.ID) { return nil } @@ -364,15 +100,20 @@ func (t *Team) AddRepository(repo *repo_model.Repository) (err error) { } defer committer.Close() - if err = t.addRepository(ctx, repo); err != nil { + if err = addRepository(ctx, t, repo); err != nil { return err } return committer.Commit() } +// HasRepository returns true if given repository belong to team. +func HasRepository(t *organization.Team, repoID int64) bool { + return hasRepository(db.DefaultContext, t, repoID) +} + // RemoveAllRepositories removes all repositories from team and recalculates access -func (t *Team) RemoveAllRepositories() (err error) { +func RemoveAllRepositories(t *organization.Team) (err error) { if t.IncludesAllRepositories { return nil } @@ -383,7 +124,7 @@ func (t *Team) RemoveAllRepositories() (err error) { } defer committer.Close() - if err = t.removeAllRepositories(ctx); err != nil { + if err = removeAllRepositories(ctx, t); err != nil { return err } @@ -392,7 +133,7 @@ func (t *Team) RemoveAllRepositories() (err error) { // removeAllRepositories removes all repositories from team and recalculates access // Note: Shall not be called if team includes all repositories -func (t *Team) removeAllRepositories(ctx context.Context) (err error) { +func removeAllRepositories(ctx context.Context, t *organization.Team) (err error) { e := db.GetEngine(ctx) // Delete all accesses. for _, repo := range t.Repos { @@ -423,7 +164,7 @@ func (t *Team) removeAllRepositories(ctx context.Context) (err error) { // Delete team-repo if _, err := e. Where("team_id=?", t.ID). - Delete(new(TeamRepo)); err != nil { + Delete(new(organization.TeamRepo)); err != nil { return err } @@ -435,11 +176,15 @@ func (t *Team) removeAllRepositories(ctx context.Context) (err error) { return nil } +func hasRepository(ctx context.Context, t *organization.Team, repoID int64) bool { + return organization.HasTeamRepo(ctx, t.OrgID, t.ID, repoID) +} + // removeRepository removes a repository from a team and recalculates access // Note: Repository shall not be removed from team if it includes all repositories (unless the repository is deleted) -func (t *Team) removeRepository(ctx context.Context, repo *repo_model.Repository, recalculate bool) (err error) { +func removeRepository(ctx context.Context, t *organization.Team, repo *repo_model.Repository, recalculate bool) (err error) { e := db.GetEngine(ctx) - if err = removeTeamRepo(e, t.ID, repo.ID); err != nil { + if err = organization.RemoveTeamRepo(ctx, t.ID, repo.ID); err != nil { return err } @@ -455,7 +200,7 @@ func (t *Team) removeRepository(ctx context.Context, repo *repo_model.Repository } } - teamUsers, err := getTeamUsersByTeamID(e, t.ID) + teamUsers, err := organization.GetTeamUsersByTeamID(ctx, t.ID) if err != nil { return fmt.Errorf("getTeamUsersByTeamID: %v", err) } @@ -482,8 +227,8 @@ func (t *Team) removeRepository(ctx context.Context, repo *repo_model.Repository // RemoveRepository removes repository from team of organization. // If the team shall include all repositories the request is ignored. -func (t *Team) RemoveRepository(repoID int64) error { - if !t.HasRepository(repoID) { +func RemoveRepository(t *organization.Team, repoID int64) error { + if !HasRepository(t, repoID) { return nil } @@ -502,58 +247,21 @@ func (t *Team) RemoveRepository(repoID int64) error { } defer committer.Close() - if err = t.removeRepository(ctx, repo, true); err != nil { + if err = removeRepository(ctx, t, repo, true); err != nil { return err } return committer.Commit() } -// UnitEnabled returns if the team has the given unit type enabled -func (t *Team) UnitEnabled(tp unit.Type) bool { - return t.unitEnabled(db.GetEngine(db.DefaultContext), tp) -} - -func (t *Team) unitEnabled(e db.Engine, tp unit.Type) bool { - return t.unitAccessMode(e, tp) > perm.AccessModeNone -} - -// UnitAccessMode returns if the team has the given unit type enabled -func (t *Team) UnitAccessMode(tp unit.Type) perm.AccessMode { - return t.unitAccessMode(db.GetEngine(db.DefaultContext), tp) -} - -func (t *Team) unitAccessMode(e db.Engine, tp unit.Type) perm.AccessMode { - if err := t.getUnits(e); err != nil { - log.Warn("Error loading team (ID: %d) units: %s", t.ID, err.Error()) - } - - for _, unit := range t.Units { - if unit.Type == tp { - return unit.AccessMode - } - } - return perm.AccessModeNone -} - -// IsUsableTeamName tests if a name could be as team name -func IsUsableTeamName(name string) error { - switch name { - case "new": - return db.ErrNameReserved{Name: name} - default: - return nil - } -} - // NewTeam creates a record of new team. // It's caller's responsibility to assign organization ID. -func NewTeam(t *Team) (err error) { +func NewTeam(t *organization.Team) (err error) { if len(t.Name) == 0 { return errors.New("empty team name") } - if err = IsUsableTeamName(t.Name); err != nil { + if err = organization.IsUsableTeamName(t.Name); err != nil { return err } @@ -562,19 +270,19 @@ func NewTeam(t *Team) (err error) { return err } if !has { - return ErrOrgNotExist{t.OrgID, ""} + return organization.ErrOrgNotExist{ID: t.OrgID} } t.LowerName = strings.ToLower(t.Name) has, err = db.GetEngine(db.DefaultContext). Where("org_id=?", t.OrgID). And("lower_name=?", t.LowerName). - Get(new(Team)) + Get(new(organization.Team)) if err != nil { return err } if has { - return ErrTeamAlreadyExist{t.OrgID, t.LowerName} + return organization.ErrTeamAlreadyExist{OrgID: t.OrgID, Name: t.LowerName} } ctx, committer, err := db.TxContext() @@ -599,7 +307,7 @@ func NewTeam(t *Team) (err error) { // Add all repositories to the team if it has access to all of them. if t.IncludesAllRepositories { - err = t.addAllRepositories(ctx) + err = addAllRepositories(ctx, t) if err != nil { return fmt.Errorf("addAllRepositories: %v", err) } @@ -612,81 +320,8 @@ func NewTeam(t *Team) (err error) { return committer.Commit() } -func getTeam(e db.Engine, orgID int64, name string) (*Team, error) { - t := &Team{ - OrgID: orgID, - LowerName: strings.ToLower(name), - } - has, err := e.Get(t) - if err != nil { - return nil, err - } else if !has { - return nil, ErrTeamNotExist{orgID, 0, name} - } - return t, nil -} - -// GetTeam returns team by given team name and organization. -func GetTeam(orgID int64, name string) (*Team, error) { - return getTeam(db.GetEngine(db.DefaultContext), orgID, name) -} - -// GetTeamIDsByNames returns a slice of team ids corresponds to names. -func GetTeamIDsByNames(orgID int64, names []string, ignoreNonExistent bool) ([]int64, error) { - ids := make([]int64, 0, len(names)) - for _, name := range names { - u, err := GetTeam(orgID, name) - if err != nil { - if ignoreNonExistent { - continue - } else { - return nil, err - } - } - ids = append(ids, u.ID) - } - return ids, nil -} - -// getOwnerTeam returns team by given team name and organization. -func getOwnerTeam(e db.Engine, orgID int64) (*Team, error) { - return getTeam(e, orgID, ownerTeamName) -} - -func getTeamByID(e db.Engine, teamID int64) (*Team, error) { - t := new(Team) - has, err := e.ID(teamID).Get(t) - if err != nil { - return nil, err - } else if !has { - return nil, ErrTeamNotExist{0, teamID, ""} - } - return t, nil -} - -// GetTeamByID returns team by given ID. -func GetTeamByID(teamID int64) (*Team, error) { - return getTeamByID(db.GetEngine(db.DefaultContext), teamID) -} - -// GetTeamNamesByID returns team's lower name from a list of team ids. -func GetTeamNamesByID(teamIDs []int64) ([]string, error) { - if len(teamIDs) == 0 { - return []string{}, nil - } - - var teamNames []string - err := db.GetEngine(db.DefaultContext).Table("team"). - Select("lower_name"). - In("id", teamIDs). - Asc("name"). - Find(&teamNames) - - return teamNames, err -} - // UpdateTeam updates information of team. -func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) { +func UpdateTeam(t *organization.Team, authChanged, includeAllChanged bool) (err error) { if len(t.Name) == 0 { return errors.New("empty team name") } @@ -707,11 +342,11 @@ func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) { Where("org_id=?", t.OrgID). And("lower_name=?", t.LowerName). And("id!=?", t.ID). - Get(new(Team)) + Get(new(organization.Team)) if err != nil { return err } else if has { - return ErrTeamAlreadyExist{t.OrgID, t.LowerName} + return organization.ErrTeamAlreadyExist{OrgID: t.OrgID, Name: t.LowerName} } if _, err = sess.ID(t.ID).Cols("name", "lower_name", "description", @@ -727,7 +362,7 @@ func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) { // Delete team-unit. if _, err := sess. Where("team_id=?", t.ID). - Delete(new(TeamUnit)); err != nil { + Delete(new(organization.TeamUnit)); err != nil { return err } if _, err = sess.Cols("org_id", "team_id", "type", "access_mode").Insert(&t.Units); err != nil { @@ -737,7 +372,7 @@ func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) { // Update access for team members if needed. if authChanged { - if err = t.getRepositories(sess); err != nil { + if err = t.GetRepositoriesCtx(ctx); err != nil { return fmt.Errorf("getRepositories: %v", err) } @@ -750,7 +385,7 @@ func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) { // Add all repositories to the team if it has access to all of them. if includeAllChanged && t.IncludesAllRepositories { - err = t.addAllRepositories(ctx) + err = addAllRepositories(ctx, t) if err != nil { return fmt.Errorf("addAllRepositories: %v", err) } @@ -761,11 +396,7 @@ func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) { // DeleteTeam deletes given team. // It's caller's responsibility to assign organization ID. -func DeleteTeam(t *Team) error { - if err := t.GetRepositories(&SearchOrgTeamOptions{}); err != nil { - return err - } - +func DeleteTeam(t *organization.Team) error { ctx, committer, err := db.TxContext() if err != nil { return err @@ -773,7 +404,11 @@ func DeleteTeam(t *Team) error { defer committer.Close() sess := db.GetEngine(ctx) - if err := t.getMembers(sess); err != nil { + if err := t.GetRepositoriesCtx(ctx); err != nil { + return err + } + + if err := t.GetMembersCtx(ctx); err != nil { return err } @@ -813,7 +448,7 @@ func DeleteTeam(t *Team) error { } if !t.IncludesAllRepositories { - if err := t.removeAllRepositories(ctx); err != nil { + if err := removeAllRepositories(ctx, t); err != nil { return err } } @@ -822,19 +457,19 @@ func DeleteTeam(t *Team) error { if _, err := sess. Where("org_id=?", t.OrgID). Where("team_id=?", t.ID). - Delete(new(TeamUser)); err != nil { + Delete(new(organization.TeamUser)); err != nil { return err } // Delete team-unit. if _, err := sess. Where("team_id=?", t.ID). - Delete(new(TeamUnit)); err != nil { + Delete(new(organization.TeamUnit)); err != nil { return err } // Delete team. - if _, err := sess.ID(t.ID).Delete(new(Team)); err != nil { + if _, err := sess.ID(t.ID).Delete(new(organization.Team)); err != nil { return err } // Update organization number of teams. @@ -845,103 +480,15 @@ func DeleteTeam(t *Team) error { return committer.Commit() } -// ___________ ____ ___ -// \__ ___/___ _____ _____ | | \______ ___________ -// | |_/ __ \\__ \ / \| | / ___// __ \_ __ \ -// | |\ ___/ / __ \| Y Y \ | /\___ \\ ___/| | \/ -// |____| \___ >____ /__|_| /______//____ >\___ >__| -// \/ \/ \/ \/ \/ - -// TeamUser represents an team-user relation. -type TeamUser struct { - ID int64 `xorm:"pk autoincr"` - OrgID int64 `xorm:"INDEX"` - TeamID int64 `xorm:"UNIQUE(s)"` - UID int64 `xorm:"UNIQUE(s)"` -} - -func isTeamMember(e db.Engine, orgID, teamID, userID int64) (bool, error) { - return e. - Where("org_id=?", orgID). - And("team_id=?", teamID). - And("uid=?", userID). - Table("team_user"). - Exist() -} - -// IsTeamMember returns true if given user is a member of team. -func IsTeamMember(orgID, teamID, userID int64) (bool, error) { - return isTeamMember(db.GetEngine(db.DefaultContext), orgID, teamID, userID) -} - -func getTeamUsersByTeamID(e db.Engine, teamID int64) ([]*TeamUser, error) { - teamUsers := make([]*TeamUser, 0, 10) - return teamUsers, e. - Where("team_id=?", teamID). - Find(&teamUsers) -} - -func getTeamMembers(e db.Engine, teamID int64) (_ []*user_model.User, err error) { - teamUsers, err := getTeamUsersByTeamID(e, teamID) - if err != nil { - return nil, fmt.Errorf("get team-users: %v", err) - } - members := make([]*user_model.User, len(teamUsers)) - for i, teamUser := range teamUsers { - member, err := user_model.GetUserByIDEngine(e, teamUser.UID) - if err != nil { - return nil, fmt.Errorf("get user '%d': %v", teamUser.UID, err) - } - members[i] = member - } - sort.Slice(members, func(i, j int) bool { - return members[i].DisplayName() < members[j].DisplayName() - }) - return members, nil -} - -// GetTeamMembers returns all members in given team of organization. -func GetTeamMembers(teamID int64) ([]*user_model.User, error) { - return getTeamMembers(db.GetEngine(db.DefaultContext), teamID) -} - -func getUserOrgTeams(e db.Engine, orgID, userID int64) (teams []*Team, err error) { - return teams, e. - Join("INNER", "team_user", "team_user.team_id = team.id"). - Where("team.org_id = ?", orgID). - And("team_user.uid=?", userID). - Find(&teams) -} - -func getUserRepoTeams(e db.Engine, orgID, userID, repoID int64) (teams []*Team, err error) { - return teams, e. - Join("INNER", "team_user", "team_user.team_id = team.id"). - Join("INNER", "team_repo", "team_repo.team_id = team.id"). - Where("team.org_id = ?", orgID). - And("team_user.uid=?", userID). - And("team_repo.repo_id=?", repoID). - Find(&teams) -} - -// GetUserOrgTeams returns all teams that user belongs to in given organization. -func GetUserOrgTeams(orgID, userID int64) ([]*Team, error) { - return getUserOrgTeams(db.GetEngine(db.DefaultContext), orgID, userID) -} - // AddTeamMember adds new membership of given team to given organization, // the user will have membership to given organization automatically when needed. -func AddTeamMember(team *Team, userID int64) error { - isAlreadyMember, err := IsTeamMember(team.OrgID, team.ID, userID) +func AddTeamMember(team *organization.Team, userID int64) error { + isAlreadyMember, err := organization.IsTeamMember(db.DefaultContext, team.OrgID, team.ID, userID) if err != nil || isAlreadyMember { return err } - if err := AddOrgUser(team.OrgID, userID); err != nil { - return err - } - - // Get team and its repositories. - if err := team.GetRepositories(&SearchOrgTeamOptions{}); err != nil { + if err := organization.AddOrgUser(team.OrgID, userID); err != nil { return err } @@ -951,15 +498,20 @@ func AddTeamMember(team *Team, userID int64) error { } defer committer.Close() + // Get team and its repositories. + if err := team.GetRepositoriesCtx(ctx); err != nil { + return err + } + sess := db.GetEngine(ctx) - if err := db.Insert(ctx, &TeamUser{ + if err := db.Insert(ctx, &organization.TeamUser{ UID: userID, OrgID: team.OrgID, TeamID: team.ID, }); err != nil { return err - } else if _, err := sess.Incr("num_members").ID(team.ID).Update(new(Team)); err != nil { + } else if _, err := sess.Incr("num_members").ID(team.ID).Update(new(organization.Team)); err != nil { return err } @@ -980,25 +532,25 @@ func AddTeamMember(team *Team, userID int64) error { return committer.Commit() } -func removeTeamMember(ctx context.Context, team *Team, userID int64) error { +func removeTeamMember(ctx context.Context, team *organization.Team, userID int64) error { e := db.GetEngine(ctx) - isMember, err := isTeamMember(e, team.OrgID, team.ID, userID) + isMember, err := organization.IsTeamMember(ctx, team.OrgID, team.ID, userID) if err != nil || !isMember { return err } // Check if the user to delete is the last member in owner team. if team.IsOwnerTeam() && team.NumMembers == 1 { - return ErrLastOrgOwner{UID: userID} + return organization.ErrLastOrgOwner{UID: userID} } team.NumMembers-- - if err := team.getRepositories(e); err != nil { + if err := team.GetRepositoriesCtx(ctx); err != nil { return err } - if _, err := e.Delete(&TeamUser{ + if _, err := e.Delete(&organization.TeamUser{ UID: userID, OrgID: team.OrgID, TeamID: team.ID, @@ -1029,7 +581,7 @@ func removeTeamMember(ctx context.Context, team *Team, userID int64) error { } // Check if the user is a member of any team in the organization. - if count, err := e.Count(&TeamUser{ + if count, err := e.Count(&organization.TeamUser{ UID: userID, OrgID: team.OrgID, }); err != nil { @@ -1042,7 +594,7 @@ func removeTeamMember(ctx context.Context, team *Team, userID int64) error { } // RemoveTeamMember removes member from given team of given organization. -func RemoveTeamMember(team *Team, userID int64) error { +func RemoveTeamMember(team *organization.Team, userID int64) error { ctx, committer, err := db.TxContext() if err != nil { return err @@ -1053,125 +605,3 @@ func RemoveTeamMember(team *Team, userID int64) error { } return committer.Commit() } - -// IsUserInTeams returns if a user in some teams -func IsUserInTeams(userID int64, teamIDs []int64) (bool, error) { - return isUserInTeams(db.GetEngine(db.DefaultContext), userID, teamIDs) -} - -func isUserInTeams(e db.Engine, userID int64, teamIDs []int64) (bool, error) { - return e.Where("uid=?", userID).In("team_id", teamIDs).Exist(new(TeamUser)) -} - -// UsersInTeamsCount counts the number of users which are in userIDs and teamIDs -func UsersInTeamsCount(userIDs, teamIDs []int64) (int64, error) { - var ids []int64 - if err := db.GetEngine(db.DefaultContext).In("uid", userIDs).In("team_id", teamIDs). - Table("team_user"). - Cols("uid").GroupBy("uid").Find(&ids); err != nil { - return 0, err - } - return int64(len(ids)), nil -} - -// ___________ __________ -// \__ ___/___ _____ _____\______ \ ____ ______ ____ -// | |_/ __ \\__ \ / \| _// __ \\____ \ / _ \ -// | |\ ___/ / __ \| Y Y \ | \ ___/| |_> > <_> ) -// |____| \___ >____ /__|_| /____|_ /\___ > __/ \____/ -// \/ \/ \/ \/ \/|__| - -// TeamRepo represents an team-repository relation. -type TeamRepo struct { - ID int64 `xorm:"pk autoincr"` - OrgID int64 `xorm:"INDEX"` - TeamID int64 `xorm:"UNIQUE(s)"` - RepoID int64 `xorm:"UNIQUE(s)"` -} - -func hasTeamRepo(e db.Engine, orgID, teamID, repoID int64) bool { - has, _ := e. - Where("org_id=?", orgID). - And("team_id=?", teamID). - And("repo_id=?", repoID). - Get(new(TeamRepo)) - return has -} - -// HasTeamRepo returns true if given repository belongs to team. -func HasTeamRepo(orgID, teamID, repoID int64) bool { - return hasTeamRepo(db.GetEngine(db.DefaultContext), orgID, teamID, repoID) -} - -func addTeamRepo(e db.Engine, orgID, teamID, repoID int64) error { - _, err := e.InsertOne(&TeamRepo{ - OrgID: orgID, - TeamID: teamID, - RepoID: repoID, - }) - return err -} - -func removeTeamRepo(e db.Engine, teamID, repoID int64) error { - _, err := e.Delete(&TeamRepo{ - TeamID: teamID, - RepoID: repoID, - }) - return err -} - -// GetTeamsWithAccessToRepo returns all teams in an organization that have given access level to the repository. -func GetTeamsWithAccessToRepo(orgID, repoID int64, mode perm.AccessMode) ([]*Team, error) { - teams := make([]*Team, 0, 5) - return teams, db.GetEngine(db.DefaultContext).Where("team.authorize >= ?", mode). - Join("INNER", "team_repo", "team_repo.team_id = team.id"). - And("team_repo.org_id = ?", orgID). - And("team_repo.repo_id = ?", repoID). - Find(&teams) -} - -// ___________ ____ ___ .__ __ -// \__ ___/___ _____ _____ | | \____ |__|/ |_ -// | |_/ __ \\__ \ / \| | / \| \ __\ -// | |\ ___/ / __ \| Y Y \ | / | \ || | -// |____| \___ >____ /__|_| /______/|___| /__||__| -// \/ \/ \/ \/ - -// TeamUnit describes all units of a repository -type TeamUnit struct { - ID int64 `xorm:"pk autoincr"` - OrgID int64 `xorm:"INDEX"` - TeamID int64 `xorm:"UNIQUE(s)"` - Type unit.Type `xorm:"UNIQUE(s)"` - AccessMode perm.AccessMode -} - -// Unit returns Unit -func (t *TeamUnit) Unit() unit.Unit { - return unit.Units[t.Type] -} - -func getUnitsByTeamID(e db.Engine, teamID int64) (units []*TeamUnit, err error) { - return units, e.Where("team_id = ?", teamID).Find(&units) -} - -// UpdateTeamUnits updates a teams's units -func UpdateTeamUnits(team *Team, units []TeamUnit) (err error) { - ctx, committer, err := db.TxContext() - if err != nil { - return err - } - defer committer.Close() - - if _, err = db.GetEngine(ctx).Where("team_id = ?", team.ID).Delete(new(TeamUnit)); err != nil { - return err - } - - if len(units) > 0 { - if err = db.Insert(ctx, units); err != nil { - return err - } - } - - return committer.Commit() -} |