* introduce `GET /orgs` * add TEST * show also other VisibleType's * update description * refactor a lot * SearchUserOptions by default return only publictags/v1.10.5
@@ -136,3 +136,17 @@ func TestAPIOrgDeny(t *testing.T) { | |||
MakeRequest(t, req, http.StatusNotFound) | |||
}) | |||
} | |||
func TestAPIGetAll(t *testing.T) { | |||
defer prepareTestEnv(t)() | |||
req := NewRequestf(t, "GET", "/api/v1/orgs") | |||
resp := MakeRequest(t, req, http.StatusOK) | |||
var apiOrgList []*api.Organization | |||
DecodeJSON(t, resp, &apiOrgList) | |||
assert.Len(t, apiOrgList, 7) | |||
assert.Equal(t, "org25", apiOrgList[0].FullName) | |||
assert.Equal(t, "public", apiOrgList[0].Visibility) | |||
} |
@@ -1469,7 +1469,7 @@ type SearchUserOptions struct { | |||
UID int64 | |||
OrderBy SearchOrderBy | |||
Page int | |||
Private bool // Include private orgs in search | |||
Visible []structs.VisibleType | |||
OwnerID int64 // id of user for visibility calculation | |||
PageSize int // Can be smaller than or equal to setting.UI.ExplorePagingNum | |||
IsActive util.OptionalBool | |||
@@ -1492,8 +1492,9 @@ func (opts *SearchUserOptions) toConds() builder.Cond { | |||
cond = cond.And(keywordCond) | |||
} | |||
if !opts.Private { | |||
// user not logged in and so they won't be allowed to see non-public orgs | |||
if len(opts.Visible) > 0 { | |||
cond = cond.And(builder.In("visibility", opts.Visible)) | |||
} else { | |||
cond = cond.And(builder.In("visibility", structs.VisibleTypePublic)) | |||
} | |||
@@ -9,6 +9,7 @@ import ( | |||
"code.gitea.io/gitea/modules/base" | |||
"code.gitea.io/gitea/modules/context" | |||
"code.gitea.io/gitea/modules/setting" | |||
"code.gitea.io/gitea/modules/structs" | |||
"code.gitea.io/gitea/routers" | |||
) | |||
@@ -25,6 +26,6 @@ func Organizations(ctx *context.Context) { | |||
routers.RenderUserSearch(ctx, &models.SearchUserOptions{ | |||
Type: models.UserTypeOrganization, | |||
PageSize: setting.UI.Admin.OrgPagingNum, | |||
Private: true, | |||
Visible: []structs.VisibleType{structs.VisibleTypePublic, structs.VisibleTypeLimited, structs.VisibleTypePrivate}, | |||
}, tplOrgs) | |||
} |
@@ -104,7 +104,7 @@ func GetAllOrgs(ctx *context.APIContext) { | |||
OrderBy: models.SearchOrderByAlphabetically, | |||
Page: ctx.QueryInt("page"), | |||
PageSize: convert.ToCorrectPageSize(ctx.QueryInt("limit")), | |||
Private: true, | |||
Visible: []api.VisibleType{api.VisibleTypePublic, api.VisibleTypeLimited, api.VisibleTypePrivate}, | |||
}) | |||
if err != nil { | |||
ctx.Error(http.StatusInternalServerError, "SearchOrganizations", err) |
@@ -821,6 +821,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
m.Get("/user/orgs", reqToken(), org.ListMyOrgs) | |||
m.Get("/users/:username/orgs", org.ListUserOrgs) | |||
m.Post("/orgs", reqToken(), bind(api.CreateOrgOption{}), org.Create) | |||
m.Get("/orgs", org.GetAll) | |||
m.Group("/orgs/:orgname", func() { | |||
m.Combo("").Get(org.Get). | |||
Patch(reqToken(), reqOrgOwnership(), bind(api.EditOrgOption{}), org.Edit). |
@@ -66,6 +66,53 @@ func ListUserOrgs(ctx *context.APIContext) { | |||
listUserOrgs(ctx, u, ctx.User.IsAdmin) | |||
} | |||
// GetAll return list of all public organizations | |||
func GetAll(ctx *context.APIContext) { | |||
// swagger:operation Get /orgs organization orgGetAll | |||
// --- | |||
// summary: Get list of organizations | |||
// produces: | |||
// - application/json | |||
// parameters: | |||
// - name: page | |||
// in: query | |||
// description: page number of results to return (1-based) | |||
// type: integer | |||
// - name: limit | |||
// in: query | |||
// description: page size of results, maximum page size is 50 | |||
// type: integer | |||
// responses: | |||
// "200": | |||
// "$ref": "#/responses/OrganizationList" | |||
vMode := []api.VisibleType{api.VisibleTypePublic} | |||
if ctx.IsSigned { | |||
vMode = append(vMode, api.VisibleTypeLimited) | |||
if ctx.User.IsAdmin { | |||
vMode = append(vMode, api.VisibleTypePrivate) | |||
} | |||
} | |||
publicOrgs, _, err := models.SearchUsers(&models.SearchUserOptions{ | |||
Type: models.UserTypeOrganization, | |||
OrderBy: models.SearchOrderByAlphabetically, | |||
Page: ctx.QueryInt("page"), | |||
PageSize: convert.ToCorrectPageSize(ctx.QueryInt("limit")), | |||
Visible: vMode, | |||
}) | |||
if err != nil { | |||
ctx.Error(http.StatusInternalServerError, "SearchOrganizations", err) | |||
return | |||
} | |||
orgs := make([]*api.Organization, len(publicOrgs)) | |||
for i := range publicOrgs { | |||
orgs[i] = convert.ToOrganization(publicOrgs[i]) | |||
} | |||
ctx.JSON(http.StatusOK, &orgs) | |||
} | |||
// Create api for create organization | |||
func Create(ctx *context.APIContext, form api.CreateOrgOption) { | |||
// swagger:operation POST /orgs organization orgCreate |
@@ -15,6 +15,7 @@ import ( | |||
code_indexer "code.gitea.io/gitea/modules/indexer/code" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/modules/setting" | |||
"code.gitea.io/gitea/modules/structs" | |||
"code.gitea.io/gitea/modules/util" | |||
"code.gitea.io/gitea/routers/user" | |||
) | |||
@@ -249,7 +250,7 @@ func ExploreUsers(ctx *context.Context) { | |||
Type: models.UserTypeIndividual, | |||
PageSize: setting.UI.ExplorePagingNum, | |||
IsActive: util.OptionalBoolTrue, | |||
Private: true, | |||
Visible: []structs.VisibleType{structs.VisibleTypePublic, structs.VisibleTypeLimited, structs.VisibleTypePrivate}, | |||
}, tplExploreUsers) | |||
} | |||
@@ -265,12 +266,17 @@ func ExploreOrganizations(ctx *context.Context) { | |||
ownerID = ctx.User.ID | |||
} | |||
RenderUserSearch(ctx, &models.SearchUserOptions{ | |||
opts := models.SearchUserOptions{ | |||
Type: models.UserTypeOrganization, | |||
PageSize: setting.UI.ExplorePagingNum, | |||
Private: ctx.User != nil, | |||
OwnerID: ownerID, | |||
}, tplExploreOrganizations) | |||
} | |||
if ctx.User != nil { | |||
opts.Visible = []structs.VisibleType{structs.VisibleTypePublic, structs.VisibleTypeLimited, structs.VisibleTypePrivate} | |||
} else { | |||
opts.Visible = []structs.VisibleType{structs.VisibleTypePublic} | |||
} | |||
RenderUserSearch(ctx, &opts, tplExploreOrganizations) | |||
} | |||
// ExploreCode render explore code page |
@@ -606,6 +606,35 @@ | |||
} | |||
}, | |||
"/orgs": { | |||
"get": { | |||
"produces": [ | |||
"application/json" | |||
], | |||
"tags": [ | |||
"organization" | |||
], | |||
"summary": "Get list of organizations", | |||
"operationId": "orgGetAll", | |||
"parameters": [ | |||
{ | |||
"type": "integer", | |||
"description": "page number of results to return (1-based)", | |||
"name": "page", | |||
"in": "query" | |||
}, | |||
{ | |||
"type": "integer", | |||
"description": "page size of results, maximum page size is 50", | |||
"name": "limit", | |||
"in": "query" | |||
} | |||
], | |||
"responses": { | |||
"200": { | |||
"$ref": "#/responses/OrganizationList" | |||
} | |||
} | |||
}, | |||
"post": { | |||
"consumes": [ | |||
"application/json" |