Skip to content

Commit

Permalink
Move API to extra package
Browse files Browse the repository at this point in the history
  • Loading branch information
berlam committed Oct 4, 2019
1 parent b262ebe commit afef57f
Show file tree
Hide file tree
Showing 10 changed files with 538 additions and 499 deletions.
22 changes: 21 additions & 1 deletion pkg/http.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,31 @@
package pkg

import "net/http"
import (
"io"
"net/http"
"net/url"
)

func NewHttpClient() *http.Client {
return &http.Client{}
}

func CreateJsonRequest(client *http.Client, httpMethod string, server *url.URL, userinfo *url.Userinfo, payload io.Reader) (*http.Response, error) {
request, err := http.NewRequest(httpMethod, server.String(), payload)
if err != nil {
return nil, err
}
password, _ := userinfo.Password()
request.SetBasicAuth(userinfo.Username(), password)
request.Header.Set("Content-Type", "application/json")
request.Header.Set("Accept", "application/json")
response, err := client.Do(request)
if err != nil {
return nil, err
}
return response, err
}

type RoundTripFunc func(req *http.Request) *http.Response

func (f RoundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) {
Expand Down
123 changes: 34 additions & 89 deletions pkg/jira/jira.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package jira

import (
"eager/pkg"
"eager/pkg/jira/model"
"eager/pkg/jira/v2"
"eager/pkg/jira/v3"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
Expand All @@ -15,13 +17,12 @@ import (
)

const (
headerAccountId = "X-AACCOUNTID"
jiraServerInfo = "/rest/api/latest/serverInfo"
jiraServerInfo = "/rest/api/latest/serverInfo"
)

func getApiVersion(client *http.Client, server *url.URL, userinfo *url.Userinfo) (Api, error) {
func getApiVersion(client *http.Client, server *url.URL, userinfo *url.Userinfo) (model.Api, error) {
infoUrl, err := server.Parse(fmt.Sprintf(jiraServerInfo))
response, err := createRequest(client, http.MethodGet, infoUrl, userinfo, nil)
response, err := pkg.CreateJsonRequest(client, http.MethodGet, infoUrl, userinfo, nil)
if err != nil {
return nil, err
}
Expand All @@ -47,13 +48,17 @@ func getApiVersion(client *http.Client, server *url.URL, userinfo *url.Userinfo)
}
// There are "Cloud" and "Server" deployment types.
if strings.ToLower(result.DeploymentType) == "cloud" {
return &v3{
client: client,
server: server,
userinfo: userinfo,
return &v3.Api{
Client: client,
Server: server,
Userinfo: userinfo,
}, nil
}
return &v2{}, nil
return &v2.Api{
Client: client,
Server: server,
Userinfo: userinfo,
}, nil
}

func GetTimesheet(client *http.Client, server *url.URL, userinfo *url.Userinfo, year int, month time.Month, projects []pkg.Project) pkg.Timesheet {
Expand All @@ -64,8 +69,8 @@ func GetTimesheet(client *http.Client, server *url.URL, userinfo *url.Userinfo,
}
fromDate, toDate := pkg.GetTimeRange(year, month)

jql := new(jql).between(fromDate, toDate).me().projects(projects...)
accountId, issues, err := api.issues(jql, 0)
jql := new(model.Jql).Between(fromDate, toDate).Me().Projects(projects...)
accountId, issues, err := api.Issues(jql, 0)

if err != nil {
log.Println("Could not get Jira issues.", err)
Expand All @@ -76,14 +81,14 @@ func GetTimesheet(client *http.Client, server *url.URL, userinfo *url.Userinfo,
var wg sync.WaitGroup
wg.Add(len(issues))
for _, item := range issues {
go func(item Issue) {
go func(item model.Issue) {
defer wg.Done()
items, err := api.worklog(item.key(), 0)
items, err := api.Worklog(item.Key(), 0)
if err != nil {
log.Println("Could not get effort for "+item.key(), err)
log.Println("Could not get effort for "+item.Key(), err)
return
}
c <- item.worklog(items, fromDate, toDate)[accountId]
c <- item.Worklog(items, fromDate, toDate)[accountId]
}(item)
}
go func() {
Expand All @@ -108,15 +113,15 @@ func GetBulkTimesheet(client *http.Client, server *url.URL, userinfo *url.Userin
fromDate, toDate := pkg.GetTimeRange(year, month)

if projects == nil || len(projects) == 0 {
projects, err = api.projects(0)
projects, err = api.Projects(0)
if err != nil {
log.Println("Could not get projects.", err)
return pkg.Timesheet{}
}
}

if users != nil && len(users) > 0 {
accounts, err := api.accounts(projects, users)
accounts, err := api.Accounts(projects, users)
if err != nil {
log.Println("Could not get user.", err)
return pkg.Timesheet{}
Expand All @@ -128,8 +133,8 @@ func GetBulkTimesheet(client *http.Client, server *url.URL, userinfo *url.Userin
}
}

jql := new(jql).between(fromDate, toDate).users(users...).projects(projects...)
_, issues, err := api.issues(jql, 0)
jql := new(model.Jql).Between(fromDate, toDate).Users(users...).Projects(projects...)
_, issues, err := api.Issues(jql, 0)

if err != nil {
log.Println("Could not get issues.", err)
Expand All @@ -140,16 +145,16 @@ func GetBulkTimesheet(client *http.Client, server *url.URL, userinfo *url.Userin
var wg sync.WaitGroup
wg.Add(len(issues))
for _, item := range issues {
go func(item Issue) {
go func(item model.Issue) {
defer wg.Done()
items, err := api.worklog(item.key(), 0)
items, err := api.Worklog(item.Key(), 0)
if err != nil {
log.Println("Could not get effort for "+item.key(), err)
log.Println("Could not get effort for "+item.Key(), err)
return
}
worklog := item.worklog(items, fromDate, toDate)
worklog := item.Worklog(items, fromDate, toDate)
for _, user := range users {
c <- worklog[Account(user)]
c <- worklog[model.Account(user)]
}
}(item)
}
Expand All @@ -165,68 +170,8 @@ func GetBulkTimesheet(client *http.Client, server *url.URL, userinfo *url.Userin
return timesheet
}

func createRequest(client *http.Client, httpMethod string, server *url.URL, userinfo *url.Userinfo, payload io.Reader) (*http.Response, error) {
request, err := http.NewRequest(httpMethod, server.String(), payload)
if err != nil {
return nil, err
}
password, _ := userinfo.Password()
request.SetBasicAuth(userinfo.Username(), password)
request.Header.Set("Content-Type", "application/json")
request.Header.Set("Accept", "application/json")
response, err := client.Do(request)
if err != nil {
return nil, err
}
return response, err
}

type Account string

type IssueKey string

type Api interface {
ProjectAccessor
AccountAccessor
UserAccessor
IssueAccessor
WorklogAccessor
}

type ProjectAccessor interface {
projects(startAt int) ([]pkg.Project, error)
}

type AccountAccessor interface {
accounts(projects []pkg.Project, users []pkg.User) (map[pkg.User]Account, error)
}

type UserAccessor interface {
user(user pkg.User, projects []pkg.Project) (Account, error)
}

type IssueAccessor interface {
issues(jql jql, startAt int) (Account, []Issue, error)
}

type WorklogAccessor interface {
worklog(key IssueKey, startAt int) ([]Worklog, error)
}

type Issue interface {
key() IssueKey
worklog(worklog []Worklog, fromDate, toDate time.Time) map[Account]pkg.Timesheet
}

type Worklog interface {
isBetween(fromDate, toDate time.Time) bool
author() Author
date() time.Time
comment() pkg.Description
duration() time.Duration
}

type Author interface {
id() Account
name() string
type serverInfo struct {
VersionNumbers []int `json:"versionNumbers"`
DeploymentType string `json:"deploymentType"`
ServerTitle string `json:"serverTitle"`
}
26 changes: 0 additions & 26 deletions pkg/jira/jira_v2.go

This file was deleted.

Loading

0 comments on commit afef57f

Please sign in to comment.