summaryrefslogtreecommitdiffstats
path: root/models/action.go
blob: 1174929354730333db639b8e04b0edfe776c73b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// 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_PULL_REQUEST
)

// Action represents user operation type and information to the repository.
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.
	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) GetRepoName() string {
	return a.RepoName
}

func (a Action) GetBranch() string {
	return a.RefName
}

func (a Action) GetContent() string {
	return a.Content
}

// CommitRepoAction records action for commit repository.
func CommitRepoAction(userId int64, userName string,
	repoId int64, repoName string, refName string, commits *base.PushCommits) error {
	bs, err := json.Marshal(commits)
	if err != nil {
		return err
	}

	// Add feeds for user self and all watchers.
	watches, err := GetWatches(repoId)
	if err != nil {
		return err
	}
	watches = append(watches, Watch{UserId: userId})

	for i := range watches {
		if userId == watches[i].UserId && i > 0 {
			continue // Do not add twice in case author watches his/her repository.
		}

		_, err = orm.InsertOne(&Action{
			UserId:      watches[i].UserId,
			ActUserId:   userId,
			ActUserName: userName,
			OpType:      OP_COMMIT_REPO,
			Content:     string(bs),
			RepoId:      repoId,
			RepoName:    repoName,
			RefName:     refName,
		})
		return err
	}

	// Update repository last update time.
	repo, err := GetRepositoryByName(userId, repoName)
	if err != nil {
		return err
	}
	repo.IsBare = false
	if err = UpdateRepository(repo); err != nil {
		return err
	}

	log.Trace("action.CommitRepoAction: %d/%s", userId, repo.LowerName)
	return nil
}

// NewRepoAction records action for create repository.
func NewRepoAction(user *User, repo *Repository) error {
	_, err := orm.InsertOne(&Action{
		UserId:      user.Id,
		ActUserId:   user.Id,
		ActUserName: user.Name,
		OpType:      OP_CREATE_REPO,
		RepoId:      repo.Id,
		RepoName:    repo.Name,
	})

	log.Trace("action.NewRepoAction: %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
}