diff --git a/models/organization/org.go b/models/organization/org.go index d9390fc147f..c2f77a83dde 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -19,7 +19,6 @@ import ( "gitea.dev/modules/util" "xorm.io/builder" - "xorm.io/xorm" ) // ErrOrgNotExist represents a "OrgNotExist" kind of error. @@ -181,45 +180,43 @@ func (org *Organization) HomeLink() string { // FindOrgMembersOpts represents find org members conditions type FindOrgMembersOpts struct { db.ListOptions - Doer *user_model.User - IsDoerMember bool - OrgID int64 - Keyword string - SearchByEmail bool + Doer *user_model.User + IsDoerMember bool + OrgID int64 + Keyword string } func (opts FindOrgMembersOpts) PublicOnly() bool { return opts.Doer == nil || !(opts.IsDoerMember || opts.Doer.IsAdmin) } -func (opts FindOrgMembersOpts) applyKeywordFilter(sess *xorm.Session) (*xorm.Session, bool) { +// applyKeywordFilter adds keyword search conditions to session +func (opts FindOrgMembersOpts) applyKeywordFilter(sess db.Session) bool { if opts.Keyword == "" { - return sess, false + return false } - lowerKeyword := strings.ToLower(opts.Keyword) keywordCond := builder.Or( - builder.Like{"`user`.lower_name", lowerKeyword}, - builder.Like{"LOWER(`user`.full_name)", lowerKeyword}, + db.BuildCaseInsensitiveLike("`user`.lower_name", opts.Keyword), + db.BuildCaseInsensitiveLike("`user`.full_name", opts.Keyword), ) - if opts.SearchByEmail { - var emailCond builder.Cond = builder.Like{"LOWER(`user`.email)", lowerKeyword} - switch { - case opts.Doer == nil: - emailCond = emailCond.And(builder.Eq{"`user`.keep_email_private": false}) - case !opts.Doer.IsAdmin: - emailCond = emailCond.And( - builder.Or( - builder.Eq{"`user`.keep_email_private": false}, - builder.Eq{"`user`.id": opts.Doer.ID}, - ), - ) - } - keywordCond = keywordCond.Or(emailCond) - } - sess = sess.Join("INNER", "`user`", "org_user.uid = `user`.id").And(keywordCond) - return sess, true + emailCond := db.BuildCaseInsensitiveLike("`user`.email", opts.Keyword) + switch { + case opts.Doer == nil: + emailCond = emailCond.And(builder.Eq{"`user`.keep_email_private": false}) + case !opts.Doer.IsAdmin: + emailCond = emailCond.And( + builder.Or( + builder.Eq{"`user`.keep_email_private": false}, + builder.Eq{"`user`.id": opts.Doer.ID}, + ), + ) + } + keywordCond = keywordCond.Or(emailCond) + + _ = sess.Join("INNER", "`user`", "org_user.uid = `user`.id").And(keywordCond) + return true } // applyTeamMatesOnlyFilter make sure restricted users only see public team members and there own team mates @@ -245,7 +242,7 @@ func CountOrgMembers(ctx context.Context, opts *FindOrgMembersOpts) (int64, erro } else { opts.applyTeamMatesOnlyFilter(sess) } - sess, _ = opts.applyKeywordFilter(sess) + _ = opts.applyKeywordFilter(sess) return sess.Count(new(OrgUser)) } @@ -494,8 +491,8 @@ func GetOrgUsersByOrgID(ctx context.Context, opts *FindOrgMembersOpts) ([]*OrgUs } else { opts.applyTeamMatesOnlyFilter(sess) } - if keywordSess, hasKeyword := opts.applyKeywordFilter(sess); hasKeyword { - sess = keywordSess.Select("org_user.*") + if opts.applyKeywordFilter(sess) { + sess = sess.Select("org_user.*") } sess = sess.OrderBy("org_user.uid ASC") diff --git a/models/organization/org_test.go b/models/organization/org_test.go index 8fe4b792976..e24de5b054b 100644 --- a/models/organization/org_test.go +++ b/models/organization/org_test.go @@ -302,43 +302,39 @@ func TestOrgMembersSearch(t *testing.T) { { name: "match by username", opts: &organization.FindOrgMembersOpts{ - OrgID: 3, - Doer: member, - IsDoerMember: true, - Keyword: "user4", - SearchByEmail: true, + OrgID: 3, + Doer: member, + IsDoerMember: true, + Keyword: "user4", }, expectedUIDs: []int64{4}, }, { name: "match by full name", opts: &organization.FindOrgMembersOpts{ - OrgID: 3, - Doer: member, - IsDoerMember: true, - Keyword: "user27", - SearchByEmail: true, + OrgID: 3, + Doer: member, + IsDoerMember: true, + Keyword: "user27", }, expectedUIDs: []int64{28}, }, { name: "private email hidden", opts: &organization.FindOrgMembersOpts{ - OrgID: 3, - Doer: member, - IsDoerMember: true, - Keyword: "user2@example.com", - SearchByEmail: true, + OrgID: 3, + Doer: member, + IsDoerMember: true, + Keyword: "user2@example.com", }, expectedUIDs: []int64{}, }, { name: "admin can search private email", opts: &organization.FindOrgMembersOpts{ - OrgID: 3, - Doer: admin, - Keyword: "user2@example.com", - SearchByEmail: true, + OrgID: 3, + Doer: admin, + Keyword: "user2@example.com", }, expectedUIDs: []int64{2}, }, diff --git a/routers/web/org/members.go b/routers/web/org/members.go index 4a7799a6e28..2f7df4b14ef 100644 --- a/routers/web/org/members.go +++ b/routers/web/org/members.go @@ -35,16 +35,15 @@ func Members(ctx *context.Context) { ctx.Data["Keyword"] = keyword opts := &organization.FindOrgMembersOpts{ - Doer: ctx.Doer, - OrgID: org.ID, - Keyword: keyword, - SearchByEmail: true, + Doer: ctx.Doer, + OrgID: org.ID, + Keyword: keyword, } if ctx.Doer != nil { isMember, err := ctx.Org.Organization.IsOrgMember(ctx, ctx.Doer.ID) if err != nil { - ctx.HTTPError(http.StatusInternalServerError, "IsOrgMember") + ctx.ServerError("IsOrgMember", err) return } opts.IsDoerMember = isMember @@ -53,7 +52,7 @@ func Members(ctx *context.Context) { total, err := organization.CountOrgMembers(ctx, opts) if err != nil { - ctx.HTTPError(http.StatusInternalServerError, "CountOrgMembers") + ctx.ServerError("CountOrgMembers", err) return } @@ -74,8 +73,6 @@ func Members(ctx *context.Context) { } ctx.Data["Page"] = pager ctx.Data["Members"] = members - ctx.Data["MembersShown"] = len(members) - ctx.Data["MembersTotal"] = total ctx.Data["MembersIsPublicMember"] = membersIsPublic ctx.Data["MembersIsUserOrgOwner"] = organization.IsUserOrgOwner(ctx, members, org.ID) ctx.Data["MembersTwoFaStatus"] = members.GetTwoFaStatus(ctx) diff --git a/templates/org/member/members.tmpl b/templates/org/member/members.tmpl index ea637e76fbb..7c6b097765b 100644 --- a/templates/org/member/members.tmpl +++ b/templates/org/member/members.tmpl @@ -11,16 +11,13 @@
{{end}} - {{else}} -