code.gitea.io/gitea@v1.22.3/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 "code.gitea.io/gitea/models/db" 10 repo_model "code.gitea.io/gitea/models/repo" 11 "code.gitea.io/gitea/modules/base" 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 "code.gitea.io/gitea/services/context" 16 ) 17 18 const ( 19 tplUserCode base.TplName = "user/code" 20 ) 21 22 // CodeSearch render user/organization code search page 23 func CodeSearch(ctx *context.Context) { 24 if !setting.Indexer.RepoIndexerEnabled { 25 ctx.Redirect(ctx.ContextUser.HomeLink()) 26 return 27 } 28 shared_user.PrepareContextForProfileBigAvatar(ctx) 29 shared_user.RenderUserHeader(ctx) 30 31 if err := shared_user.LoadHeaderCount(ctx); err != nil { 32 ctx.ServerError("LoadHeaderCount", err) 33 return 34 } 35 36 ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled 37 ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled 38 ctx.Data["Title"] = ctx.Tr("explore.code") 39 40 language := ctx.FormTrim("l") 41 keyword := ctx.FormTrim("q") 42 43 isFuzzy := ctx.FormOptionalBool("fuzzy").ValueOrDefault(true) 44 45 ctx.Data["Keyword"] = keyword 46 ctx.Data["Language"] = language 47 ctx.Data["IsFuzzy"] = isFuzzy 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, &code_indexer.SearchOptions{ 79 RepoIDs: repoIDs, 80 Keyword: keyword, 81 IsKeywordFuzzy: isFuzzy, 82 Language: language, 83 Paginator: &db.ListOptions{ 84 Page: page, 85 PageSize: setting.UI.RepoSearchPagingNum, 86 }, 87 }) 88 if err != nil { 89 if code_indexer.IsAvailable(ctx) { 90 ctx.ServerError("SearchResults", err) 91 return 92 } 93 ctx.Data["CodeIndexerUnavailable"] = true 94 } else { 95 ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx) 96 } 97 98 loadRepoIDs := make([]int64, 0, len(searchResults)) 99 for _, result := range searchResults { 100 var find bool 101 for _, id := range loadRepoIDs { 102 if id == result.RepoID { 103 find = true 104 break 105 } 106 } 107 if !find { 108 loadRepoIDs = append(loadRepoIDs, result.RepoID) 109 } 110 } 111 112 repoMaps, err := repo_model.GetRepositoriesMapByIDs(ctx, loadRepoIDs) 113 if err != nil { 114 ctx.ServerError("GetRepositoriesMapByIDs", err) 115 return 116 } 117 118 ctx.Data["RepoMaps"] = repoMaps 119 } 120 ctx.Data["SearchResults"] = searchResults 121 ctx.Data["SearchResultLanguages"] = searchResultLanguages 122 123 pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5) 124 pager.SetDefaultParams(ctx) 125 pager.AddParamString("l", language) 126 ctx.Data["Page"] = pager 127 128 ctx.HTML(http.StatusOK, tplUserCode) 129 }