* add GET /repos/{owner}/{repo}/issues/comments/{id}
and complete error list for swagger in other func
* add repo check
tags/v1.21.12.1
| @@ -83,6 +83,33 @@ func TestAPICreateComment(t *testing.T) { | |||||
| models.AssertExistsAndLoadBean(t, &models.Comment{ID: updatedComment.ID, IssueID: issue.ID, Content: commentBody}) | models.AssertExistsAndLoadBean(t, &models.Comment{ID: updatedComment.ID, IssueID: issue.ID, Content: commentBody}) | ||||
| } | } | ||||
| func TestAPIGetComment(t *testing.T) { | |||||
| defer prepareTestEnv(t)() | |||||
| comment := models.AssertExistsAndLoadBean(t, &models.Comment{ID: 2}).(*models.Comment) | |||||
| assert.NoError(t, comment.LoadIssue()) | |||||
| repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: comment.Issue.RepoID}).(*models.Repository) | |||||
| repoOwner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) | |||||
| session := loginUser(t, repoOwner.Name) | |||||
| token := getTokenForLoggedInUser(t, session) | |||||
| req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d", repoOwner.Name, repo.Name, comment.ID) | |||||
| resp := session.MakeRequest(t, req, http.StatusOK) | |||||
| req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d?token=%s", repoOwner.Name, repo.Name, comment.ID, token) | |||||
| resp = session.MakeRequest(t, req, http.StatusOK) | |||||
| var apiComment api.Comment | |||||
| DecodeJSON(t, resp, &apiComment) | |||||
| assert.NoError(t, comment.LoadPoster()) | |||||
| expect := comment.APIFormat() | |||||
| assert.Equal(t, expect.ID, apiComment.ID) | |||||
| assert.Equal(t, expect.Poster.FullName, apiComment.Poster.FullName) | |||||
| assert.Equal(t, expect.Body, apiComment.Body) | |||||
| assert.Equal(t, expect.Created.Unix(), apiComment.Created.Unix()) | |||||
| } | |||||
| func TestAPIEditComment(t *testing.T) { | func TestAPIEditComment(t *testing.T) { | ||||
| defer prepareTestEnv(t)() | defer prepareTestEnv(t)() | ||||
| const newCommentBody = "This is the new comment body" | const newCommentBody = "This is the new comment body" | ||||
| @@ -661,9 +661,10 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
| m.Group("/comments", func() { | m.Group("/comments", func() { | ||||
| m.Get("", repo.ListRepoIssueComments) | m.Get("", repo.ListRepoIssueComments) | ||||
| m.Group("/:id", func() { | m.Group("/:id", func() { | ||||
| m.Combo("", reqToken()). | |||||
| Patch(mustNotBeArchived, bind(api.EditIssueCommentOption{}), repo.EditIssueComment). | |||||
| Delete(repo.DeleteIssueComment) | |||||
| m.Combo(""). | |||||
| Get(repo.GetIssueComment). | |||||
| Patch(mustNotBeArchived, reqToken(), bind(api.EditIssueCommentOption{}), repo.EditIssueComment). | |||||
| Delete(reqToken(), repo.DeleteIssueComment) | |||||
| m.Combo("/reactions"). | m.Combo("/reactions"). | ||||
| Get(repo.GetIssueCommentReactions). | Get(repo.GetIssueCommentReactions). | ||||
| Post(bind(api.EditReactionOption{}), reqToken(), repo.PostIssueCommentReaction). | Post(bind(api.EditReactionOption{}), reqToken(), repo.PostIssueCommentReaction). | ||||
| @@ -204,6 +204,74 @@ func CreateIssueComment(ctx *context.APIContext, form api.CreateIssueCommentOpti | |||||
| ctx.JSON(http.StatusCreated, comment.APIFormat()) | ctx.JSON(http.StatusCreated, comment.APIFormat()) | ||||
| } | } | ||||
| // GetIssueComment Get a comment by ID | |||||
| func GetIssueComment(ctx *context.APIContext) { | |||||
| // swagger:operation GET /repos/{owner}/{repo}/issues/comments/{id} issue issueGetComment | |||||
| // --- | |||||
| // summary: Get 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 | |||||
| // type: integer | |||||
| // format: int64 | |||||
| // required: true | |||||
| // responses: | |||||
| // "200": | |||||
| // "$ref": "#/responses/Comment" | |||||
| // "204": | |||||
| // "$ref": "#/responses/empty" | |||||
| // "403": | |||||
| // "$ref": "#/responses/forbidden" | |||||
| // "404": | |||||
| // "$ref": "#/responses/notFound" | |||||
| comment, err := models.GetCommentByID(ctx.ParamsInt64(":id")) | |||||
| if err != nil { | |||||
| if models.IsErrCommentNotExist(err) { | |||||
| ctx.NotFound(err) | |||||
| } else { | |||||
| ctx.Error(http.StatusInternalServerError, "GetCommentByID", err) | |||||
| } | |||||
| return | |||||
| } | |||||
| if err = comment.LoadIssue(); err != nil { | |||||
| ctx.InternalServerError(err) | |||||
| return | |||||
| } | |||||
| if comment.Issue.RepoID != ctx.Repo.Repository.ID { | |||||
| ctx.Status(http.StatusNotFound) | |||||
| return | |||||
| } | |||||
| if comment.Type != models.CommentTypeComment { | |||||
| ctx.Status(http.StatusNoContent) | |||||
| return | |||||
| } | |||||
| if err := comment.LoadPoster(); err != nil { | |||||
| ctx.Error(http.StatusInternalServerError, "comment.LoadPoster", err) | |||||
| return | |||||
| } | |||||
| ctx.JSON(http.StatusOK, comment.APIFormat()) | |||||
| } | |||||
| // EditIssueComment modify a comment of an issue | // EditIssueComment modify a comment of an issue | ||||
| func EditIssueComment(ctx *context.APIContext, form api.EditIssueCommentOption) { | func EditIssueComment(ctx *context.APIContext, form api.EditIssueCommentOption) { | ||||
| // swagger:operation PATCH /repos/{owner}/{repo}/issues/comments/{id} issue issueEditComment | // swagger:operation PATCH /repos/{owner}/{repo}/issues/comments/{id} issue issueEditComment | ||||
| @@ -237,6 +305,13 @@ func EditIssueComment(ctx *context.APIContext, form api.EditIssueCommentOption) | |||||
| // responses: | // responses: | ||||
| // "200": | // "200": | ||||
| // "$ref": "#/responses/Comment" | // "$ref": "#/responses/Comment" | ||||
| // "204": | |||||
| // "$ref": "#/responses/empty" | |||||
| // "403": | |||||
| // "$ref": "#/responses/forbidden" | |||||
| // "404": | |||||
| // "$ref": "#/responses/notFound" | |||||
| editIssueComment(ctx, form) | editIssueComment(ctx, form) | ||||
| } | } | ||||
| @@ -283,6 +358,8 @@ func EditIssueCommentDeprecated(ctx *context.APIContext, form api.EditIssueComme | |||||
| // "$ref": "#/responses/empty" | // "$ref": "#/responses/empty" | ||||
| // "403": | // "403": | ||||
| // "$ref": "#/responses/forbidden" | // "$ref": "#/responses/forbidden" | ||||
| // "404": | |||||
| // "$ref": "#/responses/notFound" | |||||
| editIssueComment(ctx, form) | editIssueComment(ctx, form) | ||||
| } | } | ||||
| @@ -343,6 +420,8 @@ func DeleteIssueComment(ctx *context.APIContext) { | |||||
| // "$ref": "#/responses/empty" | // "$ref": "#/responses/empty" | ||||
| // "403": | // "403": | ||||
| // "$ref": "#/responses/forbidden" | // "$ref": "#/responses/forbidden" | ||||
| // "404": | |||||
| // "$ref": "#/responses/notFound" | |||||
| deleteIssueComment(ctx) | deleteIssueComment(ctx) | ||||
| } | } | ||||
| @@ -380,6 +459,8 @@ func DeleteIssueCommentDeprecated(ctx *context.APIContext) { | |||||
| // "$ref": "#/responses/empty" | // "$ref": "#/responses/empty" | ||||
| // "403": | // "403": | ||||
| // "$ref": "#/responses/forbidden" | // "$ref": "#/responses/forbidden" | ||||
| // "404": | |||||
| // "$ref": "#/responses/notFound" | |||||
| deleteIssueComment(ctx) | deleteIssueComment(ctx) | ||||
| } | } | ||||
| @@ -3002,6 +3002,57 @@ | |||||
| } | } | ||||
| }, | }, | ||||
| "/repos/{owner}/{repo}/issues/comments/{id}": { | "/repos/{owner}/{repo}/issues/comments/{id}": { | ||||
| "get": { | |||||
| "consumes": [ | |||||
| "application/json" | |||||
| ], | |||||
| "produces": [ | |||||
| "application/json" | |||||
| ], | |||||
| "tags": [ | |||||
| "issue" | |||||
| ], | |||||
| "summary": "Get a comment", | |||||
| "operationId": "issueGetComment", | |||||
| "parameters": [ | |||||
| { | |||||
| "type": "string", | |||||
| "description": "owner of the repo", | |||||
| "name": "owner", | |||||
| "in": "path", | |||||
| "required": true | |||||
| }, | |||||
| { | |||||
| "type": "string", | |||||
| "description": "name of the repo", | |||||
| "name": "repo", | |||||
| "in": "path", | |||||
| "required": true | |||||
| }, | |||||
| { | |||||
| "type": "integer", | |||||
| "format": "int64", | |||||
| "description": "id of the comment", | |||||
| "name": "id", | |||||
| "in": "path", | |||||
| "required": true | |||||
| } | |||||
| ], | |||||
| "responses": { | |||||
| "200": { | |||||
| "$ref": "#/responses/Comment" | |||||
| }, | |||||
| "204": { | |||||
| "$ref": "#/responses/empty" | |||||
| }, | |||||
| "403": { | |||||
| "$ref": "#/responses/forbidden" | |||||
| }, | |||||
| "404": { | |||||
| "$ref": "#/responses/notFound" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "delete": { | "delete": { | ||||
| "tags": [ | "tags": [ | ||||
| "issue" | "issue" | ||||
| @@ -3038,6 +3089,9 @@ | |||||
| }, | }, | ||||
| "403": { | "403": { | ||||
| "$ref": "#/responses/forbidden" | "$ref": "#/responses/forbidden" | ||||
| }, | |||||
| "404": { | |||||
| "$ref": "#/responses/notFound" | |||||
| } | } | ||||
| } | } | ||||
| }, | }, | ||||
| @@ -3087,6 +3141,15 @@ | |||||
| "responses": { | "responses": { | ||||
| "200": { | "200": { | ||||
| "$ref": "#/responses/Comment" | "$ref": "#/responses/Comment" | ||||
| }, | |||||
| "204": { | |||||
| "$ref": "#/responses/empty" | |||||
| }, | |||||
| "403": { | |||||
| "$ref": "#/responses/forbidden" | |||||
| }, | |||||
| "404": { | |||||
| "$ref": "#/responses/notFound" | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -3491,6 +3554,9 @@ | |||||
| }, | }, | ||||
| "403": { | "403": { | ||||
| "$ref": "#/responses/forbidden" | "$ref": "#/responses/forbidden" | ||||
| }, | |||||
| "404": { | |||||
| "$ref": "#/responses/notFound" | |||||
| } | } | ||||
| } | } | ||||
| }, | }, | ||||
| @@ -3554,6 +3620,9 @@ | |||||
| }, | }, | ||||
| "403": { | "403": { | ||||
| "$ref": "#/responses/forbidden" | "$ref": "#/responses/forbidden" | ||||
| }, | |||||
| "404": { | |||||
| "$ref": "#/responses/notFound" | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||