diff options
author | Unknwon <u@gogs.io> | 2015-12-21 04:24:11 -0800 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2015-12-21 04:24:11 -0800 |
commit | a49af93fafe824cdd375318d15de420b3ed61e79 (patch) | |
tree | 1508c0bbd9f9caf2c3af8163e4e9abe326093558 /routers | |
parent | c62a6b7a1238524225ec9c214dc5eac7da017663 (diff) | |
download | gitea-a49af93fafe824cdd375318d15de420b3ed61e79.tar.gz gitea-a49af93fafe824cdd375318d15de420b3ed61e79.zip |
#1692 APIs: Users Followers
- User profile un/follow
- List user's followers/following
Diffstat (limited to 'routers')
-rw-r--r-- | routers/api/v1/api.go | 19 | ||||
-rw-r--r-- | routers/api/v1/user/followers.go | 121 | ||||
-rw-r--r-- | routers/repo/repo.go | 6 | ||||
-rw-r--r-- | routers/repo/view.go | 12 | ||||
-rw-r--r-- | routers/user/home.go | 63 | ||||
-rw-r--r-- | routers/user/profile.go | 145 |
6 files changed, 290 insertions, 76 deletions
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index cc169f708d..e1a23f0d40 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -135,19 +135,32 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/users", func() { m.Group("/:username", func() { m.Get("/keys", user.ListPublicKeys) + + m.Get("/followers", user.ListFollowers) + m.Group("/following", func() { + m.Get("", user.ListFollowing) + m.Get("/:target", user.CheckFollowing) + }) }) }, ReqToken()) m.Group("/user", func() { + m.Combo("/emails").Get(user.ListEmails). + Post(bind(api.CreateEmailOption{}), user.AddEmail). + Delete(bind(api.CreateEmailOption{}), user.DeleteEmail) + + m.Get("/followers", user.ListMyFollowers) + m.Group("/following", func() { + m.Get("", user.ListMyFollowing) + m.Combo("/:username").Get(user.CheckMyFollowing).Put(user.Follow).Delete(user.Unfollow) + }) + m.Group("/keys", func() { m.Combo("").Get(user.ListMyPublicKeys). Post(bind(api.CreateKeyOption{}), user.CreatePublicKey) m.Combo("/:id").Get(user.GetPublicKey). Delete(user.DeletePublicKey) }) - m.Combo("/emails").Get(user.ListEmails). - Post(bind(api.CreateEmailOption{}), user.AddEmail). - Delete(bind(api.CreateEmailOption{}), user.DeleteEmail) }, ReqToken()) // Repositories diff --git a/routers/api/v1/user/followers.go b/routers/api/v1/user/followers.go new file mode 100644 index 0000000000..0a28979647 --- /dev/null +++ b/routers/api/v1/user/followers.go @@ -0,0 +1,121 @@ +// 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 ( + api "github.com/gogits/go-gogs-client" + + "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/middleware" + "github.com/gogits/gogs/routers/api/v1/convert" +) + +func responseApiUsers(ctx *middleware.Context, users []*models.User) { + apiUsers := make([]*api.User, len(users)) + for i := range users { + apiUsers[i] = convert.ToApiUser(users[i]) + } + ctx.JSON(200, &apiUsers) +} + +func listUserFollowers(ctx *middleware.Context, u *models.User) { + users, err := u.GetFollowers(ctx.QueryInt("page")) + if err != nil { + ctx.APIError(500, "GetUserFollowers", err) + return + } + responseApiUsers(ctx, users) +} + +func ListMyFollowers(ctx *middleware.Context) { + listUserFollowers(ctx, ctx.User) +} + +// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#list-followers-of-a-user +func ListFollowers(ctx *middleware.Context) { + u := GetUserByParams(ctx) + if ctx.Written() { + return + } + listUserFollowers(ctx, u) +} + +func listUserFollowing(ctx *middleware.Context, u *models.User) { + users, err := u.GetFollowing(ctx.QueryInt("page")) + if err != nil { + ctx.APIError(500, "GetFollowing", err) + return + } + responseApiUsers(ctx, users) +} + +func ListMyFollowing(ctx *middleware.Context) { + listUserFollowing(ctx, ctx.User) +} + +// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#list-users-followed-by-another-user +func ListFollowing(ctx *middleware.Context) { + u := GetUserByParams(ctx) + if ctx.Written() { + return + } + listUserFollowing(ctx, u) +} + +func checkUserFollowing(ctx *middleware.Context, u *models.User, followID int64) { + if u.IsFollowing(followID) { + ctx.Status(204) + } else { + ctx.Error(404) + } +} + +// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#check-if-you-are-following-a-user +func CheckMyFollowing(ctx *middleware.Context) { + target := GetUserByParams(ctx) + if ctx.Written() { + return + } + checkUserFollowing(ctx, ctx.User, target.Id) +} + +// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#check-if-one-user-follows-another +func CheckFollowing(ctx *middleware.Context) { + u := GetUserByParams(ctx) + if ctx.Written() { + return + } + target := GetUserByParamsName(ctx, ":target") + if ctx.Written() { + return + } + checkUserFollowing(ctx, u, target.Id) +} + +// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#follow-a-user +func Follow(ctx *middleware.Context) { + target := GetUserByParams(ctx) + if ctx.Written() { + return + } + if err := models.FollowUser(ctx.User.Id, target.Id); err != nil { + ctx.APIError(500, "FollowUser", err) + return + } + ctx.Status(204) +} + +// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#unfollow-a-user +func Unfollow(ctx *middleware.Context) { + target := GetUserByParams(ctx) + if ctx.Written() { + return + } + if err := models.UnfollowUser(ctx.User.Id, target.Id); err != nil { + ctx.APIError(500, "UnfollowUser", err) + return + } + ctx.Status(204) +} diff --git a/routers/repo/repo.go b/routers/repo/repo.go index c58d256a72..2879599744 100644 --- a/routers/repo/repo.go +++ b/routers/repo/repo.go @@ -244,11 +244,7 @@ func Action(ctx *middleware.Context) { } if err != nil { - log.Error(4, "Action(%s): %v", ctx.Params(":action"), err) - ctx.JSON(200, map[string]interface{}{ - "ok": false, - "err": err.Error(), - }) + ctx.Handle(500, fmt.Sprintf("Action (%s)", ctx.Params(":action")), err) return } diff --git a/routers/repo/view.go b/routers/repo/view.go index 191f123454..25e312b1c1 100644 --- a/routers/repo/view.go +++ b/routers/repo/view.go @@ -217,7 +217,7 @@ func Home(ctx *middleware.Context) { ctx.HTML(200, HOME) } -func renderItems(ctx *middleware.Context, total int, getter func(page int) ([]*models.User, error)) { +func RenderUserCards(ctx *middleware.Context, total int, getter func(page int) ([]*models.User, error), tpl base.TplName) { page := ctx.QueryInt("page") if page <= 0 { page = 1 @@ -230,21 +230,23 @@ func renderItems(ctx *middleware.Context, total int, getter func(page int) ([]*m ctx.Handle(500, "getter", err) return } - ctx.Data["Watchers"] = items + ctx.Data["Cards"] = items - ctx.HTML(200, WATCHERS) + ctx.HTML(200, tpl) } func Watchers(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("repo.watchers") + ctx.Data["CardsTitle"] = ctx.Tr("repo.watchers") ctx.Data["PageIsWatchers"] = true - renderItems(ctx, ctx.Repo.Repository.NumWatches, ctx.Repo.Repository.GetWatchers) + RenderUserCards(ctx, ctx.Repo.Repository.NumWatches, ctx.Repo.Repository.GetWatchers, WATCHERS) } func Stars(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("repo.stargazers") + ctx.Data["CardsTitle"] = ctx.Tr("repo.stargazers") ctx.Data["PageIsStargazers"] = true - renderItems(ctx, ctx.Repo.Repository.NumStars, ctx.Repo.Repository.GetStargazers) + RenderUserCards(ctx, ctx.Repo.Repository.NumStars, ctx.Repo.Repository.GetStargazers, WATCHERS) } func Forks(ctx *middleware.Context) { diff --git a/routers/user/home.go b/routers/user/home.go index bf97c92398..b5df5e3679 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -7,7 +7,6 @@ package user import ( "bytes" "fmt" - "strings" "github.com/Unknwon/com" "github.com/Unknwon/paginater" @@ -21,7 +20,6 @@ import ( const ( DASHBOARD base.TplName = "user/dashboard/dashboard" ISSUES base.TplName = "user/dashboard/issues" - STARS base.TplName = "user/stars" PROFILE base.TplName = "user/profile" ORG_HOME base.TplName = "org/home" ) @@ -338,67 +336,6 @@ func showOrgProfile(ctx *middleware.Context) { ctx.HTML(200, ORG_HOME) } -func Profile(ctx *middleware.Context) { - ctx.Data["Title"] = "Profile" - ctx.Data["PageIsUserProfile"] = true - - uname := ctx.Params(":username") - // Special handle for FireFox requests favicon.ico. - if uname == "favicon.ico" { - ctx.Redirect(setting.AppSubUrl + "/img/favicon.png") - return - } else if strings.HasSuffix(uname, ".png") { - ctx.Error(404) - return - } - - isShowKeys := false - if strings.HasSuffix(uname, ".keys") { - isShowKeys = true - uname = strings.TrimSuffix(uname, ".keys") - } - - u, err := models.GetUserByName(uname) - if err != nil { - if models.IsErrUserNotExist(err) { - ctx.Handle(404, "GetUserByName", err) - } else { - ctx.Handle(500, "GetUserByName", err) - } - return - } - - // Show SSH keys. - if isShowKeys { - ShowSSHKeys(ctx, u.Id) - return - } - - if u.IsOrganization() { - showOrgProfile(ctx) - return - } - ctx.Data["Owner"] = u - - tab := ctx.Query("tab") - ctx.Data["TabName"] = tab - switch tab { - case "activity": - retrieveFeeds(ctx, u.Id, 0, true) - if ctx.Written() { - return - } - default: - 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 Email2User(ctx *middleware.Context) { u, err := models.GetUserByEmail(ctx.Query("email")) if err != nil { diff --git a/routers/user/profile.go b/routers/user/profile.go new file mode 100644 index 0000000000..b531523e65 --- /dev/null +++ b/routers/user/profile.go @@ -0,0 +1,145 @@ +// 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" + "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" +) + +// GetUserByParams returns user whose name is presented in URL paramenter. +func GetUserByParams(ctx *middleware.Context) *models.User { + user, err := models.GetUserByName(ctx.Params(":username")) + if err != nil { + if models.IsErrUserNotExist(err) { + ctx.Error(404) + } else { + ctx.Handle(500, "GetUserByName", err) + } + return nil + } + return user +} + +func Profile(ctx *middleware.Context) { + uname := ctx.Params(":username") + // Special handle for FireFox requests favicon.ico. + if uname == "favicon.ico" { + ctx.Redirect(setting.AppSubUrl + "/img/favicon.png") + return + } else if strings.HasSuffix(uname, ".png") { + ctx.Error(404) + return + } + + isShowKeys := false + if strings.HasSuffix(uname, ".keys") { + isShowKeys = true + } + + u := GetUserByParams(ctx) + 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 + + tab := ctx.Query("tab") + ctx.Data["TabName"] = tab + switch tab { + case "activity": + retrieveFeeds(ctx, u.Id, 0, true) + 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) +} |