forked from forgejo/forgejo
Move organization related structs into sub package (#18518)
* Move organization related structs into sub package * Fix test * Fix lint * Move more functions into sub packages * Fix bug * Fix test * Update models/organization/team_repo.go Co-authored-by: KN4CK3R <admin@oldschoolhack.me> * Apply suggestions from code review Co-authored-by: KN4CK3R <admin@oldschoolhack.me> * Fix fmt * Follow suggestion from @Gusted * Fix test * Fix test * Fix bug * Use ctx but db.DefaultContext on routers * Fix bug * Fix bug * fix bug * Update models/organization/team_user.go * Fix bug Co-authored-by: KN4CK3R <admin@oldschoolhack.me> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
parent
d4c789dfc1
commit
b06b9a056c
94 changed files with 3107 additions and 2995 deletions
110
models/user.go
110
models/user.go
|
@ -14,22 +14,13 @@ import (
|
|||
|
||||
asymkey_model "code.gitea.io/gitea/models/asymkey"
|
||||
"code.gitea.io/gitea/models/db"
|
||||
"code.gitea.io/gitea/models/organization"
|
||||
repo_model "code.gitea.io/gitea/models/repo"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/structs"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
|
||||
"xorm.io/builder"
|
||||
)
|
||||
|
||||
// GetOrganizationCount returns count of membership of organization of the user.
|
||||
func GetOrganizationCount(ctx context.Context, u *user_model.User) (int64, error) {
|
||||
return db.GetEngine(ctx).
|
||||
Where("uid=?", u.ID).
|
||||
Count(new(OrgUser))
|
||||
}
|
||||
|
||||
// DeleteUser deletes models associated to an user.
|
||||
func DeleteUser(ctx context.Context, u *user_model.User) (err error) {
|
||||
e := db.GetEngine(ctx)
|
||||
|
@ -86,7 +77,7 @@ func DeleteUser(ctx context.Context, u *user_model.User) (err error) {
|
|||
&user_model.EmailAddress{UID: u.ID},
|
||||
&user_model.UserOpenID{UID: u.ID},
|
||||
&Reaction{UserID: u.ID},
|
||||
&TeamUser{UID: u.ID},
|
||||
&organization.TeamUser{UID: u.ID},
|
||||
&Collaboration{UserID: u.ID},
|
||||
&Stopwatch{UserID: u.ID},
|
||||
&user_model.Setting{UserID: u.ID},
|
||||
|
@ -204,100 +195,3 @@ func DeleteUser(ctx context.Context, u *user_model.User) (err error) {
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetStarredRepos returns the repos starred by a particular user
|
||||
func GetStarredRepos(userID int64, private bool, listOptions db.ListOptions) ([]*repo_model.Repository, error) {
|
||||
sess := db.GetEngine(db.DefaultContext).Where("star.uid=?", userID).
|
||||
Join("LEFT", "star", "`repository`.id=`star`.repo_id")
|
||||
if !private {
|
||||
sess = sess.And("is_private=?", false)
|
||||
}
|
||||
|
||||
if listOptions.Page != 0 {
|
||||
sess = db.SetSessionPagination(sess, &listOptions)
|
||||
|
||||
repos := make([]*repo_model.Repository, 0, listOptions.PageSize)
|
||||
return repos, sess.Find(&repos)
|
||||
}
|
||||
|
||||
repos := make([]*repo_model.Repository, 0, 10)
|
||||
return repos, sess.Find(&repos)
|
||||
}
|
||||
|
||||
// GetWatchedRepos returns the repos watched by a particular user
|
||||
func GetWatchedRepos(userID int64, private bool, listOptions db.ListOptions) ([]*repo_model.Repository, int64, error) {
|
||||
sess := db.GetEngine(db.DefaultContext).Where("watch.user_id=?", userID).
|
||||
And("`watch`.mode<>?", repo_model.WatchModeDont).
|
||||
Join("LEFT", "watch", "`repository`.id=`watch`.repo_id")
|
||||
if !private {
|
||||
sess = sess.And("is_private=?", false)
|
||||
}
|
||||
|
||||
if listOptions.Page != 0 {
|
||||
sess = db.SetSessionPagination(sess, &listOptions)
|
||||
|
||||
repos := make([]*repo_model.Repository, 0, listOptions.PageSize)
|
||||
total, err := sess.FindAndCount(&repos)
|
||||
return repos, total, err
|
||||
}
|
||||
|
||||
repos := make([]*repo_model.Repository, 0, 10)
|
||||
total, err := sess.FindAndCount(&repos)
|
||||
return repos, total, err
|
||||
}
|
||||
|
||||
// IsUserVisibleToViewer check if viewer is able to see user profile
|
||||
func IsUserVisibleToViewer(u, viewer *user_model.User) bool {
|
||||
return isUserVisibleToViewer(db.GetEngine(db.DefaultContext), u, viewer)
|
||||
}
|
||||
|
||||
func isUserVisibleToViewer(e db.Engine, u, viewer *user_model.User) bool {
|
||||
if viewer != nil && viewer.IsAdmin {
|
||||
return true
|
||||
}
|
||||
|
||||
switch u.Visibility {
|
||||
case structs.VisibleTypePublic:
|
||||
return true
|
||||
case structs.VisibleTypeLimited:
|
||||
if viewer == nil || viewer.IsRestricted {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
case structs.VisibleTypePrivate:
|
||||
if viewer == nil || viewer.IsRestricted {
|
||||
return false
|
||||
}
|
||||
|
||||
// If they follow - they see each over
|
||||
follower := user_model.IsFollowing(u.ID, viewer.ID)
|
||||
if follower {
|
||||
return true
|
||||
}
|
||||
|
||||
// Now we need to check if they in some organization together
|
||||
count, err := e.Table("team_user").
|
||||
Where(
|
||||
builder.And(
|
||||
builder.Eq{"uid": viewer.ID},
|
||||
builder.Or(
|
||||
builder.Eq{"org_id": u.ID},
|
||||
builder.In("org_id",
|
||||
builder.Select("org_id").
|
||||
From("team_user", "t2").
|
||||
Where(builder.Eq{"uid": u.ID}))))).
|
||||
Count(new(TeamUser))
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if count < 0 {
|
||||
// No common organization
|
||||
return false
|
||||
}
|
||||
|
||||
// they are in an organization together
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue