|
|
@ -0,0 +1,173 @@ |
|
|
|
|
|
// Copyright 2016 The go-github AUTHORS. All rights reserved.
|
|
|
|
|
|
//
|
|
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
|
|
|
|
package github |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
|
"fmt" |
|
|
|
|
|
"strconv" |
|
|
|
|
|
"time" |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// TrafficReferrer represent information about traffic from a referrer .
|
|
|
|
|
|
type TrafficReferrer struct { |
|
|
|
|
|
Referrer *string `json:"referrer,omitempty"` |
|
|
|
|
|
Count *int `json:"count,omitempty"` |
|
|
|
|
|
Uniques *int `json:"uniques,omitempty"` |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TrafficPath represent information about the traffic on a path of the repo.
|
|
|
|
|
|
type TrafficPath struct { |
|
|
|
|
|
Path *string `json:"path,omitempty"` |
|
|
|
|
|
Title *string `json:"title,omitempty"` |
|
|
|
|
|
Count *int `json:"count,omitempty"` |
|
|
|
|
|
Uniques *int `json:"uniques,omitempty"` |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TimestampMS represents a timestamp as used in datapoint.
|
|
|
|
|
|
//
|
|
|
|
|
|
// It's only used to parse the result given by the API which are unix timestamp in milliseonds.
|
|
|
|
|
|
type TimestampMS struct { |
|
|
|
|
|
time.Time |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// UnmarshalJSON parse unix timestamp.
|
|
|
|
|
|
func (t *TimestampMS) UnmarshalJSON(b []byte) error { |
|
|
|
|
|
s := string(b) |
|
|
|
|
|
i, err := strconv.ParseInt(s, 10, 64) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return err |
|
|
|
|
|
} |
|
|
|
|
|
// We can drop the reaminder as returned values are days and it will always be 0
|
|
|
|
|
|
*t = TimestampMS{time.Unix(i/1000, 0)} |
|
|
|
|
|
return nil |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TrafficData represent information about a specific timestamp in views or clones list.
|
|
|
|
|
|
type TrafficData struct { |
|
|
|
|
|
Timestamp *TimestampMS `json:"timestamp,omitempty"` |
|
|
|
|
|
Count *int `json:"count,omitempty"` |
|
|
|
|
|
Uniques *int `json:"uniques,omitempty"` |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TrafficViews represent information about the number of views in the last 14 days.
|
|
|
|
|
|
type TrafficViews struct { |
|
|
|
|
|
Views *[]TrafficData `json:"views,omitempty"` |
|
|
|
|
|
Count *int `json:"count,omitempty"` |
|
|
|
|
|
Uniques *int `json:"uniques,omitempty"` |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TrafficClones represent information about the number of clones in the last 14 days.
|
|
|
|
|
|
type TrafficClones struct { |
|
|
|
|
|
Clones *[]TrafficData `json:"clones,omitempty"` |
|
|
|
|
|
Count *int `json:"count,omitempty"` |
|
|
|
|
|
Uniques *int `json:"uniques,omitempty"` |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TrafficBreakdownOptions specifies the parameters to methods that support breakdown per day or week.
|
|
|
|
|
|
// Can be one of: day, week. Default: day.
|
|
|
|
|
|
type TrafficBreakdownOptions struct { |
|
|
|
|
|
Per string `url:"per,omitempty"` |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ListTrafficReferrers list the top 10 referrers over the last 14 days.
|
|
|
|
|
|
//
|
|
|
|
|
|
// GitHub API docs: https://developer.github.com/v3/repos/traffic/#list-referrers
|
|
|
|
|
|
func (s *RepositoriesService) ListTrafficReferrers(owner, repo string) ([]*TrafficReferrer, *Response, error) { |
|
|
|
|
|
u := fmt.Sprintf("repos/%v/%v/traffic/popular/referrers", owner, repo) |
|
|
|
|
|
|
|
|
|
|
|
req, err := s.client.NewRequest("GET", u, nil) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, nil, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TODO: remove custom Accept header when this API fully launches.
|
|
|
|
|
|
req.Header.Set("Accept", mediaTypeTrafficPreview) |
|
|
|
|
|
|
|
|
|
|
|
trafficReferrers := new([]*TrafficReferrer) |
|
|
|
|
|
resp, err := s.client.Do(req, &trafficReferrers) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, resp, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return *trafficReferrers, resp, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ListTrafficPaths list the top 10 popular content over the last 14 days.
|
|
|
|
|
|
//
|
|
|
|
|
|
// GitHub API docs: https://developer.github.com/v3/repos/traffic/#list-paths
|
|
|
|
|
|
func (s *RepositoriesService) ListTrafficPaths(owner, repo string) ([]*TrafficPath, *Response, error) { |
|
|
|
|
|
u := fmt.Sprintf("repos/%v/%v/traffic/popular/paths", owner, repo) |
|
|
|
|
|
|
|
|
|
|
|
req, err := s.client.NewRequest("GET", u, nil) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, nil, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TODO: remove custom Accept header when this API fully launches.
|
|
|
|
|
|
req.Header.Set("Accept", mediaTypeTrafficPreview) |
|
|
|
|
|
|
|
|
|
|
|
var paths = new([]*TrafficPath) |
|
|
|
|
|
resp, err := s.client.Do(req, &paths) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, resp, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return *paths, resp, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ListTrafficViews get total number of views for the last 14 days and breaks it down either per day or week.
|
|
|
|
|
|
//
|
|
|
|
|
|
// GitHub API docs: https://developer.github.com/v3/repos/traffic/#views
|
|
|
|
|
|
func (s *RepositoriesService) ListTrafficViews(owner, repo string, opt *TrafficBreakdownOptions) (*TrafficViews, *Response, error) { |
|
|
|
|
|
u := fmt.Sprintf("repos/%v/%v/traffic/views", owner, repo) |
|
|
|
|
|
u, err := addOptions(u, opt) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, nil, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
req, err := s.client.NewRequest("GET", u, nil) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, nil, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TODO: remove custom Accept header when this API fully launches.
|
|
|
|
|
|
req.Header.Set("Accept", mediaTypeTrafficPreview) |
|
|
|
|
|
|
|
|
|
|
|
trafficViews := new(TrafficViews) |
|
|
|
|
|
resp, err := s.client.Do(req, &trafficViews) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, resp, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return trafficViews, resp, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ListTrafficClones get total number of clones for the last 14 days and breaks it down either per day or week for the last 14 days.
|
|
|
|
|
|
//
|
|
|
|
|
|
// GitHub API docs: https://developer.github.com/v3/repos/traffic/#views
|
|
|
|
|
|
func (s *RepositoriesService) ListTrafficClones(owner, repo string, opt *TrafficBreakdownOptions) (*TrafficClones, *Response, error) { |
|
|
|
|
|
u := fmt.Sprintf("repos/%v/%v/traffic/clones", owner, repo) |
|
|
|
|
|
u, err := addOptions(u, opt) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, nil, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
req, err := s.client.NewRequest("GET", u, nil) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, nil, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TODO: remove custom Accept header when this API fully launches.
|
|
|
|
|
|
req.Header.Set("Accept", mediaTypeTrafficPreview) |
|
|
|
|
|
|
|
|
|
|
|
trafficClones := new(TrafficClones) |
|
|
|
|
|
resp, err := s.client.Do(req, &trafficClones) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, resp, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return trafficClones, resp, err |
|
|
|
|
|
} |