Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev #31

Merged
merged 5 commits into from Apr 30, 2021
Merged

Dev #31

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
35 changes: 35 additions & 0 deletions jira/examples/issue-fields-configurations/assign/assign.go
@@ -0,0 +1,35 @@
package main

import (
"context"
"github.com/ctreminiom/go-atlassian/jira"
"log"
"os"
)

func main() {

var (
host = os.Getenv("HOST")
mail = os.Getenv("MAIL")
token = os.Getenv("TOKEN")
)

atlassian, err := jira.New(nil, host)
if err != nil {
return
}

atlassian.Auth.SetBasicAuth(mail, token)

response, err := atlassian.Issue.Field.Configuration.Assign(context.Background(), "10001", "10001")
if err != nil {
if response != nil {
log.Println("Response HTTP Response", string(response.BodyAsBytes))
}
return
}

log.Println("Response HTTP Code", response.StatusCode)
log.Println("HTTP Endpoint Used", response.Endpoint)
}
2 changes: 1 addition & 1 deletion jira/examples/issue/edit/edit.go
Expand Up @@ -24,7 +24,7 @@ func main() {

var payload = jira.IssueScheme{
Fields: &jira.IssueFieldsScheme{
Summary: "New summary test test",
// Summary: "New summary test test",
},
}

Expand Down
10 changes: 9 additions & 1 deletion jira/examples/issue/get/get.go
Expand Up @@ -22,7 +22,7 @@ func main() {

atlassian.Auth.SetBasicAuth(mail, token)

issue, response, err := atlassian.Issue.Get(context.Background(), "KP-12", nil, []string{"transitions"})
issue, response, err := atlassian.Issue.Get(context.Background(), "KP-2", nil, []string{"transitions"})
if err != nil {
if response != nil {
log.Println("Response HTTP Response", string(response.BodyAsBytes))
Expand All @@ -41,4 +41,12 @@ func main() {
log.Println(transition.Name, transition.ID, transition.To.ID, transition.HasScreen)
}

// Check if the issue contains sub-tasks
if issue.Fields.Subtasks != nil {

for _, subTask := range *issue.Fields.Subtasks {
log.Println("Sub-Task: ", subTask.Key, subTask.Fields.Summary)
}

}
}
35 changes: 34 additions & 1 deletion jira/examples/issue/move/main.go
Expand Up @@ -22,7 +22,40 @@ func main() {

atlassian.Auth.SetBasicAuth(mail, token)

response, err := atlassian.Issue.Move(context.Background(), "KP-2", "11")
var payload = &jira.IssueScheme{
Fields: &jira.IssueFieldsScheme{
Summary: "New summary test test",
},
}

//CustomFields
var customFields = &jira.CustomFields{}
err = customFields.Groups("customfield_10052", []string{"jira-administrators", "jira-administrators-system"})
if err != nil {
log.Fatal(err)
}

//Issue Update Operations
var operations = &jira.UpdateOperations{}

err = operations.AddArrayOperation("labels", map[string]string{
"triaged": "add",
"triaged-2": "add",
"triaged-1": "add",
"blocker": "add",
})

if err != nil {
log.Fatal(err)
}

options := &jira.IssueMoveOptions{
Fields: payload,
Operations: operations,
CustomFields: customFields,
}

response, err := atlassian.Issue.Move(context.Background(), "KP-7", "41", options)
if err != nil {
if response != nil {
log.Println("Response HTTP Response", string(response.BodyAsBytes))
Expand Down
3 changes: 3 additions & 0 deletions jira/filterShare.go
Expand Up @@ -68,6 +68,9 @@ func (f *FilterShareService) SetScope(ctx context.Context, scope string) (respon
return
}

request.Header.Set("Accept", "application/json")
request.Header.Set("Content-Type", "application/json")

response, err = f.client.Do(request)
if err != nil {
return
Expand Down
99 changes: 84 additions & 15 deletions jira/issue.go
Expand Up @@ -46,11 +46,19 @@ type IssueFieldsScheme struct {
Components *[]ProjectComponentScheme `json:"components,omitempty"`
Creator *UserScheme `json:"creator,omitempty"`
Reporter *UserScheme `json:"reporter,omitempty"`
Statuscategorychangedate string `json:"statuscategorychangedate,omitempty"`
Resolution *IssueResolutionScheme `json:"resolution,omitempty"`
Resolutiondate string `json:"resolutiondate,omitempty"`
Workratio int `json:"workratio,omitempty"`
StatuscategoryChangeDate string `json:"statuscategorychangedate,omitempty"`
LastViewed string `json:"lastViewed,omitempty"`
Summary string `json:"summary,omitempty"`
Created string `json:"created,omitempty"`
Updated string `json:"updated,omitempty"`
Labels []string `json:"labels,omitempty"`
Status *StatusScheme `json:"status,omitempty"`
Description *CommentNodeScheme `json:"description,omitempty"`
Comments []*IssueCommentPageScheme `json:"comments,omitempty"`
Subtasks *[]IssueScheme `json:"subtasks,omitempty"`
}

func (i *IssueScheme) MergeCustomFields(fields *CustomFields) (result map[string]interface{}, err error) {
Expand Down Expand Up @@ -966,9 +974,15 @@ func (i *IssueService) Transitions(ctx context.Context, issueKeyOrID string) (re
return
}

type IssueMoveOptions struct {
Fields *IssueScheme
CustomFields *CustomFields
Operations *UpdateOperations
}

// Performs an issue transition and
// Docs: https://docs.go-atlassian.io/jira-software-cloud/issues#transition-issue
func (i *IssueService) Move(ctx context.Context, issueKeyOrID, transitionID string) (response *Response, err error) {
func (i *IssueService) Move(ctx context.Context, issueKeyOrID, transitionID string, options *IssueMoveOptions) (response *Response, err error) {

if len(issueKeyOrID) == 0 {
return nil, fmt.Errorf("error, please provide a valid issueKeyOrID string value")
Expand All @@ -978,21 +992,76 @@ func (i *IssueService) Move(ctx context.Context, issueKeyOrID, transitionID stri
return nil, fmt.Errorf("error, please provide a valid transitionID string value")
}

payload := struct {
Transition struct {
ID string `json:"id"`
} `json:"transition"`
}{
Transition: struct {
ID string `json:"id"`
}{ID: transitionID},
}
payloadWithTransition := make(map[string]interface{})
payloadWithTransition["transition"] = map[string]interface{}{"id": transitionID}

var endpoint = fmt.Sprintf("rest/api/3/issue/%v/transitions", issueKeyOrID)
var (
endpoint = fmt.Sprintf("rest/api/3/issue/%v/transitions", issueKeyOrID)
request *http.Request
)

request, err := i.client.newRequest(ctx, http.MethodPost, endpoint, &payload)
if err != nil {
return
if options != nil && options.Fields != nil {

// Executed when customfields and operation are provided
if options.CustomFields != nil && options.Operations != nil {

payloadWithCustomFields, err := options.Fields.MergeCustomFields(options.CustomFields)
if err != nil {
return nil, err
}

payloadWithOperations, err := options.Fields.MergeOperations(options.Operations)
if err != nil {
return nil, err
}

//Merge the map[string]interface{} into one
_ = mergo.Map(&payloadWithCustomFields, &payloadWithOperations, mergo.WithOverride)
_ = mergo.Map(&payloadWithCustomFields, &payloadWithTransition, mergo.WithOverride)

request, err = i.client.newRequest(ctx, http.MethodPost, endpoint, payloadWithCustomFields)
if err != nil {
return nil, err
}

}

// Executed when customfields are provided but not the operations
if options.CustomFields != nil && options.Operations == nil {

payloadWithCustomFields, err := options.Fields.MergeCustomFields(options.CustomFields)
if err != nil {
return nil, err
}

_ = mergo.Map(&payloadWithCustomFields, &payloadWithTransition, mergo.WithOverride)
request, err = i.client.newRequest(ctx, http.MethodPost, endpoint, payloadWithCustomFields)
if err != nil {
return nil, err
}

}

// Executed when operations are provided but not the customfields
if options.CustomFields == nil && options.Operations != nil {

payloadWithOperations, err := options.Fields.MergeOperations(options.Operations)
if err != nil {
return nil, err
}

_ = mergo.Map(&payloadWithOperations, &payloadWithTransition, mergo.WithOverride)
request, err = i.client.newRequest(ctx, http.MethodPost, endpoint, payloadWithOperations)
if err != nil {
return nil, err
}
}

} else {
request, err = i.client.newRequest(ctx, http.MethodPost, endpoint, &payloadWithTransition)
if err != nil {
return
}
}

request.Header.Set("Accept", "application/json")
Expand Down
36 changes: 10 additions & 26 deletions jira/issueComment.go
Expand Up @@ -19,32 +19,16 @@ type IssueCommentPageScheme struct {
}

type IssueCommentScheme struct {
Self string `json:"self,omitempty"`
ID string `json:"id,omitempty"`
Author *UserScheme `json:"author,omitempty"`
RenderedBody string `json:"renderedBody,omitempty"`
Body struct {
Version int `json:"version,omitempty"`
Type string `json:"type,omitempty"`
Content []struct {
Type string `json:"type,omitempty"`
Content []struct {
Type string `json:"type,omitempty"`
Text string `json:"text,omitempty"`
} `json:"content,omitempty"`
} `json:"content,omitempty"`
} `json:"body,omitempty"`
JSDPublic bool `json:"jsdPublic,omitempty"`
UpdateAuthor *UserScheme `json:"updateAuthor,omitempty"`
Created string `json:"created,omitempty"`
Updated string `json:"updated,omitempty"`
Visibility struct {
Type string `json:"type,omitempty"`
Value string `json:"value,omitempty"`
} `json:"visibility,omitempty"`
Properties []struct {
Key string `json:"key,omitempty"`
} `json:"properties,omitempty"`
Self string `json:"self,omitempty"`
ID string `json:"id,omitempty"`
Author *UserScheme `json:"author,omitempty"`
RenderedBody string `json:"renderedBody,omitempty"`
Body *CommentNodeScheme `json:"body,omitempty"`
JSDPublic bool `json:"jsdPublic,omitempty"`
UpdateAuthor *UserScheme `json:"updateAuthor,omitempty"`
Created string `json:"created,omitempty"`
Updated string `json:"updated,omitempty"`
Visibility *CommentVisibilityScheme `json:"visibility,omitempty"`
}

// Returns all comments for an issue.
Expand Down
44 changes: 39 additions & 5 deletions jira/issueFieldConfiguration.go
Expand Up @@ -26,7 +26,7 @@ type FieldConfigScheme struct {
IsDefault bool `json:"isDefault,omitempty"`
}

// Returns a paginated list of all field configurations.
// Gets Returns a paginated list of all field configurations.
// Docs: https://docs.go-atlassian.io/jira-software-cloud/issues/fields/configuration#get-all-field-configurations
func (f *FieldConfigurationService) Gets(ctx context.Context, IDs []int, isDefault bool, startAt, maxResults int) (result *FieldConfigSearchScheme, response *Response, err error) {

Expand Down Expand Up @@ -77,7 +77,7 @@ type FieldConfigurationItemScheme struct {
Description string `json:"description,omitempty"`
}

// Returns a paginated list of all fields for a configuration.
// Items Returns a paginated list of all fields for a configuration.
// Docs: https://docs.go-atlassian.io/jira-software-cloud/issues/fields/configuration#get-field-configuration-items
func (f *FieldConfigurationService) Items(ctx context.Context, fieldConfigurationID, startAt, maxResults int) (result *FieldConfigurationItemPageScheme, response *Response, err error) {

Expand Down Expand Up @@ -120,7 +120,7 @@ type FieldConfigurationSchemeScheme struct {
Description string `json:"description,omitempty"`
}

// Returns a paginated list of field configuration schemes.
// Schemes Returns a paginated list of field configuration schemes.
// Docs: https://docs.go-atlassian.io/jira-software-cloud/issues/fields/configuration#get-all-field-configuration-schemes
func (f *FieldConfigurationService) Schemes(ctx context.Context, IDs []int, startAt, maxResults int) (result *FieldConfigurationSchemePageScheme, response *Response, err error) {

Expand Down Expand Up @@ -167,7 +167,7 @@ type FieldConfigurationIssueTypeItemScheme struct {
FieldConfigurationID string `json:"fieldConfigurationId,omitempty"`
}

// Returns a paginated list of field configuration issue type items.
// IssueTypeItems Returns a paginated list of field configuration issue type items.
// Docs: https://docs.go-atlassian.io/jira-software-cloud/issues/fields/configuration#get-field-configuration-issue-type-items
func (f *FieldConfigurationService) IssueTypeItems(ctx context.Context, fieldConfigIDs []int, startAt, maxResults int) (result *FieldConfigurationIssueTypeItemPageScheme, response *Response, err error) {

Expand Down Expand Up @@ -212,7 +212,7 @@ type FieldConfigurationSchemeProjectScheme struct {
FieldConfigurationScheme *FieldConfigurationSchemeScheme `json:"fieldConfigurationScheme,omitempty"`
}

// Returns a paginated list of field configuration schemes and, for each scheme, a list of the projects that use it.
// SchemesByProject Returns a paginated list of field configuration schemes and, for each scheme, a list of the projects that use it.
// Docs: https://docs.go-atlassian.io/jira-software-cloud/issues/fields/configuration#get-field-configuration-schemes-for-projects
func (f *FieldConfigurationService) SchemesByProject(ctx context.Context, projectIDs []int, startAt, maxResults int) (result *FieldConfigurationSchemeProjectPageScheme, response *Response, err error) {

Expand Down Expand Up @@ -243,3 +243,37 @@ func (f *FieldConfigurationService) SchemesByProject(ctx context.Context, projec

return
}

// Assign Assigns a field configuration scheme to a project.
// If the field configuration scheme ID is null, the operation assigns the default field configuration scheme.
// Docs: N/A
func (f *FieldConfigurationService) Assign(ctx context.Context, fieldConfigurationSchemeID, projectID string) (response *Response, err error) {

if len(projectID) == 0 {
return nil, fmt.Errorf("error!, please provide a vaild projectID value")
}

payload := struct {
SchemeID string `json:"fieldConfigurationSchemeId,omitempty"`
ProjectID string `json:"projectId,omitempty"`
}{
SchemeID: fieldConfigurationSchemeID,
ProjectID: projectID,
}

var endpoint = "rest/api/3/fieldconfigurationscheme/project"
request, err := f.client.newRequest(ctx, http.MethodPut, endpoint, &payload)
if err != nil {
return
}

request.Header.Set("Accept", "application/json")
request.Header.Set("Content-Type", "application/json")

response, err = f.client.Do(request)
if err != nil {
return
}

return
}