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  }