2014-03-22 21:50:50 +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 repo
import (
2014-03-23 00:00:46 +04:00
"fmt"
2014-03-28 05:15:53 +04:00
"net/url"
2014-03-23 00:00:46 +04:00
2014-03-22 21:50:50 +04:00
"github.com/codegangsta/martini"
"github.com/gogits/gogs/models"
2014-03-23 00:00:46 +04:00
"github.com/gogits/gogs/modules/auth"
2014-03-22 21:50:50 +04:00
"github.com/gogits/gogs/modules/base"
2014-03-23 00:00:46 +04:00
"github.com/gogits/gogs/modules/log"
2014-03-26 05:37:18 +04:00
"github.com/gogits/gogs/modules/mailer"
2014-03-22 21:50:50 +04:00
"github.com/gogits/gogs/modules/middleware"
)
2014-03-27 20:48:29 +04:00
func Issues ( ctx * middleware . Context ) {
2014-03-28 04:38:49 +04:00
if ! ctx . Repo . IsValid {
ctx . Handle ( 404 , "issue.Issues(invalid repo):" , nil )
}
2014-03-23 00:00:46 +04:00
ctx . Data [ "Title" ] = "Issues"
2014-03-22 21:50:50 +04:00
ctx . Data [ "IsRepoToolbarIssues" ] = true
2014-03-26 17:47:20 +04:00
ctx . Data [ "IsRepoToolbarIssuesList" ] = true
2014-03-28 00:31:32 +04:00
ctx . Data [ "ViewType" ] = "all"
2014-03-22 21:50:50 +04:00
2014-03-27 20:48:29 +04:00
milestoneId , _ := base . StrTo ( ctx . Query ( "milestone" ) ) . Int ( )
page , _ := base . StrTo ( ctx . Query ( "page" ) ) . Int ( )
2014-03-22 21:50:50 +04:00
2014-03-28 04:38:49 +04:00
ctx . Data [ "IssueCreatedCount" ] = 0
2014-03-28 00:31:32 +04:00
var posterId int64 = 0
if ctx . Query ( "type" ) == "created_by" {
2014-03-28 04:38:49 +04:00
if ! ctx . IsSigned {
2014-03-28 05:15:53 +04:00
ctx . SetCookie ( "redirect_to" , "/" + url . QueryEscape ( ctx . Req . RequestURI ) )
2014-03-28 04:38:49 +04:00
ctx . Redirect ( "/user/login/" , 302 )
2014-03-28 05:15:53 +04:00
return
2014-03-28 04:38:49 +04:00
}
2014-03-28 00:31:32 +04:00
ctx . Data [ "ViewType" ] = "created_by"
}
2014-03-25 22:04:57 +04:00
// Get issues.
2014-03-28 00:31:32 +04:00
issues , err := models . GetIssues ( 0 , ctx . Repo . Repository . Id , posterId , int64 ( milestoneId ) , page ,
ctx . Query ( "state" ) == "closed" , false , ctx . Query ( "labels" ) , ctx . Query ( "sortType" ) )
2014-03-22 21:50:50 +04:00
if err != nil {
ctx . Handle ( 200 , "issue.Issues: %v" , err )
return
}
2014-03-25 22:04:57 +04:00
2014-03-28 17:16:12 +04:00
if ctx . IsSigned {
posterId = ctx . User . Id
}
var createdByCount int
2014-03-25 22:04:57 +04:00
// Get posters.
for i := range issues {
u , err := models . GetUserById ( issues [ i ] . PosterId )
if err != nil {
ctx . Handle ( 200 , "issue.Issues(get poster): %v" , err )
return
}
issues [ i ] . Poster = u
2014-03-28 17:16:12 +04:00
if u . Id == posterId {
createdByCount ++
}
2014-03-25 22:04:57 +04:00
}
ctx . Data [ "Issues" ] = issues
2014-03-27 20:48:29 +04:00
ctx . Data [ "IssueCount" ] = ctx . Repo . Repository . NumIssues
ctx . Data [ "OpenCount" ] = ctx . Repo . Repository . NumIssues - ctx . Repo . Repository . NumClosedIssues
ctx . Data [ "ClosedCount" ] = ctx . Repo . Repository . NumClosedIssues
2014-03-28 17:16:12 +04:00
ctx . Data [ "IssueCreatedCount" ] = createdByCount
2014-03-27 20:48:29 +04:00
ctx . Data [ "IsShowClosed" ] = ctx . Query ( "state" ) == "closed"
2014-03-25 20:12:27 +04:00
ctx . HTML ( 200 , "issue/list" )
2014-03-22 21:50:50 +04:00
}
2014-03-22 22:27:03 +04:00
2014-03-23 00:00:46 +04:00
func CreateIssue ( ctx * middleware . Context , params martini . Params , form auth . CreateIssueForm ) {
2014-03-28 04:38:49 +04:00
if ! ctx . Repo . IsValid {
ctx . Handle ( 404 , "issue.CreateIssue(invalid repo):" , nil )
}
2014-03-23 00:00:46 +04:00
ctx . Data [ "Title" ] = "Create issue"
2014-03-25 14:27:29 +04:00
ctx . Data [ "IsRepoToolbarIssues" ] = true
2014-03-26 16:02:04 +04:00
ctx . Data [ "IsRepoToolbarIssuesList" ] = false
2014-03-23 00:00:46 +04:00
if ctx . Req . Method == "GET" {
ctx . HTML ( 200 , "issue/create" )
return
}
if ctx . HasError ( ) {
ctx . HTML ( 200 , "issue/create" )
return
}
2014-03-25 20:12:27 +04:00
issue , err := models . CreateIssue ( ctx . User . Id , ctx . Repo . Repository . Id , form . MilestoneId , form . AssigneeId ,
2014-03-27 20:48:29 +04:00
ctx . Repo . Repository . NumIssues , form . IssueName , form . Labels , form . Content , false )
2014-03-25 22:04:57 +04:00
if err != nil {
ctx . Handle ( 200 , "issue.CreateIssue" , err )
2014-03-23 00:00:46 +04:00
return
}
2014-03-25 22:04:57 +04:00
// Notify watchers.
2014-03-29 15:50:25 +04:00
if err = models . NotifyWatchers ( & models . Action { ActUserId : ctx . User . Id , ActUserName : ctx . User . Name , ActEmail : ctx . User . Email ,
2014-03-27 19:37:33 +04:00
OpType : models . OP_CREATE_ISSUE , Content : fmt . Sprintf ( "%d|%s" , issue . Index , issue . Name ) ,
RepoId : ctx . Repo . Repository . Id , RepoName : ctx . Repo . Repository . Name , RefName : "" } ) ; err != nil {
2014-03-25 22:04:57 +04:00
ctx . Handle ( 200 , "issue.CreateIssue" , err )
return
}
2014-03-26 05:37:18 +04:00
// Mail watchers.
if base . Service . NotifyMail {
if err = mailer . SendNotifyMail ( ctx . User . Id , ctx . Repo . Repository . Id , ctx . User . Name , ctx . Repo . Repository . Name , issue . Name , issue . Content ) ; err != nil {
ctx . Handle ( 200 , "issue.CreateIssue" , err )
return
}
}
2014-03-25 22:04:57 +04:00
log . Trace ( "%d Issue created: %d" , ctx . Repo . Repository . Id , issue . Id )
ctx . Redirect ( fmt . Sprintf ( "/%s/%s/issues/%d" , params [ "username" ] , params [ "reponame" ] , issue . Index ) )
2014-03-23 00:00:46 +04:00
}
func ViewIssue ( ctx * middleware . Context , params martini . Params ) {
2014-03-28 04:38:49 +04:00
if ! ctx . Repo . IsValid {
ctx . Handle ( 404 , "issue.ViewIssue(invalid repo):" , nil )
}
2014-03-24 03:09:11 +04:00
index , err := base . StrTo ( params [ "index" ] ) . Int ( )
2014-03-23 00:00:46 +04:00
if err != nil {
2014-03-23 09:12:55 +04:00
ctx . Handle ( 404 , "issue.ViewIssue" , err )
2014-03-23 00:00:46 +04:00
return
}
2014-03-24 03:09:11 +04:00
issue , err := models . GetIssueByIndex ( ctx . Repo . Repository . Id , int64 ( index ) )
2014-03-23 00:00:46 +04:00
if err != nil {
if err == models . ErrIssueNotExist {
2014-03-23 09:12:55 +04:00
ctx . Handle ( 404 , "issue.ViewIssue" , err )
2014-03-23 00:00:46 +04:00
} else {
ctx . Handle ( 200 , "issue.ViewIssue" , err )
}
return
}
2014-03-26 20:31:01 +04:00
// Get posters.
u , err := models . GetUserById ( issue . PosterId )
if err != nil {
ctx . Handle ( 200 , "issue.ViewIssue(get poster): %v" , err )
return
}
issue . Poster = u
2014-03-29 18:24:42 +04:00
issue . RenderedContent = string ( base . RenderMarkdown ( [ ] byte ( issue . Content ) , "" ) )
2014-03-26 20:31:01 +04:00
// Get comments.
comments , err := models . GetIssueComments ( issue . Id )
if err != nil {
ctx . Handle ( 200 , "issue.ViewIssue(get comments): %v" , err )
return
}
// Get posters.
for i := range comments {
u , err := models . GetUserById ( comments [ i ] . PosterId )
if err != nil {
ctx . Handle ( 200 , "issue.ViewIssue(get poster): %v" , err )
return
}
comments [ i ] . Poster = u
2014-03-27 19:37:33 +04:00
comments [ i ] . Content = string ( base . RenderMarkdown ( [ ] byte ( comments [ i ] . Content ) , "" ) )
2014-03-26 20:31:01 +04:00
}
2014-03-23 00:00:46 +04:00
ctx . Data [ "Title" ] = issue . Name
ctx . Data [ "Issue" ] = issue
2014-03-26 20:31:01 +04:00
ctx . Data [ "Comments" ] = comments
2014-03-26 16:02:04 +04:00
ctx . Data [ "IsRepoToolbarIssues" ] = true
ctx . Data [ "IsRepoToolbarIssuesList" ] = false
2014-03-23 00:00:46 +04:00
ctx . HTML ( 200 , "issue/view" )
2014-03-22 22:27:03 +04:00
}
2014-03-24 03:09:11 +04:00
func UpdateIssue ( ctx * middleware . Context , params martini . Params , form auth . CreateIssueForm ) {
2014-03-28 04:38:49 +04:00
if ! ctx . Repo . IsValid {
ctx . Handle ( 404 , "issue.UpdateIssue(invalid repo):" , nil )
}
2014-03-24 03:09:11 +04:00
index , err := base . StrTo ( params [ "index" ] ) . Int ( )
if err != nil {
ctx . Handle ( 404 , "issue.UpdateIssue" , err )
return
}
issue , err := models . GetIssueByIndex ( ctx . Repo . Repository . Id , int64 ( index ) )
if err != nil {
if err == models . ErrIssueNotExist {
ctx . Handle ( 404 , "issue.UpdateIssue" , err )
} else {
2014-03-26 20:31:01 +04:00
ctx . Handle ( 200 , "issue.UpdateIssue(get issue)" , err )
2014-03-24 03:09:11 +04:00
}
return
}
2014-03-26 15:42:08 +04:00
if ctx . User . Id != issue . PosterId {
ctx . Handle ( 404 , "issue.UpdateIssue" , nil )
return
}
2014-03-24 03:09:11 +04:00
issue . Name = form . IssueName
issue . MilestoneId = form . MilestoneId
issue . AssigneeId = form . AssigneeId
issue . Labels = form . Labels
issue . Content = form . Content
if err = models . UpdateIssue ( issue ) ; err != nil {
2014-03-26 20:31:01 +04:00
ctx . Handle ( 200 , "issue.UpdateIssue(update issue)" , err )
2014-03-24 03:09:11 +04:00
return
}
2014-03-29 18:24:42 +04:00
ctx . JSON ( 200 , map [ string ] interface { } {
"ok" : true ,
"title" : issue . Name ,
"content" : string ( base . RenderMarkdown ( [ ] byte ( issue . Content ) , "" ) ) ,
"raw_content" : issue . Content ,
} )
2014-03-24 03:09:11 +04:00
}
2014-03-26 20:31:01 +04:00
func Comment ( ctx * middleware . Context , params martini . Params ) {
2014-03-29 14:55:51 +04:00
fmt . Println ( ctx . Query ( "change_status" ) )
2014-03-28 04:38:49 +04:00
if ! ctx . Repo . IsValid {
ctx . Handle ( 404 , "issue.Comment(invalid repo):" , nil )
}
2014-03-26 20:31:01 +04:00
index , err := base . StrTo ( ctx . Query ( "issueIndex" ) ) . Int ( )
if err != nil {
ctx . Handle ( 404 , "issue.Comment" , err )
return
}
2014-03-29 01:34:07 +04:00
content := ctx . Query ( "content" )
if len ( content ) == 0 {
ctx . Redirect ( fmt . Sprintf ( "/%s/%s/issues/%d" , ctx . User . Name , ctx . Repo . Repository . Name , index ) )
return
}
2014-03-26 20:31:01 +04:00
issue , err := models . GetIssueByIndex ( ctx . Repo . Repository . Id , int64 ( index ) )
if err != nil {
if err == models . ErrIssueNotExist {
ctx . Handle ( 404 , "issue.Comment" , err )
} else {
ctx . Handle ( 200 , "issue.Comment(get issue)" , err )
}
return
}
switch params [ "action" ] {
case "new" :
if err = models . CreateComment ( ctx . User . Id , issue . Id , 0 , 0 , content ) ; err != nil {
ctx . Handle ( 500 , "issue.Comment(create comment)" , err )
return
}
log . Trace ( "%s Comment created: %d" , ctx . Req . RequestURI , issue . Id )
default :
ctx . Handle ( 404 , "issue.Comment" , err )
return
}
ctx . Redirect ( fmt . Sprintf ( "/%s/%s/issues/%d" , ctx . User . Name , ctx . Repo . Repository . Name , index ) )
}