2017-09-12 09:48:13 +03:00
// Copyright 2017 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"
api "code.gitea.io/sdk/gitea"
)
2017-11-01 05:25:14 +03:00
func trackedTimesToAPIFormat ( trackedTimes [ ] * models . TrackedTime ) [ ] * api . TrackedTime {
apiTrackedTimes := make ( [ ] * api . TrackedTime , len ( trackedTimes ) )
for i , trackedTime := range trackedTimes {
apiTrackedTimes [ i ] = trackedTime . APIFormat ( )
}
return apiTrackedTimes
}
2017-09-12 09:48:13 +03:00
// ListTrackedTimes list all the tracked times of an issue
func ListTrackedTimes ( ctx * context . APIContext ) {
2017-11-13 10:02:25 +03:00
// swagger:operation GET /repos/{owner}/{repo}/issues/{index}/times issue issueTrackedTimes
// ---
// summary: List an issue's tracked times
// 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: repo
// in: path
// description: index of the issue
// type: integer
// required: true
// responses:
// "200":
// "$ref": "#/responses/TrackedTimeList"
2017-09-12 09:48:13 +03:00
if ! ctx . Repo . Repository . IsTimetrackerEnabled ( ) {
ctx . Error ( 404 , "IsTimetrackerEnabled" , "Timetracker is diabled" )
return
}
issue , err := models . GetIssueByIndex ( ctx . Repo . Repository . ID , ctx . ParamsInt64 ( ":index" ) )
if err != nil {
if models . IsErrIssueNotExist ( err ) {
ctx . Error ( 404 , "GetIssueByIndex" , err )
} else {
ctx . Error ( 500 , "GetIssueByIndex" , err )
}
return
}
2017-11-01 05:25:14 +03:00
trackedTimes , err := models . GetTrackedTimes ( models . FindTrackedTimesOptions { IssueID : issue . ID } )
if err != nil {
2017-09-12 09:48:13 +03:00
ctx . Error ( 500 , "GetTrackedTimesByIssue" , err )
2017-11-01 05:25:14 +03:00
return
2017-09-12 09:48:13 +03:00
}
2017-11-01 05:25:14 +03:00
apiTrackedTimes := trackedTimesToAPIFormat ( trackedTimes )
ctx . JSON ( 200 , & apiTrackedTimes )
2017-09-12 09:48:13 +03:00
}
// AddTime adds time manual to the given issue
func AddTime ( ctx * context . APIContext , form api . AddTimeOption ) {
2017-11-13 10:02:25 +03:00
// swagger:operation Post /repos/{owner}/{repo}/issues/{index}/times issue issueAddTime
// ---
// summary: Add a tracked time to a 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 to add tracked time to
// type: integer
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/AddTimeOption"
// responses:
// "200":
// "$ref": "#/responses/TrackedTime"
// "400":
// "$ref": "#/responses/error"
// "403":
// "$ref": "#/responses/error"
2017-09-12 09:48:13 +03:00
issue , err := models . GetIssueByIndex ( ctx . Repo . Repository . ID , ctx . ParamsInt64 ( ":index" ) )
if err != nil {
if models . IsErrIssueNotExist ( err ) {
ctx . Error ( 404 , "GetIssueByIndex" , err )
} else {
ctx . Error ( 500 , "GetIssueByIndex" , err )
}
return
}
if ! ctx . Repo . CanUseTimetracker ( issue , ctx . User ) {
if ! ctx . Repo . Repository . IsTimetrackerEnabled ( ) {
ctx . JSON ( 400 , struct { Message string } { Message : "time tracking disabled" } )
return
}
ctx . Status ( 403 )
return
}
2017-11-01 05:25:14 +03:00
trackedTime , err := models . AddTime ( ctx . User , issue , form . Time )
if err != nil {
2017-09-12 09:48:13 +03:00
ctx . Error ( 500 , "AddTime" , err )
return
}
2017-11-01 05:25:14 +03:00
ctx . JSON ( 200 , trackedTime . APIFormat ( ) )
2017-09-12 09:48:13 +03:00
}
// ListTrackedTimesByUser lists all tracked times of the user
func ListTrackedTimesByUser ( ctx * context . APIContext ) {
2017-11-13 10:02:25 +03:00
// swagger:operation GET /repos/{owner}/{repo}/times/{tracker} user userTrackedTimes
// ---
// summary: List a user's tracked times in a repo
// 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: user
// in: path
// description: username of user
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/TrackedTimeList"
2017-09-12 09:48:13 +03:00
if ! ctx . Repo . Repository . IsTimetrackerEnabled ( ) {
ctx . JSON ( 400 , struct { Message string } { Message : "time tracking disabled" } )
return
}
user , err := models . GetUserByName ( ctx . Params ( ":timetrackingusername" ) )
if err != nil {
if models . IsErrUserNotExist ( err ) {
ctx . Error ( 404 , "GetUserByName" , err )
} else {
ctx . Error ( 500 , "GetUserByName" , err )
}
return
}
if user == nil {
ctx . Status ( 404 )
return
}
2017-11-01 05:25:14 +03:00
trackedTimes , err := models . GetTrackedTimes ( models . FindTrackedTimesOptions {
UserID : user . ID ,
RepositoryID : ctx . Repo . Repository . ID } )
if err != nil {
2017-09-12 09:48:13 +03:00
ctx . Error ( 500 , "GetTrackedTimesByUser" , err )
2017-11-01 05:25:14 +03:00
return
2017-09-12 09:48:13 +03:00
}
2017-11-01 05:25:14 +03:00
apiTrackedTimes := trackedTimesToAPIFormat ( trackedTimes )
ctx . JSON ( 200 , & apiTrackedTimes )
2017-09-12 09:48:13 +03:00
}
2017-11-13 10:02:25 +03:00
// ListTrackedTimesByRepository lists all tracked times of the repository
2017-09-12 09:48:13 +03:00
func ListTrackedTimesByRepository ( ctx * context . APIContext ) {
2017-11-13 10:02:25 +03:00
// swagger:operation GET /repos/{owner}/{repo}/times repository repoTrackedTimes
// ---
// summary: List a repo's tracked times
// 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
// responses:
// "200":
// "$ref": "#/responses/TrackedTimeList"
2017-09-12 09:48:13 +03:00
if ! ctx . Repo . Repository . IsTimetrackerEnabled ( ) {
ctx . JSON ( 400 , struct { Message string } { Message : "time tracking disabled" } )
return
}
2017-11-01 05:25:14 +03:00
trackedTimes , err := models . GetTrackedTimes ( models . FindTrackedTimesOptions {
RepositoryID : ctx . Repo . Repository . ID } )
if err != nil {
2017-09-12 09:48:13 +03:00
ctx . Error ( 500 , "GetTrackedTimesByUser" , err )
2017-11-01 05:25:14 +03:00
return
2017-09-12 09:48:13 +03:00
}
2017-11-01 05:25:14 +03:00
apiTrackedTimes := trackedTimesToAPIFormat ( trackedTimes )
ctx . JSON ( 200 , & apiTrackedTimes )
2017-09-12 09:48:13 +03:00
}
// ListMyTrackedTimes lists all tracked times of the current user
func ListMyTrackedTimes ( ctx * context . APIContext ) {
2017-11-13 10:02:25 +03:00
// swagger:operation GET /user/times user userCurrentTrackedTimes
// ---
// summary: List the current user's tracked times
// produces:
// - application/json
// responses:
// "200":
// "$ref": "#/responses/TrackedTimeList"
2017-11-01 05:25:14 +03:00
trackedTimes , err := models . GetTrackedTimes ( models . FindTrackedTimesOptions { UserID : ctx . User . ID } )
if err != nil {
2017-09-12 09:48:13 +03:00
ctx . Error ( 500 , "GetTrackedTimesByUser" , err )
2017-11-01 05:25:14 +03:00
return
2017-09-12 09:48:13 +03:00
}
2017-11-01 05:25:14 +03:00
apiTrackedTimes := trackedTimesToAPIFormat ( trackedTimes )
ctx . JSON ( 200 , & apiTrackedTimes )
2017-09-12 09:48:13 +03:00
}