Skip to content

Commit 68bf49e

Browse files
Add component filtering via input filter (#574)
* Add method for constructing service queries with ad hoc filters
1 parent f519f64 commit 68bf49e

File tree

4 files changed

+309
-20
lines changed

4 files changed

+309
-20
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
kind: Feature
2+
body: Add `ListServicesWithInputFilter` method for constructing service queries with
3+
ad hoc filters.
4+
time: 2025-07-17T08:23:10.305942-07:00

enum.go

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2857,44 +2857,56 @@ var AllPayloadSortEnum = []string{
28572857
type PredicateKeyEnum string
28582858

28592859
var (
2860-
PredicateKeyEnumAliases PredicateKeyEnum = "aliases" // Filter by Alias attached to this service, if any
2861-
PredicateKeyEnumComponentTypeID PredicateKeyEnum = "component_type_id" // Filter by the `component_type` field
2862-
PredicateKeyEnumCreationSource PredicateKeyEnum = "creation_source" // Filter by the creation source
2863-
PredicateKeyEnumDomainID PredicateKeyEnum = "domain_id" // Filter by Domain that includes the System this service is assigned to, if any
2864-
PredicateKeyEnumFilterID PredicateKeyEnum = "filter_id" // Filter by another filter
2865-
PredicateKeyEnumFramework PredicateKeyEnum = "framework" // Filter by `framework` field
2866-
PredicateKeyEnumGroupIDs PredicateKeyEnum = "group_ids" // Filter by group hierarchy. Will return resources who's owner is in the group ancestry chain
2867-
PredicateKeyEnumLanguage PredicateKeyEnum = "language" // Filter by `language` field
2868-
PredicateKeyEnumLifecycleIndex PredicateKeyEnum = "lifecycle_index" // Filter by `lifecycle` field
2869-
PredicateKeyEnumName PredicateKeyEnum = "name" // Filter by `name` field
2870-
PredicateKeyEnumOwnerID PredicateKeyEnum = "owner_id" // Filter by `owner` field
2871-
PredicateKeyEnumOwnerIDs PredicateKeyEnum = "owner_ids" // Filter by `owner` hierarchy. Will return resources who's owner is in the team ancestry chain
2872-
PredicateKeyEnumProduct PredicateKeyEnum = "product" // Filter by `product` field
2873-
PredicateKeyEnumProperties PredicateKeyEnum = "properties" // Filter by custom-defined properties
2874-
PredicateKeyEnumRepositoryIDs PredicateKeyEnum = "repository_ids" // Filter by Repository that this service is attached to, if any
2875-
PredicateKeyEnumSystemID PredicateKeyEnum = "system_id" // Filter by System that this service is assigned to, if any
2876-
PredicateKeyEnumTags PredicateKeyEnum = "tags" // Filter by `tags` field
2877-
PredicateKeyEnumTierIndex PredicateKeyEnum = "tier_index" // Filter by `tier` field
2860+
PredicateKeyEnumAliases PredicateKeyEnum = "aliases" // Filter by Alias attached to this service, if any
2861+
PredicateKeyEnumAlertStatus PredicateKeyEnum = "alert_status" // Filter by alert status field
2862+
PredicateKeyEnumComponentTypeID PredicateKeyEnum = "component_type_id" // Filter by the `component_type` field
2863+
PredicateKeyEnumCreationSource PredicateKeyEnum = "creation_source" // Filter by the creation source
2864+
PredicateKeyEnumDeployEnvironment PredicateKeyEnum = "deploy_environment" // Filter by the existence of a deploy to an environment
2865+
PredicateKeyEnumDomainID PredicateKeyEnum = "domain_id" // Filter by Domain that includes the System this service is assigned to, if any
2866+
PredicateKeyEnumFilterID PredicateKeyEnum = "filter_id" // Filter by another filter
2867+
PredicateKeyEnumFramework PredicateKeyEnum = "framework" // Filter by `framework` field
2868+
PredicateKeyEnumGroupIDs PredicateKeyEnum = "group_ids" // Filter by group hierarchy. Will return resources who's owner is in the group ancestry chain
2869+
PredicateKeyEnumLanguage PredicateKeyEnum = "language" // Filter by `language` field
2870+
PredicateKeyEnumLevelIndex PredicateKeyEnum = "level_index" // Filter by level field
2871+
PredicateKeyEnumLifecycleIndex PredicateKeyEnum = "lifecycle_index" // Filter by `lifecycle` field
2872+
PredicateKeyEnumName PredicateKeyEnum = "name" // Filter by `name` field
2873+
PredicateKeyEnumOwnerID PredicateKeyEnum = "owner_id" // Filter by `owner` field
2874+
PredicateKeyEnumOwnerIDs PredicateKeyEnum = "owner_ids" // Filter by `owner` hierarchy. Will return resources who's owner is in the team ancestry chain
2875+
PredicateKeyEnumProduct PredicateKeyEnum = "product" // Filter by `product` field
2876+
PredicateKeyEnumProperties PredicateKeyEnum = "properties" // Filter by custom-defined properties
2877+
PredicateKeyEnumProperty PredicateKeyEnum = "property" // Filter by a custom-defined property value
2878+
PredicateKeyEnumRelationship PredicateKeyEnum = "relationship" // Filter by the existence of a relationship to another catalog component
2879+
PredicateKeyEnumRepositoryIDs PredicateKeyEnum = "repository_ids" // Filter by Repository that this service is attached to, if any
2880+
PredicateKeyEnumSystemID PredicateKeyEnum = "system_id" // Filter by System that this service is assigned to, if any
2881+
PredicateKeyEnumTag PredicateKeyEnum = "tag" // Filter by tag field
2882+
PredicateKeyEnumTags PredicateKeyEnum = "tags" // Filter by `tags` field
2883+
PredicateKeyEnumTierIndex PredicateKeyEnum = "tier_index" // Filter by `tier` field
28782884
)
28792885

28802886
// All PredicateKeyEnum as []string
28812887
var AllPredicateKeyEnum = []string{
28822888
string(PredicateKeyEnumAliases),
2889+
string(PredicateKeyEnumAlertStatus),
28832890
string(PredicateKeyEnumComponentTypeID),
28842891
string(PredicateKeyEnumCreationSource),
2892+
string(PredicateKeyEnumDeployEnvironment),
28852893
string(PredicateKeyEnumDomainID),
28862894
string(PredicateKeyEnumFilterID),
28872895
string(PredicateKeyEnumFramework),
28882896
string(PredicateKeyEnumGroupIDs),
28892897
string(PredicateKeyEnumLanguage),
2898+
string(PredicateKeyEnumLevelIndex),
28902899
string(PredicateKeyEnumLifecycleIndex),
28912900
string(PredicateKeyEnumName),
28922901
string(PredicateKeyEnumOwnerID),
28932902
string(PredicateKeyEnumOwnerIDs),
28942903
string(PredicateKeyEnumProduct),
28952904
string(PredicateKeyEnumProperties),
2905+
string(PredicateKeyEnumProperty),
2906+
string(PredicateKeyEnumRelationship),
28962907
string(PredicateKeyEnumRepositoryIDs),
28972908
string(PredicateKeyEnumSystemID),
2909+
string(PredicateKeyEnumTag),
28982910
string(PredicateKeyEnumTags),
28992911
string(PredicateKeyEnumTierIndex),
29002912
}

service.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ type Service struct {
4646
Properties *ServicePropertiesConnection `graphql:"-"`
4747
}
4848

49+
// ServiceFilterInput is the input object for filtering services.
50+
type ServiceFilterInput struct {
51+
Key PredicateKeyEnum `json:"key,omitempty"`
52+
Arg string `json:"arg,omitempty"`
53+
Type PredicateTypeEnum `json:"type,omitempty"`
54+
Connective *ConnectiveEnum `json:"connective,omitempty" yaml:"connective,omitempty" example:"and"` // The logical operator to be used in conjunction with predicates (Optional)
55+
Predicates *[]ServiceFilterInput `json:"predicates,omitempty" yaml:"predicates,omitempty" example:"[]"` // The list of predicates used to select which services apply to the filter (Optional)
56+
CaseSensitive bool `json:"caseSensitive"`
57+
}
58+
4959
// Returns unique identifiers created by OpsLevel, values in Aliases but not ManagedAliases
5060
func (service *Service) UniqueIdentifiers() []string {
5161
uniqueIdentifiers := []string{}
@@ -553,6 +563,39 @@ func (client *Client) ListServicesWithFramework(framework string, variables *Pay
553563
return &q.Account.Services, nil
554564
}
555565

566+
func (client *Client) ListServicesWithInputFilter(filter ServiceFilterInput, variables *PayloadVariables) (*ServiceConnection, error) {
567+
var q struct {
568+
Account struct {
569+
Services ServiceConnection `graphql:"services(filter: $filter, after: $after, first: $first)"`
570+
}
571+
}
572+
if variables == nil {
573+
variables = client.InitialPageVariablesPointer()
574+
}
575+
(*variables)["filter"] = []ServiceFilterInput{filter} // GraphQL expects an array of filters
576+
577+
if err := client.Query(&q, *variables, WithName("ServiceListWithInputFilter")); err != nil {
578+
return nil, err
579+
}
580+
581+
if q.Account.Services.PageInfo.HasNextPage {
582+
(*variables)["after"] = q.Account.Services.PageInfo.End
583+
resp, err := client.ListServicesWithInputFilter(filter, variables)
584+
if err != nil {
585+
return nil, err
586+
}
587+
for _, node := range resp.Nodes {
588+
if err := node.Hydrate(client); err != nil {
589+
return nil, err
590+
}
591+
q.Account.Services.Nodes = append(q.Account.Services.Nodes, node)
592+
}
593+
q.Account.Services.PageInfo = resp.PageInfo
594+
}
595+
q.Account.Services.TotalCount = len(q.Account.Services.Nodes)
596+
return &q.Account.Services, nil
597+
}
598+
556599
func (client *Client) ListServicesWithLanguage(language string, variables *PayloadVariables) (*ServiceConnection, error) {
557600
var q struct {
558601
Account struct {

0 commit comments

Comments
 (0)