diff options
author | zhsso <zhssoge@gmail.com> | 2014-04-10 14:20:58 -0400 |
---|---|---|
committer | zhsso <zhssoge@gmail.com> | 2014-04-10 14:20:58 -0400 |
commit | a4cbe79567072befd96cf1b7eb319de1e2809ca3 (patch) | |
tree | 3dff34e53f34632532fd7a05e00e6f06b3e7fb82 /models/action.go | |
parent | f3ed11d177d76bcb1850c6670c1516d25a66eb2c (diff) |
fix
Diffstat (limited to 'models/action.go')
-rw-r--r-- | models/action.go | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/models/action.go b/models/action.go new file mode 100644 index 00000000..a642a82c --- /dev/null +++ b/models/action.go @@ -0,0 +1,135 @@ +// 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 models + +import ( + "encoding/json" + "time" + + "github.com/gogits/gogs/modules/base" + "github.com/gogits/gogs/modules/log" +) + +// Operation types of user action. +const ( + OP_CREATE_REPO = iota + 1 + OP_DELETE_REPO + OP_STAR_REPO + OP_FOLLOW_REPO + OP_COMMIT_REPO + OP_CREATE_ISSUE + OP_PULL_REQUEST + OP_TRANSFER_REPO +) + +// Action represents user operation type and other information to repository., +// it implemented interface base.Actioner so that can be used in template render. +type Action struct { + Id int64 + UserId int64 // Receiver user id. + OpType int // Operations: CREATE DELETE STAR ... + ActUserId int64 // Action user id. + ActUserName string // Action user name. + ActEmail string + RepoId int64 + RepoName string + RefName string + Content string `xorm:"TEXT"` + Created time.Time `xorm:"created"` +} + +func (a Action) GetOpType() int { + return a.OpType +} + +func (a Action) GetActUserName() string { + return a.ActUserName +} + +func (a Action) GetActEmail() string { + return a.ActEmail +} + +func (a Action) GetRepoName() string { + return a.RepoName +} + +func (a Action) GetBranch() string { + return a.RefName +} + +func (a Action) GetContent() string { + return a.Content +} + +// CommitRepoAction adds new action for committing repository. +func CommitRepoAction(userId int64, userName, actEmail string, + repoId int64, repoName string, refName string, commit *base.PushCommits) error { + log.Trace("action.CommitRepoAction(start): %d/%s", userId, repoName) + + bs, err := json.Marshal(commit) + if err != nil { + log.Error("action.CommitRepoAction(json): %d/%s", userId, repoName) + return err + } + + if err = NotifyWatchers(&Action{ActUserId: userId, ActUserName: userName, ActEmail: actEmail, + OpType: OP_COMMIT_REPO, Content: string(bs), RepoId: repoId, RepoName: repoName, RefName: refName}); err != nil { + log.Error("action.CommitRepoAction(notify watchers): %d/%s", userId, repoName) + return err + } + + // Change repository bare status and update last updated time. + repo, err := GetRepositoryByName(userId, repoName) + if err != nil { + log.Error("action.CommitRepoAction(GetRepositoryByName): %d/%s", userId, repoName) + return err + } + repo.IsBare = false + if err = UpdateRepository(repo); err != nil { + log.Error("action.CommitRepoAction(UpdateRepository): %d/%s", userId, repoName) + return err + } + + log.Trace("action.CommitRepoAction(end): %d/%s", userId, repoName) + return nil +} + +// NewRepoAction adds new action for creating repository. +func NewRepoAction(user *User, repo *Repository) (err error) { + if err = NotifyWatchers(&Action{ActUserId: user.Id, ActUserName: user.Name, ActEmail: user.Email, + OpType: OP_CREATE_REPO, RepoId: repo.Id, RepoName: repo.Name}); err != nil { + log.Error("action.NewRepoAction(notify watchers): %d/%s", user.Id, repo.Name) + return err + } + + log.Trace("action.NewRepoAction: %s/%s", user.LowerName, repo.LowerName) + return err +} + +// TransferRepoAction adds new action for transfering repository. +func TransferRepoAction(user, newUser *User, repo *Repository) (err error) { + if err = NotifyWatchers(&Action{ActUserId: user.Id, ActUserName: user.Name, ActEmail: user.Email, + OpType: OP_TRANSFER_REPO, RepoId: repo.Id, RepoName: repo.Name, Content: newUser.Name}); err != nil { + log.Error("action.TransferRepoAction(notify watchers): %d/%s", user.Id, repo.Name) + return err + } + + log.Trace("action.TransferRepoAction: %s/%s", user.LowerName, repo.LowerName) + return err +} + +// GetFeeds returns action list of given user in given context. +func GetFeeds(userid, offset int64, isProfile bool) ([]Action, error) { + actions := make([]Action, 0, 20) + sess := orm.Limit(20, int(offset)).Desc("id").Where("user_id=?", userid) + if isProfile { + sess.And("act_user_id=?", userid) + } else { + sess.And("act_user_id!=?", userid) + } + err := sess.Find(&actions) + return actions, err +} |