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  }