summaryrefslogtreecommitdiffstats
path: root/models/issue.go
blob: 0b6ca4c323aee37529283210e77131a260a762f3 (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
// 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 (
	"strings"
	"time"

	"github.com/gogits/gogs/modules/base"
)

// Issue represents an issue or pull request of repository.
type Issue struct {
	Id          int64
	Index       int64 // Index in one repository.
	Name        string
	RepoId      int64 `xorm:"index"`
	PosterId    int64
	MilestoneId int64
	AssigneeId  int64
	IsPull      bool // Indicates whether is a pull request or not.
	IsClosed    bool
	Labels      string
	Mentions    string
	Content     string
	NumComments int
	Created     time.Time `xorm:"created"`
	Updated     time.Time `xorm:"updated"`
}

// CreateIssue creates new issue for repository.
func CreateIssue(userId, repoId, milestoneId, assigneeId int64, name, labels, mentions, content string, isPull bool) error {
	count, err := GetIssueCount(repoId)
	if err != nil {
		return err
	}

	_, err = orm.Insert(&Issue{
		Index:       count + 1,
		Name:        name,
		RepoId:      repoId,
		PosterId:    userId,
		MilestoneId: milestoneId,
		AssigneeId:  assigneeId,
		IsPull:      isPull,
		Labels:      labels,
		Mentions:    mentions,
		Content:     content,
	})
	return err
}

// GetIssueCount returns count of issues in the repository.
func GetIssueCount(repoId int64) (int64, error) {
	return orm.Count(&Issue{RepoId: repoId})
}

// GetIssues returns a list of issues by given conditions.
func GetIssues(userId, repoId, posterId, milestoneId int64, page int, isClosed, isMention bool, labels, sortType string) ([]Issue, error) {
	sess := orm.Limit(20, (page-1)*20).Where("repo_id=?", repoId).And("is_closed=?", isClosed)
	if userId > 0 {
		sess = sess.And("assignee_id=?", userId)
	} else if posterId > 0 {
		sess = sess.And("poster_id=?", posterId)
	} else if isMention {
		sess = sess.And("mentions like '%$" + base.ToStr(userId) + "|%'")
	}

	if milestoneId > 0 {
		sess = sess.And("milestone_id=?", milestoneId)
	}

	if len(labels) > 0 {
		for _, label := range strings.Split(labels, ",") {
			sess = sess.And("mentions like '%$" + label + "|%'")
		}
	}

	switch sortType {
	case "oldest":
		sess = sess.Asc("created")
	case "recentupdate":
		sess = sess.Desc("updated")
	case "leastupdate":
		sess = sess.Asc("updated")
	case "mostcomment":
		sess = sess.Desc("num_comments")
	case "leastcomment":
		sess = sess.Asc("num_comments")
	default:
		sess = sess.Desc("created")
	}

	var issues []Issue
	err := sess.Find(&issues)
	return issues, err
}

// Label represents a list of labels of repository for issues.
type Label struct {
	Id     int64
	RepoId int64 `xorm:"index"`
	Names  string
	Colors string
}

// Milestone represents a milestone of repository.
type Milestone struct {
	Id        int64
	Name      string
	RepoId    int64 `xorm:"index"`
	IsClosed  bool
	Content   string
	NumIssues int
	DueDate   time.Time
	Created   time.Time `xorm:"created"`
}

// Comment represents a comment in commit and issue page.
type Comment struct {
	Id       int64
	PosterId int64
	IssueId  int64
	CommitId int64
	Line     int
	Content  string
	Created  time.Time `xorm:"created"`
}