code.gitea.io/gitea@v1.21.7/routers/web/user/code.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package user 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 shared_user "code.gitea.io/gitea/routers/web/shared/user" 15 ) 16 17 const ( 18 tplUserCode base.TplName = "user/code" 19 ) 20 21 // CodeSearch render user/organization code search page 22 func CodeSearch(ctx *context.Context) { 23 if !setting.Indexer.RepoIndexerEnabled { 24 ctx.Redirect(ctx.ContextUser.HomeLink()) 25 return 26 } 27 shared_user.PrepareContextForProfileBigAvatar(ctx) 28 shared_user.RenderUserHeader(ctx) 29 30 if err := shared_user.LoadHeaderCount(ctx); err != nil { 31 ctx.ServerError("LoadHeaderCount", err) 32 return 33 } 34 35 ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled 36 ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled 37 ctx.Data["Title"] = ctx.Tr("explore.code") 38 39 language := ctx.FormTrim("l") 40 keyword := ctx.FormTrim("q") 41 42 queryType := ctx.FormTrim("t") 43 isMatch := queryType == "match" 44 45 ctx.Data["Keyword"] = keyword 46 ctx.Data["Language"] = language 47 ctx.Data["queryType"] = queryType 48 ctx.Data["IsCodePage"] = true 49 50 if keyword == "" { 51 ctx.HTML(http.StatusOK, tplUserCode) 52 return 53 } 54 55 var ( 56 repoIDs []int64 57 err error 58 ) 59 60 page := ctx.FormInt("page") 61 if page <= 0 { 62 page = 1 63 } 64 65 repoIDs, err = repo_model.FindUserCodeAccessibleOwnerRepoIDs(ctx, ctx.ContextUser.ID, ctx.Doer) 66 if err != nil { 67 ctx.ServerError("FindUserCodeAccessibleOwnerRepoIDs", err) 68 return 69 } 70 71 var ( 72 total int 73 searchResults []*code_indexer.Result 74 searchResultLanguages []*code_indexer.SearchResultLanguages 75 ) 76 77 if len(repoIDs) > 0 { 78 total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(ctx, repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum, isMatch) 79 if err != nil { 80 if code_indexer.IsAvailable(ctx) { 81 ctx.ServerError("SearchResults", err) 82 return 83 } 84 ctx.Data["CodeIndexerUnavailable"] = true 85 } else { 86 ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx) 87 } 88 89 loadRepoIDs := make([]int64, 0, len(searchResults)) 90 for _, result := range searchResults { 91 var find bool 92 for _, id := range loadRepoIDs { 93 if id == result.RepoID { 94 find = true 95 break 96 } 97 } 98 if !find { 99 loadRepoIDs = append(loadRepoIDs, result.RepoID) 100 } 101 } 102 103 repoMaps, err := repo_model.GetRepositoriesMapByIDs(loadRepoIDs) 104 if err != nil { 105 ctx.ServerError("GetRepositoriesMapByIDs", err) 106 return 107 } 108 109 ctx.Data["RepoMaps"] = repoMaps 110 } 111 ctx.Data["SearchResults"] = searchResults 112 ctx.Data["SearchResultLanguages"] = searchResultLanguages 113 114 pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5) 115 pager.SetDefaultParams(ctx) 116 pager.AddParam(ctx, "l", "Language") 117 ctx.Data["Page"] = pager 118 119 ctx.HTML(http.StatusOK, tplUserCode) 120 }