|
- // Copyright 2019 The Gitea 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 action
-
- import (
- "code.gitea.io/gitea/modules/auth"
- "encoding/json"
- "fmt"
- "path"
- "strings"
-
- "code.gitea.io/gitea/models"
- "code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/notification/base"
- "code.gitea.io/gitea/modules/repository"
- )
-
- type actionNotifier struct {
- base.NullNotifier
- }
-
- var (
- _ base.Notifier = &actionNotifier{}
- )
-
- // NewNotifier create a new actionNotifier notifier
- func NewNotifier() base.Notifier {
- return &actionNotifier{}
- }
-
- func (a *actionNotifier) NotifyNewIssue(issue *models.Issue) {
- if err := issue.LoadPoster(); err != nil {
- log.Error("issue.LoadPoster: %v", err)
- return
- }
- if err := issue.LoadRepo(); err != nil {
- log.Error("issue.LoadRepo: %v", err)
- return
- }
- repo := issue.Repo
-
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: issue.Poster.ID,
- ActUser: issue.Poster,
- OpType: models.ActionCreateIssue,
- Content: fmt.Sprintf("%d|%s", issue.Index, issue.Title),
- RepoID: repo.ID,
- Repo: repo,
- IsPrivate: repo.IsPrivate,
- }); err != nil {
- log.Error("NotifyWatchers: %v", err)
- }
- }
-
- // NotifyIssueChangeStatus notifies close or reopen issue to notifiers
- func (a *actionNotifier) NotifyIssueChangeStatus(doer *models.User, issue *models.Issue, actionComment *models.Comment, closeOrReopen bool) {
- // Compose comment action, could be plain comment, close or reopen issue/pull request.
- // This object will be used to notify watchers in the end of function.
- act := &models.Action{
- ActUserID: doer.ID,
- ActUser: doer,
- Content: fmt.Sprintf("%d|%s", issue.Index, ""),
- RepoID: issue.Repo.ID,
- Repo: issue.Repo,
- Comment: actionComment,
- CommentID: actionComment.ID,
- IsPrivate: issue.Repo.IsPrivate,
- }
- // Check comment type.
- if closeOrReopen {
- act.OpType = models.ActionCloseIssue
- if issue.IsPull {
- act.OpType = models.ActionClosePullRequest
- }
- } else {
- act.OpType = models.ActionReopenIssue
- if issue.IsPull {
- act.OpType = models.ActionReopenPullRequest
- }
- }
-
- // Notify watchers for whatever action comes in, ignore if no action type.
- if err := models.NotifyWatchers(act); err != nil {
- log.Error("NotifyWatchers: %v", err)
- }
- }
-
- // NotifyCreateIssueComment notifies comment on an issue to notifiers
- func (a *actionNotifier) NotifyCreateIssueComment(doer *models.User, repo *models.Repository,
- issue *models.Issue, comment *models.Comment) {
- act := &models.Action{
- ActUserID: doer.ID,
- ActUser: doer,
- Content: fmt.Sprintf("%d|%s", issue.Index, comment.Content),
- RepoID: issue.Repo.ID,
- Repo: issue.Repo,
- Comment: comment,
- CommentID: comment.ID,
- IsPrivate: issue.Repo.IsPrivate,
- }
- if issue.IsPull {
- act.OpType = models.ActionCommentPull
- } else {
- act.OpType = models.ActionCommentIssue
- }
-
- // Notify watchers for whatever action comes in, ignore if no action type.
- if err := models.NotifyWatchers(act); err != nil {
- log.Error("NotifyWatchers: %v", err)
- }
- }
-
- func (a *actionNotifier) NotifyNewPullRequest(pull *models.PullRequest) {
- if err := pull.LoadIssue(); err != nil {
- log.Error("pull.LoadIssue: %v", err)
- return
- }
- if err := pull.Issue.LoadRepo(); err != nil {
- log.Error("pull.Issue.LoadRepo: %v", err)
- return
- }
- if err := pull.Issue.LoadPoster(); err != nil {
- log.Error("pull.Issue.LoadPoster: %v", err)
- return
- }
-
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: pull.Issue.Poster.ID,
- ActUser: pull.Issue.Poster,
- OpType: models.ActionCreatePullRequest,
- Content: fmt.Sprintf("%d|%s", pull.Issue.Index, pull.Issue.Title),
- RepoID: pull.Issue.Repo.ID,
- Repo: pull.Issue.Repo,
- IsPrivate: pull.Issue.Repo.IsPrivate,
- }); err != nil {
- log.Error("NotifyWatchers: %v", err)
- }
- }
-
- func (a *actionNotifier) NotifyRenameRepository(doer *models.User, repo *models.Repository, oldRepoName string) {
- log.Trace("action.ChangeRepositoryName: %s/%s", doer.Name, repo.Name)
-
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: doer.ID,
- ActUser: doer,
- OpType: models.ActionRenameRepo,
- RepoID: repo.ID,
- Repo: repo,
- IsPrivate: repo.IsPrivate,
- Content: oldRepoName,
- }); err != nil {
- log.Error("NotifyWatchers: %v", err)
- }
- }
-
- func (a *actionNotifier) NotifyAliasRepository(doer *models.User, repo *models.Repository, oldAlias string) {
- log.Trace("action.ChangeRepositoryAlias: %s/%s", doer.Name, repo.Alias)
-
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: doer.ID,
- ActUser: doer,
- OpType: models.ActionRenameRepo,
- RepoID: repo.ID,
- Repo: repo,
- IsPrivate: repo.IsPrivate,
- Content: oldAlias,
- }); err != nil {
- log.Error("NotifyWatchers: %v", err)
- }
- }
-
- func (a *actionNotifier) NotifyTransferRepository(doer *models.User, repo *models.Repository, oldOwnerName string) {
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: doer.ID,
- ActUser: doer,
- OpType: models.ActionTransferRepo,
- RepoID: repo.ID,
- Repo: repo,
- IsPrivate: repo.IsPrivate,
- Content: path.Join(oldOwnerName, repo.Name),
- }); err != nil {
- log.Error("NotifyWatchers: %v", err)
- }
- }
-
- func (a *actionNotifier) NotifyCreateRepository(doer *models.User, u *models.User, repo *models.Repository) {
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: doer.ID,
- ActUser: doer,
- OpType: models.ActionCreateRepo,
- RepoID: repo.ID,
- Repo: repo,
- IsPrivate: repo.IsPrivate,
- }); err != nil {
- log.Error("notify watchers '%d/%d': %v", doer.ID, repo.ID, err)
- }
- }
-
- func (a *actionNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) {
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: doer.ID,
- ActUser: doer,
- OpType: models.ActionCreateRepo,
- RepoID: repo.ID,
- Repo: repo,
- IsPrivate: repo.IsPrivate,
- }); err != nil {
- log.Error("notify watchers '%d/%d': %v", doer.ID, repo.ID, err)
- }
- }
-
- func (a *actionNotifier) NotifyPullRequestReview(pr *models.PullRequest, review *models.Review, comment *models.Comment) {
- if err := review.LoadReviewer(); err != nil {
- log.Error("LoadReviewer '%d/%d': %v", review.ID, review.ReviewerID, err)
- return
- }
- if err := review.LoadCodeComments(); err != nil {
- log.Error("LoadCodeComments '%d/%d': %v", review.Reviewer.ID, review.ID, err)
- return
- }
-
- var actions = make([]*models.Action, 0, 10)
- for _, lines := range review.CodeComments {
- for _, comments := range lines {
- for _, comm := range comments {
- actions = append(actions, &models.Action{
- ActUserID: review.Reviewer.ID,
- ActUser: review.Reviewer,
- Content: fmt.Sprintf("%d|%s", review.Issue.Index, strings.Split(comm.Content, "\n")[0]),
- OpType: models.ActionCommentPull,
- RepoID: review.Issue.RepoID,
- Repo: review.Issue.Repo,
- IsPrivate: review.Issue.Repo.IsPrivate,
- Comment: comm,
- CommentID: comm.ID,
- })
- }
- }
- }
-
- if review.Type != models.ReviewTypeComment || strings.TrimSpace(comment.Content) != "" {
- action := &models.Action{
- ActUserID: review.Reviewer.ID,
- ActUser: review.Reviewer,
- Content: fmt.Sprintf("%d|%s", review.Issue.Index, strings.Split(comment.Content, "\n")[0]),
- RepoID: review.Issue.RepoID,
- Repo: review.Issue.Repo,
- IsPrivate: review.Issue.Repo.IsPrivate,
- Comment: comment,
- CommentID: comment.ID,
- }
-
- switch review.Type {
- case models.ReviewTypeApprove:
- action.OpType = models.ActionApprovePullRequest
- case models.ReviewTypeReject:
- action.OpType = models.ActionRejectPullRequest
- default:
- action.OpType = models.ActionCommentPull
- }
-
- actions = append(actions, action)
- }
-
- if err := models.NotifyWatchersActions(actions); err != nil {
- log.Error("notify watchers '%d/%d': %v", review.Reviewer.ID, review.Issue.RepoID, err)
- }
- }
-
- func (*actionNotifier) NotifyMergePullRequest(pr *models.PullRequest, doer *models.User) {
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: doer.ID,
- ActUser: doer,
- OpType: models.ActionMergePullRequest,
- Content: fmt.Sprintf("%d|%s", pr.Issue.Index, pr.Issue.Title),
- RepoID: pr.Issue.Repo.ID,
- Repo: pr.Issue.Repo,
- IsPrivate: pr.Issue.Repo.IsPrivate,
- }); err != nil {
- log.Error("NotifyWatchers [%d]: %v", pr.ID, err)
- }
- }
-
- func (a *actionNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) {
- data, err := json.Marshal(commits)
- if err != nil {
- log.Error("json.Marshal: %v", err)
- return
- }
-
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: repo.OwnerID,
- ActUser: repo.MustOwner(),
- OpType: models.ActionMirrorSyncPush,
- RepoID: repo.ID,
- Repo: repo,
- IsPrivate: repo.IsPrivate,
- RefName: refName,
- Content: string(data),
- }); err != nil {
- log.Error("notifyWatchers: %v", err)
- }
- }
-
- func (a *actionNotifier) NotifySyncCreateRef(doer *models.User, repo *models.Repository, refType, refFullName string) {
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: repo.OwnerID,
- ActUser: repo.MustOwner(),
- OpType: models.ActionMirrorSyncCreate,
- RepoID: repo.ID,
- Repo: repo,
- IsPrivate: repo.IsPrivate,
- RefName: refFullName,
- }); err != nil {
- log.Error("notifyWatchers: %v", err)
- }
- }
-
- func (a *actionNotifier) NotifySyncDeleteRef(doer *models.User, repo *models.Repository, refType, refFullName string) {
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: repo.OwnerID,
- ActUser: repo.MustOwner(),
- OpType: models.ActionMirrorSyncCreate,
- RepoID: repo.ID,
- Repo: repo,
- IsPrivate: repo.IsPrivate,
- RefName: refFullName,
- }); err != nil {
- log.Error("notifyWatchers: %v", err)
- }
- }
-
- func (a *actionNotifier) NotifyOtherTask(doer *models.User, repo *models.Repository, id string, name string, optype models.ActionType) {
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: doer.ID,
- ActUser: doer,
- OpType: optype,
- RepoID: repo.ID,
- Repo: repo,
- IsPrivate: repo.IsPrivate,
- RefName: name,
- Content: id,
- }); err != nil {
- log.Error("notifyWatchers: %v", err)
- }
- }
-
- func (t *actionNotifier) NotifyWechatBind(user *models.User, wechatOpenId string) {
- act := &models.Action{
- ActUserID: user.ID,
- ActUser: user,
- OpType: models.ActionBindWechat,
- IsPrivate: true,
- Content: wechatOpenId,
- }
- if err := models.NotifyWatchers(act); err != nil {
- log.Error("notifyWatchers: %v", err)
- }
- }
-
- func (t *actionNotifier) NotifyDatasetRecommend(optUser *models.User, dataset *models.Dataset, action string) {
- switch action {
- case "recommend":
- act := &models.Action{
- OpType: models.ActionDatasetRecommended,
- ActUserID: dataset.UserID,
- RepoID: dataset.RepoID,
- IsPrivate: false,
- Content: fmt.Sprintf("%d|%s", dataset.ID, dataset.Title),
- }
-
- if err := models.NotifyWatchers(act); err != nil {
- log.Error("notifyWatchers: %v", err)
- }
- }
- }
-
- func (t *actionNotifier) NotifyCreateImage(doer *models.User, image models.Image) {
- act := &models.Action{
- ActUserID: doer.ID,
- ActUser: doer,
- OpType: models.ActionCreateImage,
- IsPrivate: image.IsPrivate,
- Content: fmt.Sprintf("%d|%s", image.ID, image.Tag),
- }
- if err := models.NotifyWatchers(act); err != nil {
- log.Error("notifyWatchers: %v", err)
- }
- }
-
- func (t *actionNotifier) NotifyImageRecommend(optUser *models.User, image *models.Image, action string) {
- u, err := models.GetUserByID(image.UID)
- if err != nil {
- return
- }
- switch action {
- case "recommend":
- act := &models.Action{
- ActUserID: u.ID,
- ActUser: u,
- OpType: models.ActionImageRecommend,
- IsPrivate: false,
- Content: fmt.Sprintf("%d|%s", image.ID, image.Tag),
- }
- if err := models.NotifyWatchers(act); err != nil {
- log.Error("notifyWatchers: %v", err)
- }
- }
- }
-
- func (t *actionNotifier) NotifyChangeUserAvatar(user *models.User, form auth.AvatarForm) {
- act := &models.Action{
- ActUserID: user.ID,
- ActUser: user,
- OpType: models.ActionChangeUserAvatar,
- IsPrivate: true,
- }
- if err := models.NotifyWatchers(act); err != nil {
- log.Error("notifyWatchers: %v", err)
- }
- }
-
- func (t *actionNotifier) NotifyInviteFriendRegister(inviter, invited *models.User) {
- act := &models.Action{
- ActUserID: inviter.ID,
- ActUser: inviter,
- OpType: models.ActionInviteFriendRegister,
- IsPrivate: true,
- Content: fmt.Sprintf("%d|%d|%s|%s", inviter.ID, invited.ID, inviter.Name, invited.Name),
- }
- if err := models.NotifyWatchers(act); err != nil {
- log.Error("notifyWatchers: %v", err)
- }
- }
|