package gitlab import ( "fmt" "net/url" ) // timeStatsService handles communication with the time tracking related // methods of the GitLab API. // // GitLab docs: https://docs.gitlab.com/ce/workflow/time_tracking.html type timeStatsService struct { client *Client } // TimeStats represents the time estimates and time spent for an issue. // // GitLab docs: https://docs.gitlab.com/ce/workflow/time_tracking.html type TimeStats struct { HumanTimeEstimate string `json:"human_time_estimate"` HumanTotalTimeSpent string `json:"human_total_time_spent"` TimeEstimate int `json:"time_estimate"` TotalTimeSpent int `json:"total_time_spent"` } func (t TimeStats) String() string { return Stringify(t) } // SetTimeEstimateOptions represents the available SetTimeEstimate() // options. // // GitLab docs: https://docs.gitlab.com/ce/workflow/time_tracking.html type SetTimeEstimateOptions struct { Duration *string `url:"duration,omitempty" json:"duration,omitempty"` } // setTimeEstimate sets the time estimate for a single project issue. // // GitLab docs: https://docs.gitlab.com/ce/workflow/time_tracking.html func (s *timeStatsService) setTimeEstimate(pid interface{}, entity string, issue int, opt *SetTimeEstimateOptions, options ...OptionFunc) (*TimeStats, *Response, error) { project, err := parseID(pid) if err != nil { return nil, nil, err } u := fmt.Sprintf("projects/%s/%s/%d/time_estimate", url.QueryEscape(project), entity, issue) req, err := s.client.NewRequest("POST", u, opt, options) if err != nil { return nil, nil, err } t := new(TimeStats) resp, err := s.client.Do(req, t) if err != nil { return nil, resp, err } return t, resp, err } // resetTimeEstimate resets the time estimate for a single project issue. // // GitLab docs: https://docs.gitlab.com/ce/workflow/time_tracking.html func (s *timeStatsService) resetTimeEstimate(pid interface{}, entity string, issue int, options ...OptionFunc) (*TimeStats, *Response, error) { project, err := parseID(pid) if err != nil { return nil, nil, err } u := fmt.Sprintf("projects/%s/%s/%d/reset_time_estimate", url.QueryEscape(project), entity, issue) req, err := s.client.NewRequest("POST", u, nil, options) if err != nil { return nil, nil, err } t := new(TimeStats) resp, err := s.client.Do(req, t) if err != nil { return nil, resp, err } return t, resp, err } // AddSpentTimeOptions represents the available AddSpentTime() options. // // GitLab docs: https://docs.gitlab.com/ce/workflow/time_tracking.html type AddSpentTimeOptions struct { Duration *string `url:"duration,omitempty" json:"duration,omitempty"` } // addSpentTime adds spent time for a single project issue. // // GitLab docs: https://docs.gitlab.com/ce/workflow/time_tracking.html func (s *timeStatsService) addSpentTime(pid interface{}, entity string, issue int, opt *AddSpentTimeOptions, options ...OptionFunc) (*TimeStats, *Response, error) { project, err := parseID(pid) if err != nil { return nil, nil, err } u := fmt.Sprintf("projects/%s/%s/%d/add_spent_time", url.QueryEscape(project), entity, issue) req, err := s.client.NewRequest("POST", u, opt, options) if err != nil { return nil, nil, err } t := new(TimeStats) resp, err := s.client.Do(req, t) if err != nil { return nil, resp, err } return t, resp, err } // resetSpentTime resets the spent time for a single project issue. // // GitLab docs: https://docs.gitlab.com/ce/workflow/time_tracking.html func (s *timeStatsService) resetSpentTime(pid interface{}, entity string, issue int, options ...OptionFunc) (*TimeStats, *Response, error) { project, err := parseID(pid) if err != nil { return nil, nil, err } u := fmt.Sprintf("projects/%s/%s/%d/reset_spent_time", url.QueryEscape(project), entity, issue) req, err := s.client.NewRequest("POST", u, nil, options) if err != nil { return nil, nil, err } t := new(TimeStats) resp, err := s.client.Do(req, t) if err != nil { return nil, resp, err } return t, resp, err } // getTimeSpent gets the spent time for a single project issue. // // GitLab docs: https://docs.gitlab.com/ce/workflow/time_tracking.html func (s *timeStatsService) getTimeSpent(pid interface{}, entity string, issue int, options ...OptionFunc) (*TimeStats, *Response, error) { project, err := parseID(pid) if err != nil { return nil, nil, err } u := fmt.Sprintf("projects/%s/%s/%d/time_stats", url.QueryEscape(project), entity, issue) req, err := s.client.NewRequest("GET", u, nil, options) if err != nil { return nil, nil, err } t := new(TimeStats) resp, err := s.client.Do(req, t) if err != nil { return nil, resp, err } return t, resp, err }