From b68f92359298791f5f468f99f23408512db229de Mon Sep 17 00:00:00 2001 From: Gusted Date: Fri, 6 Jun 2025 19:33:26 +0200 Subject: [PATCH] fix: show membership of limited orgs - Include organisations with visibility of limited if the visitor is signed in. - Resolves forgejo/forgejo#8093 - Added unit test. --- models/organization/TestFindOrgs/org_user.yml | 5 +++++ models/organization/org_list.go | 7 ++++++- models/organization/org_list_test.go | 19 +++++++++++++++++-- routers/web/shared/user/header.go | 1 + 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 models/organization/TestFindOrgs/org_user.yml diff --git a/models/organization/TestFindOrgs/org_user.yml b/models/organization/TestFindOrgs/org_user.yml new file mode 100644 index 0000000000..79b6fc613e --- /dev/null +++ b/models/organization/TestFindOrgs/org_user.yml @@ -0,0 +1,5 @@ +- + id: 1000 + uid: 4 + org_id: 22 + is_public: true diff --git a/models/organization/org_list.go b/models/organization/org_list.go index 4bca3cdb99..e387936473 100644 --- a/models/organization/org_list.go +++ b/models/organization/org_list.go @@ -26,6 +26,7 @@ type SearchOrganizationsOptions struct { type FindOrgOptions struct { db.ListOptions UserID int64 + IncludeLimited bool IncludePrivate bool } @@ -43,7 +44,11 @@ func (opts FindOrgOptions) ToConds() builder.Cond { cond = cond.And(builder.In("`user`.`id`", queryUserOrgIDs(opts.UserID, opts.IncludePrivate))) } if !opts.IncludePrivate { - cond = cond.And(builder.Eq{"`user`.visibility": structs.VisibleTypePublic}) + if !opts.IncludeLimited { + cond = cond.And(builder.Eq{"`user`.visibility": structs.VisibleTypePublic}) + } else { + cond = cond.And(builder.In("`user`.visibility", structs.VisibleTypePublic, structs.VisibleTypeLimited)) + } } return cond } diff --git a/models/organization/org_list_test.go b/models/organization/org_list_test.go index 780616b71f..170e2bf131 100644 --- a/models/organization/org_list_test.go +++ b/models/organization/org_list_test.go @@ -27,6 +27,7 @@ func TestCountOrganizations(t *testing.T) { } func TestFindOrgs(t *testing.T) { + defer unittest.OverrideFixtures("models/organization/TestFindOrgs")() require.NoError(t, unittest.PrepareTestDatabase()) orgs, err := db.Find[organization.Organization](db.DefaultContext, organization.FindOrgOptions{ @@ -34,8 +35,14 @@ func TestFindOrgs(t *testing.T) { IncludePrivate: true, }) require.NoError(t, err) - if assert.Len(t, orgs, 1) { - assert.EqualValues(t, 3, orgs[0].ID) + if assert.Len(t, orgs, 2) { + if orgs[0].ID == 22 { + assert.EqualValues(t, 22, orgs[0].ID) + assert.EqualValues(t, 3, orgs[1].ID) + } else { + assert.EqualValues(t, 3, orgs[0].ID) + assert.EqualValues(t, 22, orgs[1].ID) + } } orgs, err = db.Find[organization.Organization](db.DefaultContext, organization.FindOrgOptions{ @@ -50,6 +57,14 @@ func TestFindOrgs(t *testing.T) { IncludePrivate: true, }) require.NoError(t, err) + assert.EqualValues(t, 2, total) + + total, err = db.Count[organization.Organization](db.DefaultContext, organization.FindOrgOptions{ + UserID: 4, + IncludePrivate: false, + IncludeLimited: true, + }) + require.NoError(t, err) assert.EqualValues(t, 1, total) } diff --git a/routers/web/shared/user/header.go b/routers/web/shared/user/header.go index 5873df8a24..379e23cce4 100644 --- a/routers/web/shared/user/header.go +++ b/routers/web/shared/user/header.go @@ -67,6 +67,7 @@ func PrepareContextForProfileBigAvatar(ctx *context.Context) { showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID) orgs, err := db.Find[organization.Organization](ctx, organization.FindOrgOptions{ UserID: ctx.ContextUser.ID, + IncludeLimited: ctx.IsSigned, IncludePrivate: showPrivate, }) if err != nil {