code.gitea.io/gitea@v1.21.7/routers/web/explore/code.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package explore 5 6 import ( 7 "net/http" 8 9 repo_model "code.gitea.io/gitea/models/repo" 10 "code.gitea.io/gitea/modules/base" 11 "code.gitea.io/gitea/modules/context" 12 code_indexer "code.gitea.io/gitea/modules/indexer/code" 13 "code.gitea.io/gitea/modules/setting" 14 ) 15 16 const ( 17 // tplExploreCode explore code page template 18 tplExploreCode base.TplName = "explore/code" 19 ) 20 21 // Code render explore code page 22 func Code(ctx *context.Context) { 23 if !setting.Indexer.RepoIndexerEnabled { 24 ctx.Redirect(setting.AppSubURL + "/explore") 25 return 26 } 27 28 ctx.Data["UsersIsDisabled"] = setting.Service.Explore.DisableUsersPage 29 ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled 30 ctx.Data["Title"] = ctx.Tr("explore") 31 ctx.Data["PageIsExplore"] = true 32 ctx.Data["PageIsExploreCode"] = true 33 34 language := ctx.FormTrim("l") 35 keyword := ctx.FormTrim("q") 36 37 queryType := ctx.FormTrim("t") 38 isMatch := queryType == "match" 39 40 ctx.Data["Keyword"] = keyword 41 ctx.Data["Language"] = language 42 ctx.Data["queryType"] = queryType 43 ctx.Data["PageIsViewCode"] = true 44 45 if keyword == "" { 46 ctx.HTML(http.StatusOK, tplExploreCode) 47 return 48 } 49 50 page := ctx.FormInt("page") 51 if page <= 0 { 52 page = 1 53 } 54 55 var ( 56 repoIDs []int64 57 err error 58 isAdmin bool 59 ) 60 if ctx.Doer != nil { 61 isAdmin = ctx.Doer.IsAdmin 62 } 63 64 // guest user or non-admin user 65 if ctx.Doer == nil || !isAdmin { 66 repoIDs, err = repo_model.FindUserCodeAccessibleRepoIDs(ctx, ctx.Doer) 67 if err != nil { 68 ctx.ServerError("FindUserCodeAccessibleRepoIDs", err) 69 return 70 } 71 } 72 73 var ( 74 total int 75 searchResults []*code_indexer.Result 76 searchResultLanguages []*code_indexer.SearchResultLanguages 77 ) 78 79 if (len(repoIDs) > 0) || isAdmin { 80 total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(ctx, repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum, isMatch) 81 if err != nil { 82 if code_indexer.IsAvailable(ctx) { 83 ctx.ServerError("SearchResults", err) 84 return 85 } 86 ctx.Data["CodeIndexerUnavailable"] = true 87 } else { 88 ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx) 89 } 90 91 loadRepoIDs := make([]int64, 0, len(searchResults)) 92 for _, result := range searchResults { 93 var find bool 94 for _, id := range loadRepoIDs { 95 if id == result.RepoID { 96 find = true 97 break 98 } 99 } 100 if !find { 101 loadRepoIDs = append(loadRepoIDs, result.RepoID) 102 } 103 } 104 105 repoMaps, err := repo_model.GetRepositoriesMapByIDs(loadRepoIDs) 106 if err != nil { 107 ctx.ServerError("GetRepositoriesMapByIDs", err) 108 return 109 } 110 111 ctx.Data["RepoMaps"] = repoMaps 112 113 if len(loadRepoIDs) != len(repoMaps) { 114 // Remove deleted repos from search results 115 cleanedSearchResults := make([]*code_indexer.Result, 0, len(repoMaps)) 116 for _, sr := range searchResults { 117 if _, found := repoMaps[sr.RepoID]; found { 118 cleanedSearchResults = append(cleanedSearchResults, sr) 119 } 120 } 121 122 searchResults = cleanedSearchResults 123 } 124 } 125 126 ctx.Data["SearchResults"] = searchResults 127 ctx.Data["SearchResultLanguages"] = searchResultLanguages 128 129 pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5) 130 pager.SetDefaultParams(ctx) 131 pager.AddParam(ctx, "l", "Language") 132 ctx.Data["Page"] = pager 133 134 ctx.HTML(http.StatusOK, tplExploreCode) 135 }