Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: fix & enhance #19

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 35 additions & 12 deletions models/org.go
Original file line number Diff line number Diff line change
Expand Up @@ -427,22 +427,47 @@ func GetUserOrgsList(uid int64) ([]*MinimalOrg, error) {
// FindOrgOptions finds orgs options
type FindOrgOptions struct {
ListOptions
UserID int64
IncludePrivate bool
Actor *User
UserID int64
}

// queryOrgMembershipVisibleOrgIDs return query to only get org's of user who user is part of in public
func queryOrgMembershipVisibleOrgIDs(actor *User) *builder.Builder {
if actor == nil {
return builder.Select("org_user.org_id").From("org_user").Where(builder.Eq{"org_user.is_public": true})
}
if actor.IsAdmin {
return builder.Select("org_user.org_id").From("org_user")
}
return builder.Select("org_user.org_id").From("org_user").Where(builder.Eq{"org_user.is_public": true}).Or(builder.Eq{"org_user.uid": actor.ID})
}

func (opts FindOrgOptions) toConds() builder.Cond {
var cond = builder.NewCond()

// filter by user id
if opts.UserID > 0 {
cond = cond.And(builder.In("`user`.`id`", queryUserOrgIDs(opts.UserID)))
}
if !opts.IncludePrivate {
cond = cond.And(builder.Eq{"`user`.visibility": structs.VisibleTypePublic})
cond = cond.And(builder.In("`user`.`id`",
builder.Select("org_user.org_id").
From("org_user").
Where(builder.Eq{"org_user.uid": opts.UserID})))
}

// make sure user set membership visible
cond = cond.And(builder.In("`user`.`id`", queryOrgMembershipVisibleOrgIDs(opts.Actor)))

// return only org's actor is allowed to see
if opts.Actor != nil {
if !opts.Actor.IsAdmin {
cond = cond.And(builder.In("`user`.visibility", structs.VisibleTypePublic, structs.VisibleTypeLimited).Or(builder.In("`user`.`id`",
builder.Select("org_user.org_id").
From("org_user").
Where(builder.Eq{"org_user.uid": opts.Actor.ID}))))
}
} else {
cond = cond.And(builder.Eq{"`user`.visibility": structs.VisibleTypePrivate}.Or(
builder.Eq{"`user`.visibility": structs.VisibleTypeLimited},
))
cond = cond.And(builder.Eq{"`user`.visibility": structs.VisibleTypePublic})
}

return cond
}

Expand All @@ -460,9 +485,7 @@ func FindOrgs(opts FindOrgOptions) ([]*User, error) {

// CountOrgs returns total count organizations according options
func CountOrgs(opts FindOrgOptions) (int64, error) {
return x.Join("INNER", "`org_user`", "`org_user`.org_id=`user`.id").
Where(opts.toConds()).
Count(new(User))
return x.Where(opts.toConds()).Count(new(User))
}

func getOwnedOrgsByUserID(sess *xorm.Session, userID int64) ([]*User, error) {
Expand Down
21 changes: 12 additions & 9 deletions models/org_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -325,27 +325,30 @@ func TestFindOrgs(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())

orgs, err := FindOrgs(FindOrgOptions{
UserID: 4,
IncludePrivate: true,
UserID: 4,
Actor: &User{ID: 4},
})
assert.NoError(t, err)
if assert.Len(t, orgs, 1) {
assert.EqualValues(t, 3, orgs[0].ID)
}
total, err := CountOrgs(FindOrgOptions{
UserID: 4,
Actor: &User{ID: 4},
})
assert.NoError(t, err)
assert.EqualValues(t, 1, total)

orgs, err = FindOrgs(FindOrgOptions{
UserID: 4,
IncludePrivate: false,
UserID: 4,
})
assert.NoError(t, err)
assert.EqualValues(t, 0, len(orgs))

total, err := CountOrgs(FindOrgOptions{
UserID: 4,
IncludePrivate: true,
total, err = CountOrgs(FindOrgOptions{
UserID: 4,
})
assert.NoError(t, err)
assert.EqualValues(t, 1, total)
assert.EqualValues(t, 0, total)
}

func TestGetOwnedOrgsByUserID(t *testing.T) {
Expand Down
7 changes: 3 additions & 4 deletions routers/api/v1/org/org.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,11 @@ import (

func listUserOrgs(ctx *context.APIContext, u *models.User) {
listOptions := utils.GetListOptions(ctx)
showPrivate := ctx.IsSigned && (ctx.User.IsAdmin || ctx.User.ID == u.ID)

var opts = models.FindOrgOptions{
ListOptions: listOptions,
UserID: u.ID,
IncludePrivate: showPrivate,
Actor: ctx.User,
ListOptions: listOptions,
UserID: u.ID,
}
orgs, err := models.FindOrgs(opts)
if err != nil {
Expand Down
7 changes: 3 additions & 4 deletions routers/web/user/profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,11 +125,9 @@ func Profile(ctx *context.Context) {
ctx.Data["RenderedDescription"] = content
}

showPrivate := ctx.IsSigned && (ctx.User.IsAdmin || ctx.User.ID == ctxUser.ID)

orgs, err := models.FindOrgs(models.FindOrgOptions{
UserID: ctxUser.ID,
IncludePrivate: showPrivate,
Actor: ctx.User,
UserID: ctxUser.ID,
})
if err != nil {
ctx.ServerError("FindOrgs", err)
Expand Down Expand Up @@ -211,6 +209,7 @@ func Profile(ctx *context.Context) {

total = ctxUser.NumFollowing
case "activity":
showPrivate := ctx.IsSigned && (ctx.User.IsAdmin || ctx.User.ID == ctxUser.ID)
retrieveFeeds(ctx, models.GetFeedsOptions{RequestedUser: ctxUser,
Actor: ctx.User,
IncludePrivate: showPrivate,
Expand Down
4 changes: 2 additions & 2 deletions routers/web/user/setting/profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,8 +214,8 @@ func Organization(ctx *context.Context) {
PageSize: setting.UI.Admin.UserPagingNum,
Page: ctx.QueryInt("page"),
},
UserID: ctx.User.ID,
IncludePrivate: ctx.IsSigned,
Actor: ctx.User,
UserID: ctx.User.ID,
}

if opts.Page <= 0 {
Expand Down