2015-12-21 15:24:11 +03:00
// Copyright 2015 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package user
import (
"fmt"
2015-12-25 13:25:47 +03:00
"path"
2015-12-21 15:24:11 +03:00
"strings"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/modules/setting"
"github.com/gogits/gogs/routers/repo"
)
const (
FOLLOWERS base . TplName = "user/meta/followers"
STARS base . TplName = "user/meta/stars"
)
2016-01-09 08:28:05 +03:00
func GetUserByName ( ctx * middleware . Context , name string ) * models . User {
user , err := models . GetUserByName ( name )
2015-12-21 15:24:11 +03:00
if err != nil {
if models . IsErrUserNotExist ( err ) {
2016-01-31 21:33:36 +03:00
ctx . Handle ( 404 , "GetUserByName" , nil )
2015-12-21 15:24:11 +03:00
} else {
ctx . Handle ( 500 , "GetUserByName" , err )
}
return nil
}
return user
}
2016-01-09 08:28:05 +03:00
// GetUserByParams returns user whose name is presented in URL paramenter.
func GetUserByParams ( ctx * middleware . Context ) * models . User {
return GetUserByName ( ctx , ctx . Params ( ":username" ) )
}
2015-12-21 15:24:11 +03:00
func Profile ( ctx * middleware . Context ) {
uname := ctx . Params ( ":username" )
// Special handle for FireFox requests favicon.ico.
if uname == "favicon.ico" {
2015-12-25 13:25:47 +03:00
ctx . ServeFile ( path . Join ( setting . StaticRootPath , "public/img/favicon.png" ) )
2015-12-21 15:24:11 +03:00
return
} else if strings . HasSuffix ( uname , ".png" ) {
ctx . Error ( 404 )
return
}
isShowKeys := false
if strings . HasSuffix ( uname , ".keys" ) {
isShowKeys = true
}
2016-01-09 08:28:05 +03:00
u := GetUserByName ( ctx , strings . TrimSuffix ( uname , ".keys" ) )
2015-12-21 15:24:11 +03:00
if ctx . Written ( ) {
return
}
// Show SSH keys.
if isShowKeys {
ShowSSHKeys ( ctx , u . Id )
return
}
if u . IsOrganization ( ) {
showOrgProfile ( ctx )
return
}
ctx . Data [ "Title" ] = u . DisplayName ( )
ctx . Data [ "PageIsUserProfile" ] = true
ctx . Data [ "Owner" ] = u
2016-01-31 00:51:11 +03:00
2016-02-20 02:10:03 +03:00
orgs , err := models . GetOrgsByUserID ( u . Id , ctx . IsSigned && ( ctx . User . IsAdmin || ctx . User . Id == u . Id ) )
2016-01-12 05:09:59 +03:00
if err != nil {
2016-02-07 12:20:58 +03:00
ctx . Handle ( 500 , "GetOrgsByUserIDDesc" , err )
2016-01-12 05:09:59 +03:00
return
}
2016-02-07 12:20:58 +03:00
2016-01-12 05:09:59 +03:00
ctx . Data [ "Orgs" ] = orgs
2015-12-21 15:24:11 +03:00
tab := ctx . Query ( "tab" )
ctx . Data [ "TabName" ] = tab
switch tab {
case "activity" :
2016-02-15 04:07:42 +03:00
retrieveFeeds ( ctx , u . Id , - 1 , 0 , true )
2015-12-21 15:24:11 +03:00
if ctx . Written ( ) {
return
}
default :
var err error
ctx . Data [ "Repos" ] , err = models . GetRepositories ( u . Id , ctx . IsSigned && ctx . User . Id == u . Id )
if err != nil {
ctx . Handle ( 500 , "GetRepositories" , err )
return
}
}
ctx . HTML ( 200 , PROFILE )
}
func Followers ( ctx * middleware . Context ) {
u := GetUserByParams ( ctx )
if ctx . Written ( ) {
return
}
ctx . Data [ "Title" ] = u . DisplayName ( )
ctx . Data [ "CardsTitle" ] = ctx . Tr ( "user.followers" )
ctx . Data [ "PageIsFollowers" ] = true
ctx . Data [ "Owner" ] = u
repo . RenderUserCards ( ctx , u . NumFollowers , u . GetFollowers , FOLLOWERS )
}
func Following ( ctx * middleware . Context ) {
u := GetUserByParams ( ctx )
if ctx . Written ( ) {
return
}
ctx . Data [ "Title" ] = u . DisplayName ( )
ctx . Data [ "CardsTitle" ] = ctx . Tr ( "user.following" )
ctx . Data [ "PageIsFollowing" ] = true
ctx . Data [ "Owner" ] = u
repo . RenderUserCards ( ctx , u . NumFollowing , u . GetFollowing , FOLLOWERS )
}
func Stars ( ctx * middleware . Context ) {
}
func Action ( ctx * middleware . Context ) {
u := GetUserByParams ( ctx )
if ctx . Written ( ) {
return
}
var err error
switch ctx . Params ( ":action" ) {
case "follow" :
err = models . FollowUser ( ctx . User . Id , u . Id )
case "unfollow" :
err = models . UnfollowUser ( ctx . User . Id , u . Id )
}
if err != nil {
ctx . Handle ( 500 , fmt . Sprintf ( "Action (%s)" , ctx . Params ( ":action" ) ) , err )
return
}
redirectTo := ctx . Query ( "redirect_to" )
if len ( redirectTo ) == 0 {
redirectTo = u . HomeLink ( )
}
ctx . Redirect ( redirectTo )
}