@@ -11,6 +11,7 @@ import (
11
11
"code.gitea.io/gitea/models"
12
12
"code.gitea.io/gitea/modules/base"
13
13
"code.gitea.io/gitea/modules/context"
14
+ "code.gitea.io/gitea/modules/search"
14
15
"code.gitea.io/gitea/modules/setting"
15
16
"code.gitea.io/gitea/modules/util"
16
17
"code.gitea.io/gitea/routers/user"
@@ -27,6 +28,8 @@ const (
27
28
tplExploreUsers base.TplName = "explore/users"
28
29
// tplExploreOrganizations explore organizations page template
29
30
tplExploreOrganizations base.TplName = "explore/organizations"
31
+ // tplExploreCode explore code page template
32
+ tplExploreCode base.TplName = "explore/code"
30
33
)
31
34
32
35
// Home render home page
@@ -49,6 +52,7 @@ func Home(ctx *context.Context) {
49
52
}
50
53
51
54
ctx .Data ["PageIsHome" ] = true
55
+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
52
56
ctx .HTML (200 , tplHome )
53
57
}
54
58
@@ -124,6 +128,7 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
124
128
ctx .Data ["Total" ] = count
125
129
ctx .Data ["Page" ] = paginater .New (int (count ), opts .PageSize , page , 5 )
126
130
ctx .Data ["Repos" ] = repos
131
+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
127
132
128
133
ctx .HTML (200 , opts .TplName )
129
134
}
@@ -133,6 +138,7 @@ func ExploreRepos(ctx *context.Context) {
133
138
ctx .Data ["Title" ] = ctx .Tr ("explore" )
134
139
ctx .Data ["PageIsExplore" ] = true
135
140
ctx .Data ["PageIsExploreRepositories" ] = true
141
+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
136
142
137
143
var ownerID int64
138
144
if ctx .User != nil && ! ctx .User .IsAdmin {
@@ -194,6 +200,7 @@ func RenderUserSearch(ctx *context.Context, opts *models.SearchUserOptions, tplN
194
200
ctx .Data ["Page" ] = paginater .New (int (count ), opts .PageSize , opts .Page , 5 )
195
201
ctx .Data ["Users" ] = users
196
202
ctx .Data ["ShowUserEmail" ] = setting .UI .ShowUserEmail
203
+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
197
204
198
205
ctx .HTML (200 , tplName )
199
206
}
@@ -203,6 +210,7 @@ func ExploreUsers(ctx *context.Context) {
203
210
ctx .Data ["Title" ] = ctx .Tr ("explore" )
204
211
ctx .Data ["PageIsExplore" ] = true
205
212
ctx .Data ["PageIsExploreUsers" ] = true
213
+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
206
214
207
215
RenderUserSearch (ctx , & models.SearchUserOptions {
208
216
Type : models .UserTypeIndividual ,
@@ -216,13 +224,121 @@ func ExploreOrganizations(ctx *context.Context) {
216
224
ctx .Data ["Title" ] = ctx .Tr ("explore" )
217
225
ctx .Data ["PageIsExplore" ] = true
218
226
ctx .Data ["PageIsExploreOrganizations" ] = true
227
+ ctx .Data ["IsRepoIndexerEnabled" ] = setting .Indexer .RepoIndexerEnabled
219
228
220
229
RenderUserSearch (ctx , & models.SearchUserOptions {
221
230
Type : models .UserTypeOrganization ,
222
231
PageSize : setting .UI .ExplorePagingNum ,
223
232
}, tplExploreOrganizations )
224
233
}
225
234
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
+
226
342
// NotFound render 404 page
227
343
func NotFound (ctx * context.Context ) {
228
344
ctx .Data ["Title" ] = "Page Not Found"
0 commit comments