mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2026-05-12 22:10:25 +00:00
Split [AddRepository][0] and [AddTeamMember][1] to functions that return the inserted value. These can be used by the F3 driver to obtain the ID of the TeamRepo and TeamUser rows inserted in the database. Add test coverage for both functions and remove a duplicated test. Integration tests also already [make use of AddRepository and AddTeamMember][2] indirectly. [0]:f8bee35e77/models/org_team.go (L26)[1]:f8bee35e77/models/org_team.go (L359)[2]:f8bee35e77/tests/integration/api_helper_for_declarative_test.go (L461-L483)Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/11342 Reviewed-by: Gusted <gusted@noreply.codeberg.org> Co-authored-by: limiting-factor <limiting-factor@posteo.com> Co-committed-by: limiting-factor <limiting-factor@posteo.com>
80 lines
2.3 KiB
Go
80 lines
2.3 KiB
Go
// Copyright 2022 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package organization
|
|
|
|
import (
|
|
"context"
|
|
|
|
"forgejo.org/models/db"
|
|
"forgejo.org/models/perm"
|
|
repo_model "forgejo.org/models/repo"
|
|
|
|
"xorm.io/builder"
|
|
)
|
|
|
|
// 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)"`
|
|
}
|
|
|
|
// HasTeamRepo returns true if given repository belongs to team.
|
|
func HasTeamRepo(ctx context.Context, orgID, teamID, repoID int64) bool {
|
|
has, _ := db.GetEngine(ctx).
|
|
Where("org_id=?", orgID).
|
|
And("team_id=?", teamID).
|
|
And("repo_id=?", repoID).
|
|
Get(new(TeamRepo))
|
|
return has
|
|
}
|
|
|
|
type SearchTeamRepoOptions struct {
|
|
db.ListOptions
|
|
TeamID int64
|
|
// Filters repositories based upon optional authorization restrictions.
|
|
AuthorizationReducer repo_model.RepositoryAuthorizationReducer
|
|
}
|
|
|
|
// GetRepositories returns paginated repositories in team of organization.
|
|
func GetTeamRepositories(ctx context.Context, opts *SearchTeamRepoOptions) (repo_model.RepositoryList, error) {
|
|
sess := db.GetEngine(ctx)
|
|
if opts.TeamID > 0 {
|
|
sess = sess.In("id",
|
|
builder.Select("repo_id").
|
|
From("team_repo").
|
|
Where(builder.Eq{"team_id": opts.TeamID}),
|
|
)
|
|
}
|
|
if opts.AuthorizationReducer != nil {
|
|
sess = sess.Where(opts.AuthorizationReducer.RepoReadAccessFilter())
|
|
}
|
|
if opts.PageSize > 0 {
|
|
sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize)
|
|
}
|
|
var repos []*repo_model.Repository
|
|
return repos, sess.OrderBy("repository.name").
|
|
Find(&repos)
|
|
}
|
|
|
|
// RemoveTeamRepo remove repository from team
|
|
func RemoveTeamRepo(ctx context.Context, teamID, repoID int64) error {
|
|
_, err := db.DeleteByBean(ctx, &TeamRepo{
|
|
TeamID: teamID,
|
|
RepoID: repoID,
|
|
})
|
|
return err
|
|
}
|
|
|
|
// GetTeamsWithAccessToRepo returns all teams in an organization that have given access level to the repository.
|
|
func GetTeamsWithAccessToRepo(ctx context.Context, orgID, repoID int64, mode perm.AccessMode) ([]*Team, error) {
|
|
teams := make([]*Team, 0, 5)
|
|
return teams, db.GetEngine(ctx).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).
|
|
OrderBy("name").
|
|
Find(&teams)
|
|
}
|