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  }