mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
Rough JIRA implementation. Currently gets all issues assigned to user
This commit is contained in:
parent
8d131907a2
commit
dd170c0ab3
@ -10,31 +10,51 @@ import (
|
||||
"os"
|
||||
)
|
||||
|
||||
func Fetch() string {
|
||||
resp, err := jiraRequest("/rest/api/2/project/CORE")
|
||||
if err != nil {
|
||||
return err.Error()
|
||||
}
|
||||
|
||||
project := &JiraProject{}
|
||||
parseJson(project, resp.Body)
|
||||
//fmt.Printf("%#v\n", project)
|
||||
|
||||
return ""
|
||||
type SearchResult struct {
|
||||
StartAt int `json:"startAt"`
|
||||
MaxResults int `json:"maxResults"`
|
||||
Total int `json:"total"`
|
||||
Issues []Issue `json:"issues"`
|
||||
}
|
||||
|
||||
func IssuesFor(username string) ([]JiraIssue, error) {
|
||||
type Issue struct {
|
||||
Expand string `json:"expand"`
|
||||
ID string `json:"id"`
|
||||
Self string `json:"self"`
|
||||
Key string `json:"key"`
|
||||
|
||||
IssueFields *IssueFields `json:"fields"`
|
||||
}
|
||||
|
||||
type IssueFields struct {
|
||||
Summary string `json:"summary"`
|
||||
|
||||
IssueType *IssueType `json:"issuetype"`
|
||||
}
|
||||
|
||||
type IssueType struct {
|
||||
Self string `json:"self"`
|
||||
ID string `json:"id"`
|
||||
Description string `json:"description"`
|
||||
IconURL string `json:"iconUrl"`
|
||||
Name string `json:"name"`
|
||||
Subtask bool `json:"subtask"`
|
||||
}
|
||||
|
||||
/* -------------------- -------------------- */
|
||||
|
||||
func IssuesFor(username string) (*SearchResult, error) {
|
||||
url := fmt.Sprintf("/rest/api/2/search?jql=assignee=%s", username)
|
||||
|
||||
resp, err := jiraRequest(url)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return &SearchResult{}, err
|
||||
}
|
||||
|
||||
issues := []JiraIssue{}
|
||||
parseJson(issues, resp.Body)
|
||||
searchResult := &SearchResult{}
|
||||
parseJson(searchResult, resp.Body)
|
||||
|
||||
return issues, nil
|
||||
return searchResult, nil
|
||||
}
|
||||
|
||||
/* -------------------- Unexported Functions -------------------- */
|
||||
|
140
jira/structs.go
140
jira/structs.go
@ -1,140 +0,0 @@
|
||||
package jira
|
||||
|
||||
import ()
|
||||
|
||||
type JiraIssue struct {
|
||||
Fields JiraIssueFields
|
||||
Id string
|
||||
Key string
|
||||
Self string
|
||||
}
|
||||
|
||||
type JiraIssueFields struct {
|
||||
Comment JiraIssueComment
|
||||
Description string
|
||||
Project JiraIssueProject
|
||||
SubTasks []JiraIssueSubTask
|
||||
TimeTracking JiraIssueTimetracking
|
||||
Updated string
|
||||
Watcher JiraIssueWatcher
|
||||
}
|
||||
|
||||
type JiraIssueWatcher struct {
|
||||
IsWatching bool
|
||||
Self string
|
||||
WatchCount int
|
||||
Watchers []JiraAttribute
|
||||
}
|
||||
|
||||
type JiraIssueSubTask struct {
|
||||
Id string
|
||||
Type struct {
|
||||
Id string
|
||||
Name string
|
||||
Inward string
|
||||
Outward string
|
||||
}
|
||||
OutwardIssue struct {
|
||||
Id string
|
||||
Key string
|
||||
Self string
|
||||
Fields struct {
|
||||
Status struct {
|
||||
IconUrl string
|
||||
Name string
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type JiraIssueProject struct {
|
||||
Id string
|
||||
Key string
|
||||
Name string
|
||||
ProjectCategory JiraAttribute
|
||||
Self string
|
||||
Simplified bool
|
||||
}
|
||||
|
||||
type JiraIssueComment struct {
|
||||
Author JiraAttribute
|
||||
Body string
|
||||
Created string
|
||||
Id string
|
||||
Self string
|
||||
UpdateAuthor JiraAttribute
|
||||
Updated string
|
||||
Visibility struct {
|
||||
Type string
|
||||
Value string
|
||||
}
|
||||
}
|
||||
|
||||
type JiraAttribute struct {
|
||||
Active bool
|
||||
DisplayName string
|
||||
Name string
|
||||
Self string
|
||||
}
|
||||
|
||||
type JiraIssueTimetracking struct {
|
||||
OriginalEstimate string
|
||||
OriginalEstimateSeconds int
|
||||
RemainingEstimate string
|
||||
RemainingEstimateSeconds int
|
||||
TimeSpent string
|
||||
TimeSpentSeconds int
|
||||
}
|
||||
|
||||
type JiraProject struct {
|
||||
AssigneeType string
|
||||
Components []JiraProjectComponent
|
||||
Email string
|
||||
IssueTypes []JiraProjectIssueType
|
||||
Lead JiraProjectMember
|
||||
Name string
|
||||
ProjectCategory JiraProjectCategory
|
||||
Simplified bool
|
||||
Url string
|
||||
|
||||
JiraAttribute
|
||||
}
|
||||
|
||||
type JiraProjectCategory struct {
|
||||
Description string
|
||||
Id string
|
||||
Name string
|
||||
Self string
|
||||
}
|
||||
|
||||
type JiraProjectComponent struct {
|
||||
Assignee JiraProjectMember
|
||||
AssigneeType string
|
||||
IsAssigneeTypeValid bool
|
||||
Lead JiraProjectMember
|
||||
Project string
|
||||
ProjectId int
|
||||
RealAssigne JiraProjectMember
|
||||
RealAssigneeType string
|
||||
|
||||
JiraAttribute
|
||||
}
|
||||
|
||||
type JiraProjectIssueType struct {
|
||||
AvatarId int
|
||||
Description string
|
||||
IconUrl string
|
||||
Id string
|
||||
Name string
|
||||
Self string
|
||||
SubTask bool
|
||||
}
|
||||
|
||||
type JiraProjectMember struct {
|
||||
AccountId string
|
||||
Active bool
|
||||
DisplayName string
|
||||
Key string
|
||||
Name string
|
||||
Self string
|
||||
}
|
@ -33,19 +33,27 @@ func (widget *Widget) Refresh() {
|
||||
return
|
||||
}
|
||||
|
||||
issues, err := IssuesFor(Config.UString("wtf.mods.jira.username"))
|
||||
searchResult, err := IssuesFor(Config.UString("wtf.mods.jira.username"))
|
||||
|
||||
widget.View.SetTitle(fmt.Sprintf(" %s ", widget.Name))
|
||||
widget.RefreshedAt = time.Now()
|
||||
|
||||
widget.View.Clear()
|
||||
|
||||
if err != nil {
|
||||
widget.View.SetWrap(true)
|
||||
widget.View.SetTitle(fmt.Sprintf(" %s ", widget.Name))
|
||||
fmt.Fprintf(widget.View, "%v", err)
|
||||
} else {
|
||||
widget.View.SetWrap(false)
|
||||
fmt.Fprintf(widget.View, "%v", issues)
|
||||
widget.View.SetTitle(
|
||||
fmt.Sprintf(
|
||||
" %s: [green]%s[white] (%d)",
|
||||
widget.Name,
|
||||
Config.UString("wtf.mods.jira.project"),
|
||||
len(searchResult.Issues),
|
||||
),
|
||||
)
|
||||
fmt.Fprintf(widget.View, "%s", widget.contentFrom(searchResult))
|
||||
}
|
||||
}
|
||||
|
||||
@ -61,3 +69,36 @@ func (widget *Widget) addView() {
|
||||
|
||||
widget.View = view
|
||||
}
|
||||
|
||||
func (widget *Widget) contentFrom(searchResult *SearchResult) string {
|
||||
str := " [red]Assigned Issues[white]\n"
|
||||
|
||||
for _, issue := range searchResult.Issues {
|
||||
str = str + fmt.Sprintf(
|
||||
" [%s]%-6s[white] [green]%-10s[white] %s\n",
|
||||
widget.issueTypeColor(&issue),
|
||||
issue.IssueFields.IssueType.Name,
|
||||
issue.Key,
|
||||
issue.IssueFields.Summary,
|
||||
)
|
||||
}
|
||||
|
||||
return str
|
||||
}
|
||||
|
||||
func (widget *Widget) issueTypeColor(issue *Issue) string {
|
||||
var color string
|
||||
|
||||
switch issue.IssueFields.IssueType.Name {
|
||||
case "Bug":
|
||||
color = "red"
|
||||
case "Story":
|
||||
color = "blue"
|
||||
case "Task":
|
||||
color = "orange"
|
||||
default:
|
||||
color = "white"
|
||||
}
|
||||
|
||||
return color
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user