Skip to content

Commit dd21cbe

Browse files
authored
Add approvals for CG to SDK (#142)
* Add GetApprovalDetails function * Add ApproveOrRejectApprovals function for CG
1 parent dc1d42b commit dd21cbe

File tree

6 files changed

+215
-0
lines changed

6 files changed

+215
-0
lines changed

harness/cd/approval.go

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package cd
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/harness/harness-go-sdk/harness/cd/graphql"
7+
)
8+
9+
// Helper type for accessing all application related crud methods
10+
type ApprovalClient struct {
11+
ApiClient *ApiClient
12+
}
13+
14+
// CRUD
15+
func (ac *ApprovalClient) GetApprovalDetails(applicationId string, executionId string) (*graphql.ApprovalDetailsPayload, error) {
16+
query := &GraphQLQuery{
17+
Query: fmt.Sprintf(`query($applicationId: String!, $executionId: String!) {
18+
approvalDetails(applicationId: $applicationId, executionId: $executionId) {
19+
approvalDetails {
20+
%s
21+
}
22+
}
23+
}`, approvalDetailsFields),
24+
Variables: map[string]interface{}{
25+
"applicationId": applicationId,
26+
"executionId": executionId,
27+
},
28+
}
29+
30+
res := struct {
31+
ApprovalDetails graphql.ApprovalDetailsPayload
32+
}{}
33+
ac.ApiClient.ExecuteGraphQLQuery(query, &res)
34+
35+
return &res.ApprovalDetails, nil
36+
}
37+
38+
func (ac *ApprovalClient) ApproveOrRejectApprovals(input *graphql.ApproveOrRejectApprovalsInput) (*graphql.ApproveOrRejectApprovalsInputPayload, error) {
39+
40+
query := &GraphQLQuery{
41+
Query: `mutation approveOrRejectApprovals ($approvalInput: ApproveOrRejectApprovalsInput!) {
42+
approveOrRejectApprovals(input: $approvalInput)
43+
{
44+
success
45+
clientMutationId
46+
}
47+
}`,
48+
Variables: map[string]interface{}{
49+
"approvalInput": &input,
50+
},
51+
}
52+
53+
res := &struct {
54+
ApproveOrRejectApprovalsInputPayload *graphql.ApproveOrRejectApprovalsInputPayload
55+
}{}
56+
err := ac.ApiClient.ExecuteGraphQLQuery(query, &res)
57+
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
return res.ApproveOrRejectApprovalsInputPayload, nil
63+
}
64+
65+
var approvalDetailsFields = `
66+
approvalId
67+
approvalType
68+
stepName
69+
stageName
70+
startedAt
71+
triggeredBy {
72+
name
73+
email
74+
}
75+
willExpireAt
76+
... on UserGroupApprovalDetails {
77+
approvers
78+
approvalId
79+
approvalType
80+
stepName
81+
stageName
82+
startedAt
83+
executionId
84+
triggeredBy {
85+
name
86+
email
87+
}
88+
willExpireAt
89+
variables {
90+
name
91+
value
92+
}
93+
}
94+
... on ShellScriptDetails {
95+
approvalId
96+
approvalType
97+
retryInterval
98+
stageName
99+
stepName
100+
startedAt
101+
triggeredBy {
102+
email
103+
name
104+
}
105+
willExpireAt
106+
}
107+
... on SNOWApprovalDetails {
108+
approvalCondition
109+
approvalId
110+
approvalType
111+
currentStatus
112+
rejectionCondition
113+
stageName
114+
startedAt
115+
stepName
116+
ticketType
117+
ticketUrl
118+
triggeredBy {
119+
email
120+
name
121+
}
122+
willExpireAt
123+
}
124+
... on JiraApprovalDetails {
125+
approvalCondition
126+
approvalId
127+
approvalType
128+
currentStatus
129+
issueKey
130+
issueUrl
131+
rejectionCondition
132+
stepName
133+
stageName
134+
startedAt
135+
triggeredBy {
136+
email
137+
name
138+
}
139+
willExpireAt
140+
}
141+
`

harness/cd/approval_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package cd
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
)
8+
9+
func TestApprovalDetails(t *testing.T) {
10+
c := getClient()
11+
approval, err := c.ApprovalClient.GetApprovalDetails("q_nsFwL5TUq4Jsq00vNGRQ-gf39sw", "ntUxF8b_SRuSWLckvPkODw")
12+
require.NoError(t, err)
13+
require.NotNil(t, approval)
14+
}

harness/cd/client.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ type ApiClient struct {
4646
UserClient *UserClient
4747
TagClient *TagClient
4848
TriggerClient *TriggerClient
49+
ApprovalClient *ApprovalClient
4950
}
5051

5152
func DefaultConfig() *Config {
@@ -101,6 +102,7 @@ func NewClient(cfg *Config) (*ApiClient, error) {
101102

102103
// API Services
103104
c.ApplicationClient = (*ApplicationClient)(&c.common)
105+
c.ApprovalClient = (*ApprovalClient)(&c.common)
104106
c.CloudProviderClient = (*CloudProviderClient)(&c.common)
105107
c.ConfigAsCodeClient = (*ConfigAsCodeClient)(&c.common)
106108
c.ConnectorClient = (*ConnectorClient)(&c.common)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package graphql
2+
3+
type ApprovalActionType string
4+
5+
var ApprovalActionTypes = struct {
6+
Approve ApprovalActionType
7+
Reject ApprovalActionType
8+
}{
9+
Approve: "APPROVE",
10+
Reject: "REJECT",
11+
}
12+
13+
var ApprovalActionTypeList = []string{
14+
ApprovalActionTypes.Approve.String(),
15+
ApprovalActionTypes.Reject.String(),
16+
}
17+
18+
func (d ApprovalActionType) String() string {
19+
return string(d)
20+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package graphql
2+
3+
type ApproveOrRejectApprovalsInput struct {
4+
Action ApprovalActionType `json:"action,omitempty"`
5+
ApplicationId string `json:"applicationId,omitempty"`
6+
ApprovalId string `json:"approvalId,omitempty"`
7+
ClientMutationId string `json:"clientMutationId,omitempty"`
8+
Comments string `json:"comments,omitempty"`
9+
ExecutionId string `json:"executionId,omitempty"`
10+
VariableInputs []*ApprovalVariable `json:"variableInputs,omitempty"`
11+
}

harness/cd/graphql/types.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,3 +847,30 @@ type CEClusterHealth struct {
847847
LastEventTimestamp float64 `json:"lastEventTimestamp,omitempty"`
848848
Messages []string `json:"messages"`
849849
}
850+
851+
type ApprovalVariable struct {
852+
Name string `json:"name,omitempty"`
853+
Value string `json:"value,omitempty"`
854+
}
855+
856+
type ApprovalDetailsPayload struct {
857+
ApprovalDetails []*Approval `json:"approvalDetails,omitempty"`
858+
}
859+
860+
type Approval struct {
861+
ApprovalId string `json:"approvalId,omitempty"`
862+
ApprovalType ApprovalStepType `json:"approvalType,omitempty"`
863+
StepName string `json:"stepName,omitempty"`
864+
StageName string `json:"stageName,omitempty"`
865+
StartedAt *time.Time `json:"startedAt,omitempty"`
866+
TriggeredBy User `json:"triggeredBy,omitempty"`
867+
WillExpireAt *time.Time `json:"willExpireAt,omitempty"`
868+
Approvers []string `json:"approvers,omitempty"`
869+
ExecutionId string `json:"executionId,omitempty"`
870+
Variables []*ApprovalVariable `json:"variables,omitempty"`
871+
}
872+
873+
type ApproveOrRejectApprovalsInputPayload struct {
874+
ClientMutationId string `json:"clientMutationId,omitempty"`
875+
Success bool `json:"success,omitempty"`
876+
}

0 commit comments

Comments
 (0)