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 }