2014-03-21 00:04:56 +04:00
// 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
2014-03-22 21:50:50 +04:00
import (
2014-03-23 00:00:46 +04:00
"errors"
2014-03-22 21:50:50 +04:00
"strings"
"time"
"github.com/gogits/gogs/modules/base"
)
2014-03-23 00:00:46 +04:00
var (
ErrIssueNotExist = errors . New ( "Issue does not exist" )
)
2014-03-22 21:50:50 +04:00
// Issue represents an issue or pull request of repository.
2014-03-21 00:04:56 +04:00
type Issue struct {
2014-03-22 21:50:50 +04:00
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
2014-03-23 00:00:46 +04:00
Labels string ` xorm:"TEXT" `
Mentions string ` xorm:"TEXT" `
Content string ` xorm:"TEXT" `
2014-03-22 21:50:50 +04:00
NumComments int
Created time . Time ` xorm:"created" `
Updated time . Time ` xorm:"updated" `
}
// CreateIssue creates new issue for repository.
2014-03-23 00:00:46 +04:00
func CreateIssue ( userId , repoId , milestoneId , assigneeId int64 , name , labels , content string , isPull bool ) ( * Issue , error ) {
2014-03-22 21:50:50 +04:00
count , err := GetIssueCount ( repoId )
if err != nil {
2014-03-23 00:00:46 +04:00
return nil , err
2014-03-22 21:50:50 +04:00
}
2014-03-23 00:00:46 +04:00
// TODO: find out mentions
mentions := ""
issue := & Issue {
2014-03-22 21:50:50 +04:00
Index : count + 1 ,
Name : name ,
RepoId : repoId ,
PosterId : userId ,
MilestoneId : milestoneId ,
AssigneeId : assigneeId ,
IsPull : isPull ,
Labels : labels ,
Mentions : mentions ,
Content : content ,
2014-03-23 00:00:46 +04:00
}
_ , err = orm . Insert ( issue )
return issue , err
2014-03-21 00:04:56 +04:00
}
2014-03-22 21:50:50 +04:00
// GetIssueCount returns count of issues in the repository.
func GetIssueCount ( repoId int64 ) ( int64 , error ) {
return orm . Count ( & Issue { RepoId : repoId } )
2014-03-21 00:04:56 +04:00
}
2014-03-23 00:00:46 +04:00
// GetIssueById returns issue object by given id.
func GetIssueById ( id int64 ) ( * Issue , error ) {
issue := new ( Issue )
has , err := orm . Id ( id ) . Get ( issue )
if err != nil {
return nil , err
} else if ! has {
return nil , ErrIssueNotExist
}
return issue , nil
}
2014-03-22 21:50:50 +04:00
// 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 ) {
2014-03-23 00:00:46 +04:00
sess := orm . Limit ( 20 , ( page - 1 ) * 20 )
if repoId > 0 {
2014-03-23 14:27:01 +04:00
sess . Where ( "repo_id=?" , repoId ) . And ( "is_closed=?" , isClosed )
2014-03-23 00:00:46 +04:00
} else {
2014-03-23 14:27:01 +04:00
sess . Where ( "is_closed=?" , isClosed )
2014-03-23 00:00:46 +04:00
}
2014-03-22 21:50:50 +04:00
if userId > 0 {
2014-03-23 14:27:01 +04:00
sess . And ( "assignee_id=?" , userId )
2014-03-22 21:50:50 +04:00
} else if posterId > 0 {
2014-03-23 14:27:01 +04:00
sess . And ( "poster_id=?" , posterId )
2014-03-22 21:50:50 +04:00
} else if isMention {
2014-03-23 14:27:01 +04:00
sess . And ( "mentions like '%$" + base . ToStr ( userId ) + "|%'" )
2014-03-22 21:50:50 +04:00
}
if milestoneId > 0 {
2014-03-23 14:27:01 +04:00
sess . And ( "milestone_id=?" , milestoneId )
2014-03-22 21:50:50 +04:00
}
if len ( labels ) > 0 {
for _ , label := range strings . Split ( labels , "," ) {
2014-03-23 14:27:01 +04:00
sess . And ( "mentions like '%$" + label + "|%'" )
2014-03-22 21:50:50 +04:00
}
}
switch sortType {
case "oldest" :
2014-03-23 14:27:01 +04:00
sess . Asc ( "created" )
2014-03-22 21:50:50 +04:00
case "recentupdate" :
2014-03-23 14:27:01 +04:00
sess . Desc ( "updated" )
2014-03-22 21:50:50 +04:00
case "leastupdate" :
2014-03-23 14:27:01 +04:00
sess . Asc ( "updated" )
2014-03-22 21:50:50 +04:00
case "mostcomment" :
2014-03-23 14:27:01 +04:00
sess . Desc ( "num_comments" )
2014-03-22 21:50:50 +04:00
case "leastcomment" :
2014-03-23 14:27:01 +04:00
sess . Asc ( "num_comments" )
2014-03-22 21:50:50 +04:00
default :
2014-03-23 14:27:01 +04:00
sess . Desc ( "created" )
2014-03-22 21:50:50 +04:00
}
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.
2014-03-21 00:04:56 +04:00
type Comment struct {
2014-03-22 21:50:50 +04:00
Id int64
PosterId int64
IssueId int64
CommitId int64
Line int
Content string
Created time . Time ` xorm:"created" `
2014-03-21 00:04:56 +04:00
}