code.gitea.io/gitea@v1.21.7/routers/web/explore/repo.go (about)

     1  // Copyright 2021 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package explore
     5  
     6  import (
     7  	"fmt"
     8  	"net/http"
     9  
    10  	"code.gitea.io/gitea/models/db"
    11  	repo_model "code.gitea.io/gitea/models/repo"
    12  	"code.gitea.io/gitea/modules/base"
    13  	"code.gitea.io/gitea/modules/context"
    14  	"code.gitea.io/gitea/modules/log"
    15  	"code.gitea.io/gitea/modules/setting"
    16  	"code.gitea.io/gitea/modules/sitemap"
    17  )
    18  
    19  const (
    20  	// tplExploreRepos explore repositories page template
    21  	tplExploreRepos        base.TplName = "explore/repos"
    22  	relevantReposOnlyParam string       = "only_show_relevant"
    23  )
    24  
    25  // RepoSearchOptions when calling search repositories
    26  type RepoSearchOptions struct {
    27  	OwnerID          int64
    28  	Private          bool
    29  	Restricted       bool
    30  	PageSize         int
    31  	OnlyShowRelevant bool
    32  	TplName          base.TplName
    33  }
    34  
    35  // RenderRepoSearch render repositories search page
    36  // This function is also used to render the Admin Repository Management page.
    37  func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
    38  	// Sitemap index for sitemap paths
    39  	page := int(ctx.ParamsInt64("idx"))
    40  	isSitemap := ctx.Params("idx") != ""
    41  	if page <= 1 {
    42  		page = ctx.FormInt("page")
    43  	}
    44  
    45  	if page <= 0 {
    46  		page = 1
    47  	}
    48  
    49  	if isSitemap {
    50  		opts.PageSize = setting.UI.SitemapPagingNum
    51  	}
    52  
    53  	var (
    54  		repos   []*repo_model.Repository
    55  		count   int64
    56  		err     error
    57  		orderBy db.SearchOrderBy
    58  	)
    59  
    60  	ctx.Data["SortType"] = ctx.FormString("sort")
    61  	switch ctx.FormString("sort") {
    62  	case "newest":
    63  		orderBy = db.SearchOrderByNewest
    64  	case "oldest":
    65  		orderBy = db.SearchOrderByOldest
    66  	case "leastupdate":
    67  		orderBy = db.SearchOrderByLeastUpdated
    68  	case "reversealphabetically":
    69  		orderBy = db.SearchOrderByAlphabeticallyReverse
    70  	case "alphabetically":
    71  		orderBy = db.SearchOrderByAlphabetically
    72  	case "reversesize":
    73  		orderBy = db.SearchOrderBySizeReverse
    74  	case "size":
    75  		orderBy = db.SearchOrderBySize
    76  	case "reversegitsize":
    77  		orderBy = db.SearchOrderByGitSizeReverse
    78  	case "gitsize":
    79  		orderBy = db.SearchOrderByGitSize
    80  	case "reverselfssize":
    81  		orderBy = db.SearchOrderByLFSSizeReverse
    82  	case "lfssize":
    83  		orderBy = db.SearchOrderByLFSSize
    84  	case "moststars":
    85  		orderBy = db.SearchOrderByStarsReverse
    86  	case "feweststars":
    87  		orderBy = db.SearchOrderByStars
    88  	case "mostforks":
    89  		orderBy = db.SearchOrderByForksReverse
    90  	case "fewestforks":
    91  		orderBy = db.SearchOrderByForks
    92  	default:
    93  		ctx.Data["SortType"] = "recentupdate"
    94  		orderBy = db.SearchOrderByRecentUpdated
    95  	}
    96  
    97  	keyword := ctx.FormTrim("q")
    98  
    99  	ctx.Data["OnlyShowRelevant"] = opts.OnlyShowRelevant
   100  
   101  	topicOnly := ctx.FormBool("topic")
   102  	ctx.Data["TopicOnly"] = topicOnly
   103  
   104  	language := ctx.FormTrim("language")
   105  	ctx.Data["Language"] = language
   106  
   107  	repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
   108  		ListOptions: db.ListOptions{
   109  			Page:     page,
   110  			PageSize: opts.PageSize,
   111  		},
   112  		Actor:              ctx.Doer,
   113  		OrderBy:            orderBy,
   114  		Private:            opts.Private,
   115  		Keyword:            keyword,
   116  		OwnerID:            opts.OwnerID,
   117  		AllPublic:          true,
   118  		AllLimited:         true,
   119  		TopicOnly:          topicOnly,
   120  		Language:           language,
   121  		IncludeDescription: setting.UI.SearchRepoDescription,
   122  		OnlyShowRelevant:   opts.OnlyShowRelevant,
   123  	})
   124  	if err != nil {
   125  		ctx.ServerError("SearchRepository", err)
   126  		return
   127  	}
   128  	if isSitemap {
   129  		m := sitemap.NewSitemap()
   130  		for _, item := range repos {
   131  			m.Add(sitemap.URL{URL: item.HTMLURL(), LastMod: item.UpdatedUnix.AsTimePtr()})
   132  		}
   133  		ctx.Resp.Header().Set("Content-Type", "text/xml")
   134  		if _, err := m.WriteTo(ctx.Resp); err != nil {
   135  			log.Error("Failed writing sitemap: %v", err)
   136  		}
   137  		return
   138  	}
   139  
   140  	ctx.Data["Keyword"] = keyword
   141  	ctx.Data["Total"] = count
   142  	ctx.Data["Repos"] = repos
   143  	ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
   144  
   145  	pager := context.NewPagination(int(count), opts.PageSize, page, 5)
   146  	pager.SetDefaultParams(ctx)
   147  	pager.AddParam(ctx, "topic", "TopicOnly")
   148  	pager.AddParam(ctx, "language", "Language")
   149  	pager.AddParamString(relevantReposOnlyParam, fmt.Sprint(opts.OnlyShowRelevant))
   150  	ctx.Data["Page"] = pager
   151  
   152  	ctx.HTML(http.StatusOK, opts.TplName)
   153  }
   154  
   155  // Repos render explore repositories page
   156  func Repos(ctx *context.Context) {
   157  	ctx.Data["UsersIsDisabled"] = setting.Service.Explore.DisableUsersPage
   158  	ctx.Data["Title"] = ctx.Tr("explore")
   159  	ctx.Data["PageIsExplore"] = true
   160  	ctx.Data["PageIsExploreRepositories"] = true
   161  	ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
   162  
   163  	var ownerID int64
   164  	if ctx.Doer != nil && !ctx.Doer.IsAdmin {
   165  		ownerID = ctx.Doer.ID
   166  	}
   167  
   168  	onlyShowRelevant := setting.UI.OnlyShowRelevantRepos
   169  
   170  	_ = ctx.Req.ParseForm() // parse the form first, to prepare the ctx.Req.Form field
   171  	if len(ctx.Req.Form[relevantReposOnlyParam]) != 0 {
   172  		onlyShowRelevant = ctx.FormBool(relevantReposOnlyParam)
   173  	}
   174  
   175  	RenderRepoSearch(ctx, &RepoSearchOptions{
   176  		PageSize:         setting.UI.ExplorePagingNum,
   177  		OwnerID:          ownerID,
   178  		Private:          ctx.Doer != nil,
   179  		TplName:          tplExploreRepos,
   180  		OnlyShowRelevant: onlyShowRelevant,
   181  	})
   182  }