2021-06-09 02:33:54 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package explore
import (
"bytes"
"net/http"
"code.gitea.io/gitea/models"
2021-09-24 14:32:56 +03:00
"code.gitea.io/gitea/models/db"
2021-06-09 02:33:54 +03:00
"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/modules/util"
)
const (
// tplExploreUsers explore users page template
tplExploreUsers base . TplName = "explore/users"
)
2021-10-12 21:11:35 +03:00
// UserSearchDefaultSortType is the default sort type for user search
const UserSearchDefaultSortType = "alphabetically"
2021-06-09 02:33:54 +03:00
var (
nullByte = [ ] byte { 0x00 }
)
func isKeywordValid ( keyword string ) bool {
return ! bytes . Contains ( [ ] byte ( keyword ) , nullByte )
}
// RenderUserSearch render user search page
func RenderUserSearch ( ctx * context . Context , opts * models . SearchUserOptions , tplName base . TplName ) {
2021-07-29 04:42:15 +03:00
opts . Page = ctx . FormInt ( "page" )
2021-06-09 02:33:54 +03:00
if opts . Page <= 1 {
opts . Page = 1
}
var (
users [ ] * models . User
count int64
err error
orderBy models . SearchOrderBy
)
2021-10-12 21:11:35 +03:00
// we can not set orderBy to `models.SearchOrderByXxx`, because there may be a JOIN in the statement, different tables may have the same name columns
2021-08-11 03:31:13 +03:00
ctx . Data [ "SortType" ] = ctx . FormString ( "sort" )
switch ctx . FormString ( "sort" ) {
2021-06-09 02:33:54 +03:00
case "newest" :
2021-10-12 21:11:35 +03:00
orderBy = "`user`.id DESC"
2021-06-09 02:33:54 +03:00
case "oldest" :
2021-10-12 21:11:35 +03:00
orderBy = "`user`.id ASC"
2021-06-09 02:33:54 +03:00
case "recentupdate" :
2021-10-12 21:11:35 +03:00
orderBy = "`user`.updated_unix DESC"
2021-06-09 02:33:54 +03:00
case "leastupdate" :
2021-10-12 21:11:35 +03:00
orderBy = "`user`.updated_unix ASC"
2021-06-09 02:33:54 +03:00
case "reversealphabetically" :
2021-10-12 21:11:35 +03:00
orderBy = "`user`.name DESC"
case UserSearchDefaultSortType : // "alphabetically"
2021-06-09 02:33:54 +03:00
default :
2021-10-12 21:11:35 +03:00
orderBy = "`user`.name ASC"
ctx . Data [ "SortType" ] = UserSearchDefaultSortType
2021-06-09 02:33:54 +03:00
}
2021-08-11 18:08:52 +03:00
opts . Keyword = ctx . FormTrim ( "q" )
2021-06-09 02:33:54 +03:00
opts . OrderBy = orderBy
if len ( opts . Keyword ) == 0 || isKeywordValid ( opts . Keyword ) {
users , count , err = models . SearchUsers ( opts )
if err != nil {
ctx . ServerError ( "SearchUsers" , err )
return
}
}
ctx . Data [ "Keyword" ] = opts . Keyword
ctx . Data [ "Total" ] = count
ctx . Data [ "Users" ] = users
ctx . Data [ "UsersTwoFaStatus" ] = models . UserList ( users ) . GetTwoFaStatus ( )
ctx . Data [ "ShowUserEmail" ] = setting . UI . ShowUserEmail
ctx . Data [ "IsRepoIndexerEnabled" ] = setting . Indexer . RepoIndexerEnabled
pager := context . NewPagination ( int ( count ) , opts . PageSize , opts . Page , 5 )
pager . SetDefaultParams ( ctx )
ctx . Data [ "Page" ] = pager
ctx . HTML ( http . StatusOK , tplName )
}
// Users render explore users page
func Users ( ctx * context . Context ) {
if setting . Service . Explore . DisableUsersPage {
ctx . Redirect ( setting . AppSubURL + "/explore/repos" )
return
}
ctx . Data [ "Title" ] = ctx . Tr ( "explore" )
ctx . Data [ "PageIsExplore" ] = true
ctx . Data [ "PageIsExploreUsers" ] = true
ctx . Data [ "IsRepoIndexerEnabled" ] = setting . Indexer . RepoIndexerEnabled
RenderUserSearch ( ctx , & models . SearchUserOptions {
Actor : ctx . User ,
Type : models . UserTypeIndividual ,
2021-09-24 14:32:56 +03:00
ListOptions : db . ListOptions { PageSize : setting . UI . ExplorePagingNum } ,
2021-06-09 02:33:54 +03:00
IsActive : util . OptionalBoolTrue ,
Visible : [ ] structs . VisibleType { structs . VisibleTypePublic , structs . VisibleTypeLimited , structs . VisibleTypePrivate } ,
} , tplExploreUsers )
}