code.gitea.io/gitea@v1.22.3/routers/web/org/home.go (about)

     1  // Copyright 2019 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package org
     5  
     6  import (
     7  	"fmt"
     8  	"net/http"
     9  	"path"
    10  	"strings"
    11  
    12  	"code.gitea.io/gitea/models/db"
    13  	"code.gitea.io/gitea/models/organization"
    14  	repo_model "code.gitea.io/gitea/models/repo"
    15  	"code.gitea.io/gitea/modules/base"
    16  	"code.gitea.io/gitea/modules/git"
    17  	"code.gitea.io/gitea/modules/log"
    18  	"code.gitea.io/gitea/modules/markup"
    19  	"code.gitea.io/gitea/modules/markup/markdown"
    20  	"code.gitea.io/gitea/modules/setting"
    21  	"code.gitea.io/gitea/modules/util"
    22  	shared_user "code.gitea.io/gitea/routers/web/shared/user"
    23  	"code.gitea.io/gitea/services/context"
    24  )
    25  
    26  const (
    27  	tplOrgHome base.TplName = "org/home"
    28  )
    29  
    30  // Home show organization home page
    31  func Home(ctx *context.Context) {
    32  	uname := ctx.Params(":username")
    33  
    34  	if strings.HasSuffix(uname, ".keys") || strings.HasSuffix(uname, ".gpg") {
    35  		ctx.NotFound("", nil)
    36  		return
    37  	}
    38  
    39  	ctx.SetParams(":org", uname)
    40  	context.HandleOrgAssignment(ctx)
    41  	if ctx.Written() {
    42  		return
    43  	}
    44  
    45  	org := ctx.Org.Organization
    46  
    47  	ctx.Data["PageIsUserProfile"] = true
    48  	ctx.Data["Title"] = org.DisplayName()
    49  
    50  	var orderBy db.SearchOrderBy
    51  	ctx.Data["SortType"] = ctx.FormString("sort")
    52  	switch ctx.FormString("sort") {
    53  	case "newest":
    54  		orderBy = db.SearchOrderByNewest
    55  	case "oldest":
    56  		orderBy = db.SearchOrderByOldest
    57  	case "recentupdate":
    58  		orderBy = db.SearchOrderByRecentUpdated
    59  	case "leastupdate":
    60  		orderBy = db.SearchOrderByLeastUpdated
    61  	case "reversealphabetically":
    62  		orderBy = db.SearchOrderByAlphabeticallyReverse
    63  	case "alphabetically":
    64  		orderBy = db.SearchOrderByAlphabetically
    65  	case "moststars":
    66  		orderBy = db.SearchOrderByStarsReverse
    67  	case "feweststars":
    68  		orderBy = db.SearchOrderByStars
    69  	case "mostforks":
    70  		orderBy = db.SearchOrderByForksReverse
    71  	case "fewestforks":
    72  		orderBy = db.SearchOrderByForks
    73  	case "size":
    74  		orderBy = db.SearchOrderByGitSize
    75  	case "reversesize":
    76  		orderBy = db.SearchOrderByGitSizeReverse
    77  	default:
    78  		ctx.Data["SortType"] = "recentupdate"
    79  		orderBy = db.SearchOrderByRecentUpdated
    80  	}
    81  
    82  	keyword := ctx.FormTrim("q")
    83  	ctx.Data["Keyword"] = keyword
    84  
    85  	language := ctx.FormTrim("language")
    86  	ctx.Data["Language"] = language
    87  
    88  	page := ctx.FormInt("page")
    89  	if page <= 0 {
    90  		page = 1
    91  	}
    92  
    93  	archived := ctx.FormOptionalBool("archived")
    94  	ctx.Data["IsArchived"] = archived
    95  
    96  	fork := ctx.FormOptionalBool("fork")
    97  	ctx.Data["IsFork"] = fork
    98  
    99  	mirror := ctx.FormOptionalBool("mirror")
   100  	ctx.Data["IsMirror"] = mirror
   101  
   102  	template := ctx.FormOptionalBool("template")
   103  	ctx.Data["IsTemplate"] = template
   104  
   105  	private := ctx.FormOptionalBool("private")
   106  	ctx.Data["IsPrivate"] = private
   107  
   108  	var (
   109  		repos []*repo_model.Repository
   110  		count int64
   111  		err   error
   112  	)
   113  	repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
   114  		ListOptions: db.ListOptions{
   115  			PageSize: setting.UI.User.RepoPagingNum,
   116  			Page:     page,
   117  		},
   118  		Keyword:            keyword,
   119  		OwnerID:            org.ID,
   120  		OrderBy:            orderBy,
   121  		Private:            ctx.IsSigned,
   122  		Actor:              ctx.Doer,
   123  		Language:           language,
   124  		IncludeDescription: setting.UI.SearchRepoDescription,
   125  		Archived:           archived,
   126  		Fork:               fork,
   127  		Mirror:             mirror,
   128  		Template:           template,
   129  		IsPrivate:          private,
   130  	})
   131  	if err != nil {
   132  		ctx.ServerError("SearchRepository", err)
   133  		return
   134  	}
   135  
   136  	opts := &organization.FindOrgMembersOpts{
   137  		OrgID:       org.ID,
   138  		PublicOnly:  ctx.Org.PublicMemberOnly,
   139  		ListOptions: db.ListOptions{Page: 1, PageSize: 25},
   140  	}
   141  	members, _, err := organization.FindOrgMembers(ctx, opts)
   142  	if err != nil {
   143  		ctx.ServerError("FindOrgMembers", err)
   144  		return
   145  	}
   146  
   147  	ctx.Data["Repos"] = repos
   148  	ctx.Data["Total"] = count
   149  	ctx.Data["Members"] = members
   150  	ctx.Data["Teams"] = ctx.Org.Teams
   151  	ctx.Data["DisableNewPullMirrors"] = setting.Mirror.DisableNewPull
   152  	ctx.Data["PageIsViewRepositories"] = true
   153  
   154  	err = shared_user.LoadHeaderCount(ctx)
   155  	if err != nil {
   156  		ctx.ServerError("LoadHeaderCount", err)
   157  		return
   158  	}
   159  
   160  	pager := context.NewPagination(int(count), setting.UI.User.RepoPagingNum, page, 5)
   161  	pager.SetDefaultParams(ctx)
   162  	pager.AddParamString("language", language)
   163  	if archived.Has() {
   164  		pager.AddParamString("archived", fmt.Sprint(archived.Value()))
   165  	}
   166  	if fork.Has() {
   167  		pager.AddParamString("fork", fmt.Sprint(fork.Value()))
   168  	}
   169  	if mirror.Has() {
   170  		pager.AddParamString("mirror", fmt.Sprint(mirror.Value()))
   171  	}
   172  	if template.Has() {
   173  		pager.AddParamString("template", fmt.Sprint(template.Value()))
   174  	}
   175  	if private.Has() {
   176  		pager.AddParamString("private", fmt.Sprint(private.Value()))
   177  	}
   178  	ctx.Data["Page"] = pager
   179  
   180  	ctx.Data["ShowMemberAndTeamTab"] = ctx.Org.IsMember || len(members) > 0
   181  
   182  	profileDbRepo, profileGitRepo, profileReadmeBlob, profileClose := shared_user.FindUserProfileReadme(ctx, ctx.Doer)
   183  	defer profileClose()
   184  	prepareOrgProfileReadme(ctx, profileGitRepo, profileDbRepo, profileReadmeBlob)
   185  
   186  	ctx.HTML(http.StatusOK, tplOrgHome)
   187  }
   188  
   189  func prepareOrgProfileReadme(ctx *context.Context, profileGitRepo *git.Repository, profileDbRepo *repo_model.Repository, profileReadme *git.Blob) {
   190  	if profileGitRepo == nil || profileReadme == nil {
   191  		return
   192  	}
   193  
   194  	if bytes, err := profileReadme.GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil {
   195  		log.Error("failed to GetBlobContent: %v", err)
   196  	} else {
   197  		if profileContent, err := markdown.RenderString(&markup.RenderContext{
   198  			Ctx:     ctx,
   199  			GitRepo: profileGitRepo,
   200  			Links: markup.Links{
   201  				// Pass repo link to markdown render for the full link of media elements.
   202  				// The profile of default branch would be shown.
   203  				Base:       profileDbRepo.Link(),
   204  				BranchPath: path.Join("branch", util.PathEscapeSegments(profileDbRepo.DefaultBranch)),
   205  			},
   206  			Metas: map[string]string{"mode": "document"},
   207  		}, bytes); err != nil {
   208  			log.Error("failed to RenderString: %v", err)
   209  		} else {
   210  			ctx.Data["ProfileReadme"] = profileContent
   211  		}
   212  	}
   213  }