2016-08-26 21:23:21 +03:00
// Copyright 2015 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.
2016-11-24 10:04:31 +03:00
2016-08-26 21:23:21 +03:00
package repo
import (
"time"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
2018-03-29 16:32:40 +03:00
api "code.gitea.io/sdk/gitea"
2016-08-26 21:23:21 +03:00
)
2016-11-24 10:04:31 +03:00
// ListIssueComments list all the comments of an issue
2016-08-26 21:23:21 +03:00
func ListIssueComments ( ctx * context . APIContext ) {
2018-05-08 09:05:18 +03:00
// swagger:operation GET /repos/{owner}/{repo}/issues/{index}/comments issue issueGetComments
2017-11-13 10:02:25 +03:00
// ---
// summary: List all comments on an issue
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: id
// in: path
// description: index of the issue
// type: integer
// required: true
// - name: string
// in: query
// description: if provided, only comments updated since the specified time are returned.
// type: string
// responses:
// "200":
// "$ref": "#/responses/CommentList"
2016-08-26 21:23:21 +03:00
var since time . Time
2016-08-26 23:40:53 +03:00
if len ( ctx . Query ( "since" ) ) > 0 {
since , _ = time . Parse ( time . RFC3339 , ctx . Query ( "since" ) )
}
2016-08-26 21:23:21 +03:00
2016-08-26 23:40:53 +03:00
// comments,err:=models.GetCommentsByIssueIDSince(, since)
issue , err := models . GetRawIssueByIndex ( ctx . Repo . Repository . ID , ctx . ParamsInt64 ( ":index" ) )
2016-08-26 21:23:21 +03:00
if err != nil {
2016-08-26 23:40:53 +03:00
ctx . Error ( 500 , "GetRawIssueByIndex" , err )
2016-08-26 21:23:21 +03:00
return
}
2017-06-21 04:00:44 +03:00
comments , err := models . FindComments ( models . FindCommentsOptions {
IssueID : issue . ID ,
Since : since . Unix ( ) ,
Type : models . CommentTypeComment ,
} )
2016-08-26 23:40:53 +03:00
if err != nil {
ctx . Error ( 500 , "GetCommentsByIssueIDSince" , err )
return
2016-08-26 21:23:21 +03:00
}
2016-08-26 23:40:53 +03:00
apiComments := make ( [ ] * api . Comment , len ( comments ) )
for i := range comments {
apiComments [ i ] = comments [ i ] . APIFormat ( )
2016-08-26 21:23:21 +03:00
}
ctx . JSON ( 200 , & apiComments )
}
2017-11-13 10:02:25 +03:00
// ListRepoIssueComments returns all issue-comments for a repo
2016-12-22 11:29:26 +03:00
func ListRepoIssueComments ( ctx * context . APIContext ) {
2017-11-13 10:02:25 +03:00
// swagger:operation GET /repos/{owner}/{repo}/issues/comments issue issueGetRepoComments
// ---
// summary: List all comments in a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: string
// in: query
// description: if provided, only comments updated since the provided time are returned.
// type: string
// responses:
// "200":
// "$ref": "#/responses/CommentList"
2016-12-22 11:29:26 +03:00
var since time . Time
if len ( ctx . Query ( "since" ) ) > 0 {
since , _ = time . Parse ( time . RFC3339 , ctx . Query ( "since" ) )
}
2017-06-21 04:00:44 +03:00
comments , err := models . FindComments ( models . FindCommentsOptions {
RepoID : ctx . Repo . Repository . ID ,
Since : since . Unix ( ) ,
Type : models . CommentTypeComment ,
} )
2016-12-22 11:29:26 +03:00
if err != nil {
ctx . Error ( 500 , "GetCommentsByRepoIDSince" , err )
return
}
apiComments := make ( [ ] * api . Comment , len ( comments ) )
for i := range comments {
apiComments [ i ] = comments [ i ] . APIFormat ( )
}
ctx . JSON ( 200 , & apiComments )
}
2016-11-24 10:04:31 +03:00
// CreateIssueComment create a comment for an issue
2016-08-26 21:23:21 +03:00
func CreateIssueComment ( ctx * context . APIContext , form api . CreateIssueCommentOption ) {
2017-11-13 10:02:25 +03:00
// swagger:operation POST /repos/{owner}/{repo}/issues/{index}/comments issue issueCreateComment
// ---
// summary: Add a comment to an issue
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: id
// in: path
// description: index of the issue
// type: integer
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/CreateIssueOption"
// responses:
// "201":
// "$ref": "#/responses/Comment"
2016-08-26 21:23:21 +03:00
issue , err := models . GetIssueByIndex ( ctx . Repo . Repository . ID , ctx . ParamsInt64 ( ":index" ) )
if err != nil {
2016-08-26 23:40:53 +03:00
ctx . Error ( 500 , "GetIssueByIndex" , err )
2016-08-26 21:23:21 +03:00
return
}
2016-08-26 23:40:53 +03:00
comment , err := models . CreateIssueComment ( ctx . User , ctx . Repo . Repository , issue , form . Body , nil )
2016-08-26 21:23:21 +03:00
if err != nil {
2016-08-26 23:40:53 +03:00
ctx . Error ( 500 , "CreateIssueComment" , err )
2016-08-26 21:23:21 +03:00
return
}
ctx . JSON ( 201 , comment . APIFormat ( ) )
}
2016-11-24 10:04:31 +03:00
// EditIssueComment modify a comment of an issue
2016-08-26 21:23:21 +03:00
func EditIssueComment ( ctx * context . APIContext , form api . EditIssueCommentOption ) {
2017-11-20 10:24:07 +03:00
// swagger:operation PATCH /repos/{owner}/{repo}/issues/comments/{id} issue issueEditComment
2017-11-13 10:02:25 +03:00
// ---
// summary: Edit a comment
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: id
// in: path
// description: id of the comment to edit
// type: integer
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/EditIssueCommentOption"
// responses:
// "200":
// "$ref": "#/responses/Comment"
2017-11-20 10:24:07 +03:00
editIssueComment ( ctx , form )
}
// EditIssueCommentDeprecated modify a comment of an issue
func EditIssueCommentDeprecated ( ctx * context . APIContext , form api . EditIssueCommentOption ) {
// swagger:operation PATCH /repos/{owner}/{repo}/issues/{index}/comments/{id} issue issueEditCommentDeprecated
// ---
// summary: Edit a comment
// deprecated: true
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: index
// in: path
// description: this parameter is ignored
// type: integer
// required: true
// - name: id
// in: path
// description: id of the comment to edit
// type: integer
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/EditIssueCommentOption"
// responses:
// "200":
// "$ref": "#/responses/Comment"
editIssueComment ( ctx , form )
}
func editIssueComment ( ctx * context . APIContext , form api . EditIssueCommentOption ) {
2016-08-26 21:23:21 +03:00
comment , err := models . GetCommentByID ( ctx . ParamsInt64 ( ":id" ) )
if err != nil {
if models . IsErrCommentNotExist ( err ) {
ctx . Error ( 404 , "GetCommentByID" , err )
} else {
2016-08-26 23:40:53 +03:00
ctx . Error ( 500 , "GetCommentByID" , err )
2016-08-26 21:23:21 +03:00
}
return
}
if ! ctx . IsSigned || ( ctx . User . ID != comment . PosterID && ! ctx . Repo . IsAdmin ( ) ) {
2016-08-26 23:40:53 +03:00
ctx . Status ( 403 )
2016-08-26 21:23:21 +03:00
return
2016-11-07 19:30:04 +03:00
} else if comment . Type != models . CommentTypeComment {
2016-08-26 23:40:53 +03:00
ctx . Status ( 204 )
2016-08-26 21:23:21 +03:00
return
}
2018-05-16 17:01:55 +03:00
oldContent := comment . Content
2016-08-26 21:23:21 +03:00
comment . Content = form . Body
2018-05-16 17:01:55 +03:00
if err := models . UpdateComment ( ctx . User , comment , oldContent ) ; err != nil {
2016-08-26 23:40:53 +03:00
ctx . Error ( 500 , "UpdateComment" , err )
2016-08-26 21:23:21 +03:00
return
}
ctx . JSON ( 200 , comment . APIFormat ( ) )
}
2016-12-22 11:29:26 +03:00
// DeleteIssueComment delete a comment from an issue
func DeleteIssueComment ( ctx * context . APIContext ) {
2017-11-20 10:24:07 +03:00
// swagger:operation DELETE /repos/{owner}/{repo}/issues/comments/{id} issue issueDeleteComment
// ---
// summary: Delete a comment
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: id
// in: path
// description: id of comment to delete
// type: integer
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
deleteIssueComment ( ctx )
}
// DeleteIssueCommentDeprecated delete a comment from an issue
func DeleteIssueCommentDeprecated ( ctx * context . APIContext ) {
// swagger:operation DELETE /repos/{owner}/{repo}/issues/{index}/comments/{id} issue issueDeleteCommentDeprecated
2017-11-13 10:02:25 +03:00
// ---
// summary: Delete a comment
2017-11-20 10:24:07 +03:00
// deprecated: true
2017-11-13 10:02:25 +03:00
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
2017-11-20 10:24:07 +03:00
// - name: index
// in: path
// description: this parameter is ignored
// type: integer
// required: true
2017-11-13 10:02:25 +03:00
// - name: id
// in: path
// description: id of comment to delete
// type: integer
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
2017-11-20 10:24:07 +03:00
deleteIssueComment ( ctx )
}
func deleteIssueComment ( ctx * context . APIContext ) {
2016-12-22 11:29:26 +03:00
comment , err := models . GetCommentByID ( ctx . ParamsInt64 ( ":id" ) )
if err != nil {
if models . IsErrCommentNotExist ( err ) {
ctx . Error ( 404 , "GetCommentByID" , err )
} else {
ctx . Error ( 500 , "GetCommentByID" , err )
}
return
}
if ! ctx . IsSigned || ( ctx . User . ID != comment . PosterID && ! ctx . Repo . IsAdmin ( ) ) {
ctx . Status ( 403 )
return
} else if comment . Type != models . CommentTypeComment {
ctx . Status ( 204 )
return
}
2018-05-16 17:01:55 +03:00
if err = models . DeleteComment ( ctx . User , comment ) ; err != nil {
2016-12-22 11:29:26 +03:00
ctx . Error ( 500 , "DeleteCommentByID" , err )
return
}
ctx . Status ( 204 )
}