Fix repo-list private and total count bugs (#11500) (#11532)

* Fix repo-list private and total count bugs

Signed-off-by: Andrew Thornton <art27@cantab.net>

* Ensure limited and private org public repos are displayed on "private"

Signed-off-by: Andrew Thornton <art27@cantab.net>

* switch from onlyPrivate to is_private

Signed-off-by: Andrew Thornton <art27@cantab.net>

* Generate swagger

Signed-off-by: Andrew Thornton <art27@cantab.net>

Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com>

Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com>
This commit is contained in:
zeripath 2020-05-21 14:23:20 +01:00 committed by GitHub
parent 034492384b
commit 8525a48581
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 62 deletions

View File

@ -140,10 +140,13 @@ type SearchRepoOptions struct {
PriorityOwnerID int64 PriorityOwnerID int64
OrderBy SearchOrderBy OrderBy SearchOrderBy
Private bool // Include private repositories in results Private bool // Include private repositories in results
OnlyPrivate bool // Include only private repositories in results
StarredByID int64 StarredByID int64
AllPublic bool // Include also all public repositories of users and public organisations AllPublic bool // Include also all public repositories of users and public organisations
AllLimited bool // Include also all public repositories of limited organisations AllLimited bool // Include also all public repositories of limited organisations
// None -> include public and private
// True -> include just private
// False -> incude just public
IsPrivate util.OptionalBool
// None -> include collaborative AND non-collaborative // None -> include collaborative AND non-collaborative
// True -> include just collaborative // True -> include just collaborative
// False -> incude just non-collaborative // False -> incude just non-collaborative
@ -221,15 +224,8 @@ func SearchRepositoryCondition(opts *SearchRepoOptions) builder.Cond {
)))) ))))
} }
if opts.OnlyPrivate { if opts.IsPrivate != util.OptionalBoolNone {
cond = cond.And( cond = cond.And(builder.Eq{"is_private": opts.IsPrivate.IsTrue()})
builder.Or(
builder.Eq{"is_private": true},
builder.In("owner_id", builder.Select("id").From("`user`").Where(
builder.And(
builder.Eq{"type": UserTypeOrganization},
builder.Or(builder.Eq{"visibility": structs.VisibleTypeLimited}, builder.Eq{"visibility": structs.VisibleTypePrivate}),
)))))
} }
if opts.Template != util.OptionalBoolNone { if opts.Template != util.OptionalBoolNone {

View File

@ -78,9 +78,9 @@ func Search(ctx *context.APIContext) {
// in: query // in: query
// description: include private repositories this user has access to (defaults to true) // description: include private repositories this user has access to (defaults to true)
// type: boolean // type: boolean
// - name: onlyPrivate // - name: is_private
// in: query // in: query
// description: only include private repositories this user has access to (defaults to false) // description: show only pubic, private or all repositories (defaults to all)
// type: boolean // type: boolean
// - name: template // - name: template
// in: query // in: query
@ -133,7 +133,6 @@ func Search(ctx *context.APIContext) {
TopicOnly: ctx.QueryBool("topic"), TopicOnly: ctx.QueryBool("topic"),
Collaborate: util.OptionalBoolNone, Collaborate: util.OptionalBoolNone,
Private: ctx.IsSigned && (ctx.Query("private") == "" || ctx.QueryBool("private")), Private: ctx.IsSigned && (ctx.Query("private") == "" || ctx.QueryBool("private")),
OnlyPrivate: ctx.IsSigned && ctx.QueryBool("onlyPrivate"),
Template: util.OptionalBoolNone, Template: util.OptionalBoolNone,
StarredByID: ctx.QueryInt64("starredBy"), StarredByID: ctx.QueryInt64("starredBy"),
IncludeDescription: ctx.QueryBool("includeDesc"), IncludeDescription: ctx.QueryBool("includeDesc"),
@ -169,6 +168,10 @@ func Search(ctx *context.APIContext) {
opts.Archived = util.OptionalBoolOf(ctx.QueryBool("archived")) opts.Archived = util.OptionalBoolOf(ctx.QueryBool("archived"))
} }
if ctx.Query("is_private") != "" {
opts.IsPrivate = util.OptionalBoolOf(ctx.QueryBool("is_private"))
}
var sortMode = ctx.Query("sort") var sortMode = ctx.Query("sort")
if len(sortMode) > 0 { if len(sortMode) > 0 {
var sortOrder = ctx.Query("order") var sortOrder = ctx.Query("order")

View File

@ -1771,8 +1771,8 @@
}, },
{ {
"type": "boolean", "type": "boolean",
"description": "only include private repositories this user has access to (defaults to false)", "description": "show only pubic, private or all repositories (defaults to all)",
"name": "onlyPrivate", "name": "is_private",
"in": "query" "in": "query"
}, },
{ {

View File

@ -101,7 +101,7 @@
</div> </div>
<div class="ui attached table segment"> <div class="ui attached table segment">
<ul class="repo-owner-name-list"> <ul class="repo-owner-name-list">
<li v-for="repo in repos" :class="{'private': repo.private}" v-show="showRepo(repo)"> <li v-for="repo in repos" :class="{'private': repo.private}">
<a :href="suburl + '/' + repo.full_name"> <a :href="suburl + '/' + repo.full_name">
<svg :class="'svg ' + repoClass(repo)" width="16" height="16" aria-hidden="true"><use :xlink:href="'#' + repoClass(repo)" /></svg> <svg :class="'svg ' + repoClass(repo)" width="16" height="16" aria-hidden="true"><use :xlink:href="'#' + repoClass(repo)" /></svg>
<strong class="text truncate item-name">${repo.full_name}</strong> <strong class="text truncate item-name">${repo.full_name}</strong>

View File

@ -2745,7 +2745,7 @@ function initVueComponents() {
}&page=${this.page}&limit=${this.searchLimit}&mode=${this.repoTypes[this.reposFilter].searchMode }&page=${this.page}&limit=${this.searchLimit}&mode=${this.repoTypes[this.reposFilter].searchMode
}${this.reposFilter !== 'all' ? '&exclusive=1' : '' }${this.reposFilter !== 'all' ? '&exclusive=1' : ''
}${this.archivedFilter === 'archived' ? '&archived=true' : ''}${this.archivedFilter === 'unarchived' ? '&archived=false' : '' }${this.archivedFilter === 'archived' ? '&archived=true' : ''}${this.archivedFilter === 'unarchived' ? '&archived=false' : ''
}${this.privateFilter === 'private' ? '&onlyPrivate=true' : ''}${this.privateFilter === 'public' ? '&private=false' : '' }${this.privateFilter === 'private' ? '&is_private=true' : ''}${this.privateFilter === 'public' ? '&is_private=false' : ''
}`; }`;
}, },
repoTypeCount() { repoTypeCount() {
@ -2911,56 +2911,18 @@ function initVueComponents() {
this.searchRepos(); this.searchRepos();
}, },
showArchivedRepo(repo) {
switch (this.archivedFilter) {
case 'both':
return true;
case 'unarchived':
return !repo.archived;
case 'archived':
return repo.archived;
default:
return !repo.archived;
}
},
showPrivateRepo(repo) {
switch (this.privateFilter) {
case 'both':
return true;
case 'public':
return !repo.private;
case 'private':
return repo.private;
default:
return true;
}
},
showFilteredRepo(repo) {
switch (this.reposFilter) {
case 'sources':
return repo.owner.id === this.uid && !repo.mirror && !repo.fork;
case 'forks':
return repo.owner.id === this.uid && !repo.mirror && repo.fork;
case 'mirrors':
return repo.mirror;
case 'collaborative':
return repo.owner.id !== this.uid && !repo.mirror;
default:
return true;
}
},
showRepo(repo) {
return this.showArchivedRepo(repo) && this.showPrivateRepo(repo) && this.showFilteredRepo(repo);
},
searchRepos() { searchRepos() {
const self = this; const self = this;
this.isLoading = true; this.isLoading = true;
if (!this.reposTotalCount) {
const totalCountSearchURL = `${this.suburl}/api/v1/repos/search?sort=updated&order=desc&uid=${this.uid}&q=&page=1&mode=`;
$.getJSON(totalCountSearchURL, (_result, _textStatus, request) => {
self.reposTotalCount = request.getResponseHeader('X-Total-Count');
});
}
const searchedMode = this.repoTypes[this.reposFilter].searchMode; const searchedMode = this.repoTypes[this.reposFilter].searchMode;
const searchedURL = this.searchURL; const searchedURL = this.searchURL;
const searchedQuery = this.searchQuery; const searchedQuery = this.searchQuery;