@@ -11,6 +11,7 @@ import (
1111 "code.gitea.io/gitea/models"
1212 "code.gitea.io/gitea/modules/base"
1313 "code.gitea.io/gitea/modules/context"
14+ "code.gitea.io/gitea/modules/search"
1415 "code.gitea.io/gitea/modules/setting"
1516 "code.gitea.io/gitea/modules/util"
1617 "code.gitea.io/gitea/routers/user"
@@ -27,6 +28,8 @@ const (
2728 tplExploreUsers base.TplName = "explore/users"
2829 // tplExploreOrganizations explore organizations page template
2930 tplExploreOrganizations base.TplName = "explore/organizations"
31+ // tplExploreCode explore code page template
32+ tplExploreCode base.TplName = "explore/code"
3033)
3134
3235// Home render home page
@@ -49,6 +52,7 @@ func Home(ctx *context.Context) {
4952 }
5053
5154 ctx .Data ["PageIsHome" ] = true
55+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
5256 ctx .HTML (200 , tplHome )
5357}
5458
@@ -124,6 +128,7 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
124128 ctx .Data ["Total" ] = count
125129 ctx .Data ["Page" ] = paginater .New (int (count ), opts .PageSize , page , 5 )
126130 ctx .Data ["Repos" ] = repos
131+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
127132
128133 ctx .HTML (200 , opts .TplName )
129134}
@@ -133,6 +138,7 @@ func ExploreRepos(ctx *context.Context) {
133138 ctx .Data ["Title" ] = ctx .Tr ("explore" )
134139 ctx .Data ["PageIsExplore" ] = true
135140 ctx .Data ["PageIsExploreRepositories" ] = true
141+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
136142
137143 var ownerID int64
138144 if ctx .User != nil && ! ctx .User .IsAdmin {
@@ -194,6 +200,7 @@ func RenderUserSearch(ctx *context.Context, opts *models.SearchUserOptions, tplN
194200 ctx .Data ["Page" ] = paginater .New (int (count ), opts .PageSize , opts .Page , 5 )
195201 ctx .Data ["Users" ] = users
196202 ctx .Data ["ShowUserEmail" ] = setting .UI .ShowUserEmail
203+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
197204
198205 ctx .HTML (200 , tplName )
199206}
@@ -203,6 +210,7 @@ func ExploreUsers(ctx *context.Context) {
203210 ctx .Data ["Title" ] = ctx .Tr ("explore" )
204211 ctx .Data ["PageIsExplore" ] = true
205212 ctx .Data ["PageIsExploreUsers" ] = true
213+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
206214
207215 RenderUserSearch (ctx , & models.SearchUserOptions {
208216 Type : models .UserTypeIndividual ,
@@ -216,13 +224,121 @@ func ExploreOrganizations(ctx *context.Context) {
216224 ctx .Data ["Title" ] = ctx .Tr ("explore" )
217225 ctx .Data ["PageIsExplore" ] = true
218226 ctx .Data ["PageIsExploreOrganizations" ] = true
227+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
219228
220229 RenderUserSearch (ctx , & models.SearchUserOptions {
221230 Type : models .UserTypeOrganization ,
222231 PageSize : setting .UI .ExplorePagingNum ,
223232 }, tplExploreOrganizations )
224233}
225234
235+ // ExploreCode render explore code page
236+ func ExploreCode (ctx * context.Context ) {
237+ if ! setting .Indexer .RepoIndexerEnabled {
238+ ctx .Redirect ("/explore" , 302 )
239+ return
240+ }
241+
242+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
243+ ctx .Data ["Title" ] = ctx .Tr ("explore" )
244+ ctx .Data ["PageIsExplore" ] = true
245+ ctx .Data ["PageIsExploreCode" ] = true
246+
247+ keyword := strings .TrimSpace (ctx .Query ("q" ))
248+ page := ctx .QueryInt ("page" )
249+ if page <= 0 {
250+ page = 1
251+ }
252+
253+ var (
254+ repoIDs []int64
255+ err error
256+ isAdmin bool
257+ userID int64
258+ )
259+ if ctx .User != nil {
260+ userID = ctx .User .ID
261+ isAdmin = ctx .User .IsAdmin
262+ }
263+
264+ // guest user or non-admin user
265+ if ctx .User == nil || ! isAdmin {
266+ repoIDs , err = models .FindUserAccessibleRepoIDs (userID )
267+ if err != nil {
268+ ctx .ServerError ("SearchResults" , err )
269+ return
270+ }
271+ }
272+
273+ var (
274+ total int
275+ searchResults []* search.Result
276+ )
277+
278+ // if non-admin login user, we need check UnitTypeCode at first
279+ if ctx .User != nil && len (repoIDs ) > 0 {
280+ repoMaps , err := models .GetRepositoriesMapByIDs (repoIDs )
281+ if err != nil {
282+ ctx .ServerError ("SearchResults" , err )
283+ return
284+ }
285+
286+ var rightRepoMap = make (map [int64 ]* models.Repository , len (repoMaps ))
287+ repoIDs = make ([]int64 , 0 , len (repoMaps ))
288+ for id , repo := range repoMaps {
289+ if repo .CheckUnitUser (userID , isAdmin , models .UnitTypeCode ) {
290+ rightRepoMap [id ] = repo
291+ repoIDs = append (repoIDs , id )
292+ }
293+ }
294+
295+ ctx .Data ["RepoMaps" ] = rightRepoMap
296+
297+ total , searchResults , err = search .PerformSearch (repoIDs , keyword , page , setting .UI .RepoSearchPagingNum )
298+ if err != nil {
299+ ctx .ServerError ("SearchResults" , err )
300+ return
301+ }
302+ // if non-login user or isAdmin, no need to check UnitTypeCode
303+ } else if (ctx .User == nil && len (repoIDs ) > 0 ) || isAdmin {
304+ total , searchResults , err = search .PerformSearch (repoIDs , keyword , page , setting .UI .RepoSearchPagingNum )
305+ if err != nil {
306+ ctx .ServerError ("SearchResults" , err )
307+ return
308+ }
309+
310+ var loadRepoIDs = make ([]int64 , 0 , len (searchResults ))
311+ for _ , result := range searchResults {
312+ var find bool
313+ for _ , id := range loadRepoIDs {
314+ if id == result .RepoID {
315+ find = true
316+ break
317+ }
318+ }
319+ if ! find {
320+ loadRepoIDs = append (loadRepoIDs , result .RepoID )
321+ }
322+ }
323+
324+ repoMaps , err := models .GetRepositoriesMapByIDs (loadRepoIDs )
325+ if err != nil {
326+ ctx .ServerError ("SearchResults" , err )
327+ return
328+ }
329+
330+ ctx .Data ["RepoMaps" ] = repoMaps
331+ }
332+
333+ ctx .Data ["Keyword" ] = keyword
334+ pager := paginater .New (total , setting .UI .RepoSearchPagingNum , page , 5 )
335+ ctx .Data ["Page" ] = pager
336+ ctx .Data ["SearchResults" ] = searchResults
337+ ctx .Data ["RequireHighlightJS" ] = true
338+ ctx .Data ["PageIsViewCode" ] = true
339+ ctx .HTML (200 , tplExploreCode )
340+ }
341+
226342// NotFound render 404 page
227343func NotFound (ctx * context.Context ) {
228344 ctx .Data ["Title" ] = "Page Not Found"
0 commit comments