Show private repository activities in dashboard if has access
This commit is contained in:
parent
a742ee543e
commit
914ffa496f
6 changed files with 54 additions and 13 deletions
|
@ -60,6 +60,9 @@ func UpdateAccessWithSession(sess *xorm.Session, access *Access) error {
|
||||||
// HasAccess returns true if someone can read or write to given repository.
|
// HasAccess returns true if someone can read or write to given repository.
|
||||||
// The repoName should be in format <username>/<reponame>.
|
// The repoName should be in format <username>/<reponame>.
|
||||||
func HasAccess(uname, repoName string, mode int) (bool, error) {
|
func HasAccess(uname, repoName string, mode int) (bool, error) {
|
||||||
|
if len(repoName) == 0 {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
access := &Access{
|
access := &Access{
|
||||||
UserName: strings.ToLower(uname),
|
UserName: strings.ToLower(uname),
|
||||||
RepoName: strings.ToLower(repoName),
|
RepoName: strings.ToLower(repoName),
|
||||||
|
|
|
@ -198,8 +198,8 @@ func TransferRepoAction(user, newUser *User, repo *Repository) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetFeeds returns action list of given user in given context.
|
// GetFeeds returns action list of given user in given context.
|
||||||
func GetFeeds(userid, offset int64, isProfile bool) ([]Action, error) {
|
func GetFeeds(userid, offset int64, isProfile bool) ([]*Action, error) {
|
||||||
actions := make([]Action, 0, 20)
|
actions := make([]*Action, 0, 20)
|
||||||
sess := orm.Limit(20, int(offset)).Desc("id").Where("user_id=?", userid)
|
sess := orm.Limit(20, int(offset)).Desc("id").Where("user_id=?", userid)
|
||||||
if isProfile {
|
if isProfile {
|
||||||
sess.Where("is_private=?", false).And("act_user_id=?", userid)
|
sess.Where("is_private=?", false).And("act_user_id=?", userid)
|
||||||
|
|
|
@ -50,7 +50,7 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler {
|
||||||
|
|
||||||
// Collaborators who have write access can be seen as owners.
|
// Collaborators who have write access can be seen as owners.
|
||||||
if ctx.IsSigned {
|
if ctx.IsSigned {
|
||||||
ctx.Repo.IsOwner, err = models.HasAccess(ctx.User.Name, repoName, models.AU_WRITABLE)
|
ctx.Repo.IsOwner, err = models.HasAccess(ctx.User.Name, userName+"/"+repoName, models.AU_WRITABLE)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Handle(500, "RepoAssignment(HasAccess)", err)
|
ctx.Handle(500, "RepoAssignment(HasAccess)", err)
|
||||||
return
|
return
|
||||||
|
@ -100,7 +100,7 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check access.
|
// Check access.
|
||||||
if repo.IsPrivate {
|
if repo.IsPrivate && !ctx.Repo.IsOwner {
|
||||||
if ctx.User == nil {
|
if ctx.User == nil {
|
||||||
ctx.Handle(404, "RepoAssignment(HasAccess)", nil)
|
ctx.Handle(404, "RepoAssignment(HasAccess)", nil)
|
||||||
return
|
return
|
||||||
|
|
10
modules/workers/worker.go
Normal file
10
modules/workers/worker.go
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
// Copyright 2014 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 workers
|
||||||
|
|
||||||
|
// Work represents a background work interface of any kind.
|
||||||
|
type Work interface {
|
||||||
|
Do() error
|
||||||
|
}
|
|
@ -178,10 +178,20 @@ func CreateIssuePost(ctx *middleware.Context, params martini.Params, form auth.C
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
act := &models.Action{
|
||||||
|
ActUserId: ctx.User.Id,
|
||||||
|
ActUserName: ctx.User.Name,
|
||||||
|
ActEmail: ctx.User.Email,
|
||||||
|
OpType: models.OP_CREATE_ISSUE,
|
||||||
|
Content: fmt.Sprintf("%d|%s", issue.Index, issue.Name),
|
||||||
|
RepoId: ctx.Repo.Repository.Id,
|
||||||
|
RepoUserName: ctx.Repo.Owner.Name,
|
||||||
|
RepoName: ctx.Repo.Repository.Name,
|
||||||
|
RefName: ctx.Repo.BranchName,
|
||||||
|
IsPrivate: ctx.Repo.Repository.IsPrivate,
|
||||||
|
}
|
||||||
// Notify watchers.
|
// Notify watchers.
|
||||||
if err := models.NotifyWatchers(&models.Action{ActUserId: ctx.User.Id, ActUserName: ctx.User.Name, ActEmail: ctx.User.Email,
|
if err := models.NotifyWatchers(act); err != nil {
|
||||||
OpType: models.OP_CREATE_ISSUE, Content: fmt.Sprintf("%d|%s", issue.Index, issue.Name),
|
|
||||||
RepoId: ctx.Repo.Repository.Id, RepoName: ctx.Repo.Repository.Name, RefName: ""}); err != nil {
|
|
||||||
ctx.Handle(500, "issue.CreateIssue(NotifyWatchers)", err)
|
ctx.Handle(500, "issue.CreateIssue(NotifyWatchers)", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,11 +27,23 @@ func Dashboard(ctx *middleware.Context) {
|
||||||
}
|
}
|
||||||
ctx.Data["MyRepos"] = repos
|
ctx.Data["MyRepos"] = repos
|
||||||
|
|
||||||
feeds, err := models.GetFeeds(ctx.User.Id, 0, false)
|
actions, err := models.GetFeeds(ctx.User.Id, 0, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Handle(500, "user.Dashboard", err)
|
ctx.Handle(500, "user.Dashboard", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
feeds := make([]*models.Action, 0, len(actions))
|
||||||
|
for _, act := range actions {
|
||||||
|
if act.IsPrivate {
|
||||||
|
if has, _ := models.HasAccess(ctx.User.Name, act.RepoUserName+"/"+act.RepoName,
|
||||||
|
models.AU_READABLE); !has {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
feeds = append(feeds, act)
|
||||||
|
}
|
||||||
|
|
||||||
ctx.Data["Feeds"] = feeds
|
ctx.Data["Feeds"] = feeds
|
||||||
ctx.HTML(200, "user/dashboard")
|
ctx.HTML(200, "user/dashboard")
|
||||||
}
|
}
|
||||||
|
@ -39,7 +51,6 @@ func Dashboard(ctx *middleware.Context) {
|
||||||
func Profile(ctx *middleware.Context, params martini.Params) {
|
func Profile(ctx *middleware.Context, params martini.Params) {
|
||||||
ctx.Data["Title"] = "Profile"
|
ctx.Data["Title"] = "Profile"
|
||||||
|
|
||||||
// TODO: Need to check view self or others.
|
|
||||||
user, err := models.GetUserByName(params["username"])
|
user, err := models.GetUserByName(params["username"])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Handle(500, "user.Profile", err)
|
ctx.Handle(500, "user.Profile", err)
|
||||||
|
@ -95,12 +106,19 @@ func Feeds(ctx *middleware.Context, form auth.FeedsForm) {
|
||||||
actions, err := models.GetFeeds(form.UserId, form.Page*20, false)
|
actions, err := models.GetFeeds(form.UserId, form.Page*20, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.JSON(500, err)
|
ctx.JSON(500, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
feeds := make([]string, len(actions))
|
feeds := make([]string, 0, len(actions))
|
||||||
for i := range actions {
|
for _, act := range actions {
|
||||||
feeds[i] = fmt.Sprintf(TPL_FEED, base.ActionIcon(actions[i].OpType),
|
if act.IsPrivate {
|
||||||
base.TimeSince(actions[i].Created), base.ActionDesc(actions[i]))
|
if has, _ := models.HasAccess(ctx.User.Name, act.RepoUserName+"/"+act.RepoName,
|
||||||
|
models.AU_READABLE); !has {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
feeds = append(feeds, fmt.Sprintf(TPL_FEED, base.ActionIcon(act.OpType),
|
||||||
|
base.TimeSince(act.Created), base.ActionDesc(act)))
|
||||||
}
|
}
|
||||||
ctx.JSON(200, &feeds)
|
ctx.JSON(200, &feeds)
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue