2019-12-14 09:36:59 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-12-14 09:36:59 +03:00
package org
import (
2021-04-05 18:30:52 +03:00
"net/http"
2022-03-02 04:37:32 +03:00
"strings"
2019-12-14 09:36:59 +03:00
2021-09-24 14:32:56 +03:00
"code.gitea.io/gitea/models/db"
2022-03-29 09:29:02 +03:00
"code.gitea.io/gitea/models/organization"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2023-04-29 22:13:58 +03:00
user_model "code.gitea.io/gitea/models/user"
2019-12-14 09:36:59 +03:00
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
2023-11-09 17:05:52 +03:00
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
2021-04-20 01:25:08 +03:00
"code.gitea.io/gitea/modules/markup"
2020-11-15 19:28:08 +03:00
"code.gitea.io/gitea/modules/markup/markdown"
2019-12-14 09:36:59 +03:00
"code.gitea.io/gitea/modules/setting"
2023-12-27 11:32:27 +03:00
"code.gitea.io/gitea/modules/util"
2023-08-11 20:08:05 +03:00
shared_user "code.gitea.io/gitea/routers/web/shared/user"
2019-12-14 09:36:59 +03:00
)
const (
tplOrgHome base . TplName = "org/home"
)
// Home show organization home page
func Home ( ctx * context . Context ) {
2022-03-02 04:37:32 +03:00
uname := ctx . Params ( ":username" )
if strings . HasSuffix ( uname , ".keys" ) || strings . HasSuffix ( uname , ".gpg" ) {
ctx . NotFound ( "" , nil )
return
}
ctx . SetParams ( ":org" , uname )
2019-12-14 09:36:59 +03:00
context . HandleOrgAssignment ( ctx )
if ctx . Written ( ) {
return
}
org := ctx . Org . Organization
2020-09-11 09:41:43 +03:00
ctx . Data [ "PageIsUserProfile" ] = true
2019-12-14 09:36:59 +03:00
ctx . Data [ "Title" ] = org . DisplayName ( )
2020-11-15 19:28:08 +03:00
if len ( org . Description ) != 0 {
2021-04-20 01:25:08 +03:00
desc , err := markdown . RenderString ( & markup . RenderContext {
2022-01-20 02:26:57 +03:00
Ctx : ctx ,
2021-04-20 01:25:08 +03:00
URLPrefix : ctx . Repo . RepoLink ,
Metas : map [ string ] string { "mode" : "document" } ,
2021-06-21 01:39:12 +03:00
GitRepo : ctx . Repo . GitRepo ,
2021-04-20 01:25:08 +03:00
} , org . Description )
if err != nil {
ctx . ServerError ( "RenderString" , err )
return
}
ctx . Data [ "RenderedDescription" ] = desc
2020-11-15 19:28:08 +03:00
}
2019-12-14 09:36:59 +03:00
2021-11-24 12:49:20 +03:00
var orderBy db . SearchOrderBy
2021-08-11 03:31:13 +03:00
ctx . Data [ "SortType" ] = ctx . FormString ( "sort" )
switch ctx . FormString ( "sort" ) {
2019-12-14 09:36:59 +03:00
case "newest" :
2021-11-24 12:49:20 +03:00
orderBy = db . SearchOrderByNewest
2019-12-14 09:36:59 +03:00
case "oldest" :
2021-11-24 12:49:20 +03:00
orderBy = db . SearchOrderByOldest
2019-12-14 09:36:59 +03:00
case "recentupdate" :
2021-11-24 12:49:20 +03:00
orderBy = db . SearchOrderByRecentUpdated
2019-12-14 09:36:59 +03:00
case "leastupdate" :
2021-11-24 12:49:20 +03:00
orderBy = db . SearchOrderByLeastUpdated
2019-12-14 09:36:59 +03:00
case "reversealphabetically" :
2021-11-24 12:49:20 +03:00
orderBy = db . SearchOrderByAlphabeticallyReverse
2019-12-14 09:36:59 +03:00
case "alphabetically" :
2021-11-24 12:49:20 +03:00
orderBy = db . SearchOrderByAlphabetically
2019-12-14 09:36:59 +03:00
case "moststars" :
2021-11-24 12:49:20 +03:00
orderBy = db . SearchOrderByStarsReverse
2019-12-14 09:36:59 +03:00
case "feweststars" :
2021-11-24 12:49:20 +03:00
orderBy = db . SearchOrderByStars
2019-12-14 09:36:59 +03:00
case "mostforks" :
2021-11-24 12:49:20 +03:00
orderBy = db . SearchOrderByForksReverse
2019-12-14 09:36:59 +03:00
case "fewestforks" :
2021-11-24 12:49:20 +03:00
orderBy = db . SearchOrderByForks
2019-12-14 09:36:59 +03:00
default :
ctx . Data [ "SortType" ] = "recentupdate"
2021-11-24 12:49:20 +03:00
orderBy = db . SearchOrderByRecentUpdated
2019-12-14 09:36:59 +03:00
}
2021-08-11 18:08:52 +03:00
keyword := ctx . FormTrim ( "q" )
2019-12-14 09:36:59 +03:00
ctx . Data [ "Keyword" ] = keyword
2022-01-28 14:29:04 +03:00
language := ctx . FormTrim ( "language" )
ctx . Data [ "Language" ] = language
2021-07-29 04:42:15 +03:00
page := ctx . FormInt ( "page" )
2019-12-14 09:36:59 +03:00
if page <= 0 {
page = 1
}
var (
2021-12-10 04:27:50 +03:00
repos [ ] * repo_model . Repository
2019-12-14 09:36:59 +03:00
count int64
err error
)
2022-11-19 11:12:33 +03:00
repos , count , err = repo_model . SearchRepository ( ctx , & repo_model . SearchRepoOptions {
2021-09-24 14:32:56 +03:00
ListOptions : db . ListOptions {
2020-01-24 22:00:29 +03:00
PageSize : setting . UI . User . RepoPagingNum ,
Page : page ,
} ,
2019-12-14 09:36:59 +03:00
Keyword : keyword ,
OwnerID : org . ID ,
OrderBy : orderBy ,
Private : ctx . IsSigned ,
2022-03-22 10:03:22 +03:00
Actor : ctx . Doer ,
2022-01-28 14:29:04 +03:00
Language : language ,
2019-12-14 09:36:59 +03:00
IncludeDescription : setting . UI . SearchRepoDescription ,
} )
if err != nil {
ctx . ServerError ( "SearchRepository" , err )
return
}
2022-03-29 09:29:02 +03:00
opts := & organization . FindOrgMembersOpts {
2020-01-24 22:00:29 +03:00
OrgID : org . ID ,
2023-08-15 17:00:35 +03:00
PublicOnly : ctx . Org . PublicMemberOnly ,
2021-09-24 14:32:56 +03:00
ListOptions : db . ListOptions { Page : 1 , PageSize : 25 } ,
2019-12-14 09:36:59 +03:00
}
2023-09-14 20:09:32 +03:00
members , _ , err := organization . FindOrgMembers ( ctx , opts )
2019-12-14 09:36:59 +03:00
if err != nil {
ctx . ServerError ( "FindOrgMembers" , err )
return
}
2023-04-29 22:13:58 +03:00
var isFollowing bool
if ctx . Doer != nil {
2023-09-16 17:39:12 +03:00
isFollowing = user_model . IsFollowing ( ctx , ctx . Doer . ID , ctx . ContextUser . ID )
2023-04-29 22:13:58 +03:00
}
2019-12-14 09:36:59 +03:00
ctx . Data [ "Repos" ] = repos
ctx . Data [ "Total" ] = count
ctx . Data [ "Members" ] = members
2021-11-19 14:41:40 +03:00
ctx . Data [ "Teams" ] = ctx . Org . Teams
2021-09-07 18:49:36 +03:00
ctx . Data [ "DisableNewPullMirrors" ] = setting . Mirror . DisableNewPull
2021-11-24 19:12:54 +03:00
ctx . Data [ "PageIsViewRepositories" ] = true
2023-04-29 22:13:58 +03:00
ctx . Data [ "IsFollowing" ] = isFollowing
2020-10-24 02:01:58 +03:00
2023-08-11 20:08:05 +03:00
err = shared_user . LoadHeaderCount ( ctx )
if err != nil {
ctx . ServerError ( "LoadHeaderCount" , err )
return
}
2019-12-14 09:36:59 +03:00
pager := context . NewPagination ( int ( count ) , setting . UI . User . RepoPagingNum , page , 5 )
pager . SetDefaultParams ( ctx )
2022-01-28 14:29:04 +03:00
pager . AddParam ( ctx , "language" , "Language" )
2019-12-14 09:36:59 +03:00
ctx . Data [ "Page" ] = pager
2023-08-15 17:00:35 +03:00
ctx . Data [ "ShowMemberAndTeamTab" ] = ctx . Org . IsMember || len ( members ) > 0
2023-12-27 11:32:27 +03:00
profileDbRepo , profileGitRepo , profileReadmeBlob , profileClose := shared_user . FindUserProfileReadme ( ctx , ctx . Doer )
2023-11-09 17:05:52 +03:00
defer profileClose ( )
2023-12-27 11:32:27 +03:00
prepareOrgProfileReadme ( ctx , profileGitRepo , profileDbRepo , profileReadmeBlob )
2023-11-09 17:05:52 +03:00
2021-04-05 18:30:52 +03:00
ctx . HTML ( http . StatusOK , tplOrgHome )
2019-12-14 09:36:59 +03:00
}
2023-11-09 17:05:52 +03:00
2023-12-27 11:32:27 +03:00
func prepareOrgProfileReadme ( ctx * context . Context , profileGitRepo * git . Repository , profileDbRepo * repo_model . Repository , profileReadme * git . Blob ) {
2023-11-09 17:05:52 +03:00
if profileGitRepo == nil || profileReadme == nil {
return
}
if bytes , err := profileReadme . GetBlobContent ( setting . UI . MaxDisplayFileSize ) ; err != nil {
log . Error ( "failed to GetBlobContent: %v" , err )
} else {
2023-12-27 11:32:27 +03:00
// Pass URLPrefix to markdown render for the full link of media elements.
// The profile of default branch would be shown.
prefix := profileDbRepo . Link ( ) + "/src/branch/" + util . PathEscapeSegments ( profileDbRepo . DefaultBranch )
2023-11-09 17:05:52 +03:00
if profileContent , err := markdown . RenderString ( & markup . RenderContext {
2023-12-27 11:32:27 +03:00
Ctx : ctx ,
GitRepo : profileGitRepo ,
URLPrefix : prefix ,
Metas : map [ string ] string { "mode" : "document" } ,
2023-11-09 17:05:52 +03:00
} , bytes ) ; err != nil {
log . Error ( "failed to RenderString: %v" , err )
} else {
ctx . Data [ "ProfileReadme" ] = profileContent
}
}
}