Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changes/unreleased/Bugfix-20260831-232048.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
kind: Bugfix
body: ListTeams now hydrates the teams on the first page. Previously only teams from
subsequent pages were hydrated, so accounts with a single page of teams had
Responsibilities left HTML-escaped and TotalCount left at zero.
time: 2026-08-31T23:20:48+05:30
5 changes: 5 additions & 0 deletions .changes/unreleased/Feature-20260831-232047.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
kind: Feature
body: Team queries now return custom properties. Previously properties were excluded
from generated queries, so reading them for a list of teams cost one extra request
per team.
time: 2026-08-31T23:20:47+05:30
4 changes: 2 additions & 2 deletions actions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -352,12 +352,12 @@ func TestDeleteTriggerDefinition(t *testing.T) {
func TestListExtendedTeamAccess(t *testing.T) {
// Arrange
testRequestOne := autopilot.NewTestRequest(
`query ExtendedTeamAccessList($after:String!$first:Int!$input:IdentifierInput!){account{customActionsTriggerDefinition(input: $input){extendedTeamAccess(after: $after, first: $first){nodes{alias,id,aliases,managedAliases,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,manager{id,email,name,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,provisionedBy,role,tags{nodes{id,key,value},{{ template "pagination_request" }}},teams{nodes{alias,id},{{ template "pagination_request" }}}},memberships{nodes{role,team{alias,id},user{id,email,name}},{{ template "pagination_request" }}},name,parentTeam{alias,id},responsibilities,tags{nodes{id,key,value},{{ template "pagination_request" }}}},{{ template "pagination_request" }}}}}}`,
`query ExtendedTeamAccessList($after:String!$first:Int!$input:IdentifierInput!){account{customActionsTriggerDefinition(input: $input){extendedTeamAccess(after: $after, first: $first){nodes{alias,id,aliases,managedAliases,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,manager{id,email,name,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,provisionedBy,role,tags{nodes{id,key,value},{{ template "pagination_request" }}},teams{nodes{alias,id},{{ template "pagination_request" }}}},memberships{nodes{role,team{alias,id},user{id,email,name}},{{ template "pagination_request" }}},name,parentTeam{alias,id},responsibilities,tags{nodes{id,key,value},{{ template "pagination_request" }}},properties{nodes{definition{id,aliases},locked,owner{__typename,... on Team{alias,id},... on Service{id,aliases}},validationErrors{message,path},value},{{ template "pagination_request" }}}},{{ template "pagination_request" }}}}}}`,
`{{ template "extended_team_access_get_vars_1" }}`,
`{{ template "extended_team_access_response_1" }}`,
)
testRequestTwo := autopilot.NewTestRequest(
`query ExtendedTeamAccessList($after:String!$first:Int!$input:IdentifierInput!){account{customActionsTriggerDefinition(input: $input){extendedTeamAccess(after: $after, first: $first){nodes{alias,id,aliases,managedAliases,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,manager{id,email,name,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,provisionedBy,role,tags{nodes{id,key,value},{{ template "pagination_request" }}},teams{nodes{alias,id},{{ template "pagination_request" }}}},memberships{nodes{role,team{alias,id},user{id,email,name}},{{ template "pagination_request" }}},name,parentTeam{alias,id},responsibilities,tags{nodes{id,key,value},{{ template "pagination_request" }}}},{{ template "pagination_request" }}}}}}`,
`query ExtendedTeamAccessList($after:String!$first:Int!$input:IdentifierInput!){account{customActionsTriggerDefinition(input: $input){extendedTeamAccess(after: $after, first: $first){nodes{alias,id,aliases,managedAliases,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,manager{id,email,name,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,provisionedBy,role,tags{nodes{id,key,value},{{ template "pagination_request" }}},teams{nodes{alias,id},{{ template "pagination_request" }}}},memberships{nodes{role,team{alias,id},user{id,email,name}},{{ template "pagination_request" }}},name,parentTeam{alias,id},responsibilities,tags{nodes{id,key,value},{{ template "pagination_request" }}},properties{nodes{definition{id,aliases},locked,owner{__typename,... on Team{alias,id},... on Service{id,aliases}},validationErrors{message,path},value},{{ template "pagination_request" }}}},{{ template "pagination_request" }}}}}}`,
`{{ template "extended_team_access_get_vars_2" }}`,
`{{ template "extended_team_access_response_2" }}`,
)
Expand Down
2 changes: 1 addition & 1 deletion cache_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func TestCache(t *testing.T) {
`{"data":{"account":{ "systems":{ "nodes":[{{ template "system1_response" }}] } }}}`,
)
testRequestFour := autopilot.NewTestRequest(
`query TeamList($after:String!$first:Int!){account{teams(after: $after, first: $first){nodes{alias,id,aliases,managedAliases,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,manager{id,email,name,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,provisionedBy,role,tags{nodes{id,key,value},{{ template "pagination_request" }}},teams{nodes{alias,id},{{ template "pagination_request" }}}},memberships{nodes{role,team{alias,id},user{id,email,name}},{{ template "pagination_request" }}},name,parentTeam{alias,id},responsibilities,tags{nodes{id,key,value},{{ template "pagination_request" }}}},{{ template "pagination_request" }}}}}`,
`query TeamList($after:String!$first:Int!){account{teams(after: $after, first: $first){nodes{alias,id,aliases,managedAliases,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,manager{id,email,name,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,provisionedBy,role,tags{nodes{id,key,value},{{ template "pagination_request" }}},teams{nodes{alias,id},{{ template "pagination_request" }}}},memberships{nodes{role,team{alias,id},user{id,email,name}},{{ template "pagination_request" }}},name,parentTeam{alias,id},responsibilities,tags{nodes{id,key,value},{{ template "pagination_request" }}},properties{nodes{definition{id,aliases},locked,owner{__typename,... on Team{alias,id},... on Service{id,aliases}},validationErrors{message,path},value},{{ template "pagination_request" }}}},{{ template "pagination_request" }}}}}`,
`{ "after": "", "first": 500 }`,
`{"data":{"account":{ "teams":{ "nodes":[{{ template "team_1" }}] } }}}`,
)
Expand Down
2 changes: 1 addition & 1 deletion clientGQL_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ func httpResponseByCode(statusCode int) autopilot.ResponseWriter {

func TestMissingTeamIsAnOpsLevelApiError(t *testing.T) {
testRequest := autopilot.NewTestRequest(
`query TeamGet($id:ID!){account{team(id: $id){alias,id,aliases,managedAliases,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,manager{id,email,name,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,provisionedBy,role,tags{nodes{id,key,value},{{ template "pagination_request" }}},teams{nodes{alias,id},{{ template "pagination_request" }}}},memberships{nodes{role,team{alias,id},user{id,email,name}},{{ template "pagination_request" }}},name,parentTeam{alias,id},responsibilities,tags{nodes{id,key,value},{{ template "pagination_request" }}}}}}`,
`query TeamGet($id:ID!){account{team(id: $id){alias,id,aliases,managedAliases,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,manager{id,email,name,contacts{address,displayName,displayType,externalId,id,isDefault,type},htmlUrl,provisionedBy,role,tags{nodes{id,key,value},{{ template "pagination_request" }}},teams{nodes{alias,id},{{ template "pagination_request" }}}},memberships{nodes{role,team{alias,id},user{id,email,name}},{{ template "pagination_request" }}},name,parentTeam{alias,id},responsibilities,tags{nodes{id,key,value},{{ template "pagination_request" }}},properties{nodes{definition{id,aliases},locked,owner{__typename,... on Team{alias,id},... on Service{id,aliases}},validationErrors{message,path},value},{{ template "pagination_request" }}}}}}`,
`{ {{ template "id1" }} }`,
`{"errors": [
{
Expand Down
27 changes: 20 additions & 7 deletions team.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ type Team struct {
ParentTeam TeamId
Responsibilities string
Tags *TagConnection
Properties *PropertiesConnection `graphql:"-" json:"-"`
Properties *PropertiesConnection
}

// TeamIdConnection exists to prevent circular references on User because Team has a UserConnection
Expand Down Expand Up @@ -103,6 +103,18 @@ func (team *Team) Hydrate(client *Client) error {
team.Tags = resp
}
team.Tags.TotalCount = len(team.Tags.Nodes)

if team.Properties == nil {
team.Properties = &PropertiesConnection{}
}
if team.Properties.PageInfo.HasNextPage {
variables := client.InitialPageVariablesPointer()
(*variables)["after"] = team.Properties.PageInfo.End
if _, err := team.GetProperties(client, variables); err != nil {
return err
}
}
team.Properties.TotalCount = len(team.Properties.Nodes)
return nil
}

Expand Down Expand Up @@ -391,18 +403,19 @@ func (client *Client) ListTeams(variables *PayloadVariables) (*TeamConnection, e
return nil, err
}

for i := range q.Account.Teams.Nodes {
Comment thread
andrewstillv15 marked this conversation as resolved.
if err := q.Account.Teams.Nodes[i].Hydrate(client); err != nil {
return nil, err
}
}

if q.Account.Teams.PageInfo.HasNextPage {
(*variables)["after"] = q.Account.Teams.PageInfo.End
resp, err := client.ListTeams(variables)
if err != nil {
return nil, err
}
for _, node := range resp.Nodes {
if err := node.Hydrate(client); err != nil {
return nil, err
}
q.Account.Teams.Nodes = append(q.Account.Teams.Nodes, node)
}
q.Account.Teams.Nodes = append(q.Account.Teams.Nodes, resp.Nodes...)
q.Account.Teams.PageInfo = resp.PageInfo
}
q.Account.Teams.TotalCount = len(q.Account.Teams.Nodes)
Expand Down
Loading
Loading