diff options
author | 6543 <6543@obermui.de> | 2019-12-12 05:23:05 +0100 |
---|---|---|
committer | techknowlogick <techknowlogick@gitea.io> | 2019-12-11 23:23:05 -0500 |
commit | aceb1085c79e4c75268ce794a8ee84631382a403 (patch) | |
tree | 0e2a9137e07d04ff33c034f2a610e4a51fa0897a /routers/api/v1/repo | |
parent | 382936a668c48b3c83fe80cdf138f76fb74a5f8f (diff) | |
download | gitea-aceb1085c79e4c75268ce794a8ee84631382a403.tar.gz gitea-aceb1085c79e4c75268ce794a8ee84631382a403.zip |
[API] extend StopWatch (#9196)
* squash api-stopwatch
* fix prepair logic! + add Tests
* fix lint
* more robust time compare
* delete responce 202 -> 204
* change http responce in test too
Diffstat (limited to 'routers/api/v1/repo')
-rw-r--r-- | routers/api/v1/repo/issue.go | 138 | ||||
-rw-r--r-- | routers/api/v1/repo/issue_stopwatch.go | 216 |
2 files changed, 216 insertions, 138 deletions
diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index 186e66cb8f..6972d447a6 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -598,141 +598,3 @@ func UpdateIssueDeadline(ctx *context.APIContext, form api.EditDeadlineOption) { ctx.JSON(201, api.IssueDeadline{Deadline: &deadline}) } - -// StartIssueStopwatch creates a stopwatch for the given issue. -func StartIssueStopwatch(ctx *context.APIContext) { - // swagger:operation POST /repos/{owner}/{repo}/issues/{index}/stopwatch/start issue issueStartStopWatch - // --- - // summary: Start stopwatch on 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: index - // in: path - // description: index of the issue to create the stopwatch on - // type: integer - // format: int64 - // required: true - // responses: - // "201": - // "$ref": "#/responses/empty" - // "403": - // description: Not repo writer, user does not have rights to toggle stopwatch - // "404": - // description: Issue not found - // "409": - // description: Cannot start a stopwatch again if it already exists - issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) - if err != nil { - if models.IsErrIssueNotExist(err) { - ctx.NotFound() - } else { - ctx.Error(500, "GetIssueByIndex", err) - } - - return - } - - if !ctx.Repo.CanWrite(models.UnitTypeIssues) { - ctx.Status(403) - return - } - - if !ctx.Repo.CanUseTimetracker(issue, ctx.User) { - ctx.Status(403) - return - } - - if models.StopwatchExists(ctx.User.ID, issue.ID) { - ctx.Error(409, "StopwatchExists", "a stopwatch has already been started for this issue") - return - } - - if err := models.CreateOrStopIssueStopwatch(ctx.User, issue); err != nil { - ctx.Error(500, "CreateOrStopIssueStopwatch", err) - return - } - - ctx.Status(201) -} - -// StopIssueStopwatch stops a stopwatch for the given issue. -func StopIssueStopwatch(ctx *context.APIContext) { - // swagger:operation POST /repos/{owner}/{repo}/issues/{index}/stopwatch/stop issue issueStopWatch - // --- - // summary: Stop an issue's existing stopwatch. - // 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: index of the issue to stop the stopwatch on - // type: integer - // format: int64 - // required: true - // responses: - // "201": - // "$ref": "#/responses/empty" - // "403": - // description: Not repo writer, user does not have rights to toggle stopwatch - // "404": - // description: Issue not found - // "409": - // description: Cannot stop a non existent stopwatch - issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) - if err != nil { - if models.IsErrIssueNotExist(err) { - ctx.NotFound() - } else { - ctx.Error(500, "GetIssueByIndex", err) - } - - return - } - - if !ctx.Repo.CanWrite(models.UnitTypeIssues) { - ctx.Status(403) - return - } - - if !ctx.Repo.CanUseTimetracker(issue, ctx.User) { - ctx.Status(403) - return - } - - if !models.StopwatchExists(ctx.User.ID, issue.ID) { - ctx.Error(409, "StopwatchExists", "cannot stop a non existent stopwatch") - return - } - - if err := models.CreateOrStopIssueStopwatch(ctx.User, issue); err != nil { - ctx.Error(500, "CreateOrStopIssueStopwatch", err) - return - } - - ctx.Status(201) -} diff --git a/routers/api/v1/repo/issue_stopwatch.go b/routers/api/v1/repo/issue_stopwatch.go new file mode 100644 index 0000000000..48b2f6498f --- /dev/null +++ b/routers/api/v1/repo/issue_stopwatch.go @@ -0,0 +1,216 @@ +// Copyright 2019 The Gitea 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 ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/context" +) + +// StartIssueStopwatch creates a stopwatch for the given issue. +func StartIssueStopwatch(ctx *context.APIContext) { + // swagger:operation POST /repos/{owner}/{repo}/issues/{index}/stopwatch/start issue issueStartStopWatch + // --- + // summary: Start stopwatch on 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: index + // in: path + // description: index of the issue to create the stopwatch on + // type: integer + // format: int64 + // required: true + // responses: + // "201": + // "$ref": "#/responses/empty" + // "403": + // description: Not repo writer, user does not have rights to toggle stopwatch + // "404": + // description: Issue not found + // "409": + // description: Cannot start a stopwatch again if it already exists + issue, err := prepareIssueStopwatch(ctx, false) + if err != nil { + return + } + + if err := models.CreateOrStopIssueStopwatch(ctx.User, issue); err != nil { + ctx.Error(500, "CreateOrStopIssueStopwatch", err) + return + } + + ctx.Status(201) +} + +// StopIssueStopwatch stops a stopwatch for the given issue. +func StopIssueStopwatch(ctx *context.APIContext) { + // swagger:operation POST /repos/{owner}/{repo}/issues/{index}/stopwatch/stop issue issueStopStopWatch + // --- + // summary: Stop an issue's existing stopwatch. + // 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: index of the issue to stop the stopwatch on + // type: integer + // format: int64 + // required: true + // responses: + // "201": + // "$ref": "#/responses/empty" + // "403": + // description: Not repo writer, user does not have rights to toggle stopwatch + // "404": + // description: Issue not found + // "409": + // description: Cannot stop a non existent stopwatch + issue, err := prepareIssueStopwatch(ctx, true) + if err != nil { + return + } + + if err := models.CreateOrStopIssueStopwatch(ctx.User, issue); err != nil { + ctx.Error(500, "CreateOrStopIssueStopwatch", err) + return + } + + ctx.Status(201) +} + +// DeleteIssueStopwatch delete a specific stopwatch +func DeleteIssueStopwatch(ctx *context.APIContext) { + // swagger:operation DELETE /repos/{owner}/{repo}/issues/{index}/stopwatch/delete issue issueDeleteStopWatch + // --- + // summary: Delete an issue's existing stopwatch. + // 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: index of the issue to stop the stopwatch on + // type: integer + // format: int64 + // required: true + // responses: + // "204": + // "$ref": "#/responses/empty" + // "403": + // description: Not repo writer, user does not have rights to toggle stopwatch + // "404": + // description: Issue not found + // "409": + // description: Cannot cancel a non existent stopwatch + issue, err := prepareIssueStopwatch(ctx, true) + if err != nil { + return + } + + if err := models.CancelStopwatch(ctx.User, issue); err != nil { + ctx.Error(500, "CancelStopwatch", err) + return + } + + ctx.Status(204) +} + +func prepareIssueStopwatch(ctx *context.APIContext, shouldExist bool) (*models.Issue, error) { + issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) + if err != nil { + if models.IsErrIssueNotExist(err) { + ctx.NotFound() + } else { + ctx.Error(500, "GetIssueByIndex", err) + } + + return nil, err + } + + if !ctx.Repo.CanWrite(models.UnitTypeIssues) { + ctx.Status(403) + return nil, err + } + + if !ctx.Repo.CanUseTimetracker(issue, ctx.User) { + ctx.Status(403) + return nil, err + } + + if models.StopwatchExists(ctx.User.ID, issue.ID) != shouldExist { + if shouldExist { + ctx.Error(409, "StopwatchExists", "cannot stop/cancel a non existent stopwatch") + } else { + ctx.Error(409, "StopwatchExists", "cannot start a stopwatch again if it already exists") + } + return nil, err + } + + return issue, nil +} + +// GetStopwatches get all stopwatches +func GetStopwatches(ctx *context.APIContext) { + // swagger:operation GET /user/stopwatches user userGetStopWatches + // --- + // summary: Get list of all existing stopwatches + // consumes: + // - application/json + // produces: + // - application/json + // responses: + // "200": + // "$ref": "#/responses/StopWatchList" + + sws, err := models.GetUserStopwatches(ctx.User.ID) + if err != nil { + ctx.Error(500, "GetUserStopwatches", err) + return + } + + apiSWs, err := sws.APIFormat() + if err != nil { + ctx.Error(500, "APIFormat", err) + return + } + + ctx.JSON(200, apiSWs) +} |