From 37b45fc661ce7fe615695e4ce86dd88a6d171f8e Mon Sep 17 00:00:00 2001 From: Lauren Leach Date: Fri, 7 Aug 2026 14:49:04 -0700 Subject: [PATCH] Migrate off deprecated trait profile/status attributes baton-sdk v0.20.6 moved `profile`, `status`, and `created_at` off the trait messages onto attributes on `Resource`, deprecating the trait-level options and getters. staticcheck flags every remaining call with `SA1019`, so `verify / lint` is red on `main`. This migrates the connector to the resource-level API: - `With{User,Group,Role,App}Profile` -> `WithResourceProfile` - `WithStatus` / `WithDetailedStatus` -> `WithResourceStatus` - `WithCreatedAt` / `WithSecretCreatedAt` -> `WithResourceCreatedAt` - trait `GetProfile()` / `GetStatus()` reads -> the equivalent read on the resource The option type changes from a `*TraitOption` to a `ResourceOption`, so the calls move out of the trait slice and into the variadic tail of the `New*Resource` call. The two status enums are numerically identical, so the values map 1:1. Non-deprecated trait data (login, aliases, emails, secret type/expiry) is untouched. No behavioural change intended: the deprecated options already populated the resource-level fields. `golangci-lint run ./...` reports 0 issues after this change, and the package tests pass. --- pkg/connector/project.go | 10 +++------- pkg/connector/role.go | 5 ++--- pkg/connector/team.go | 5 +++-- pkg/connector/user.go | 16 ++++++---------- 4 files changed, 14 insertions(+), 22 deletions(-) diff --git a/pkg/connector/project.go b/pkg/connector/project.go index bd30636d..5e690341 100644 --- a/pkg/connector/project.go +++ b/pkg/connector/project.go @@ -37,13 +37,14 @@ func projectResource(project *linear.Project, parentId *v2.ResourceId) (*v2.Reso "project_slug": project.SlugID, "project_id": project.ID, } - groupTraitOptions := []rs.GroupTraitOption{rs.WithGroupProfile(profile)} + groupTraitOptions := []rs.GroupTraitOption{} ret, err := rs.NewGroupResource( project.Name, resourceTypeProject, project.ID, groupTraitOptions, + rs.WithResourceProfile(profile), rs.WithParentResourceID(parentId), ) @@ -120,12 +121,7 @@ func (o *projectResourceType) Grants(ctx context.Context, resource *v2.Resource, return nil, "", nil, err } - projectTrait, err := rs.GetGroupTrait(resource) - if err != nil { - return nil, "", nil, err - } - - projectId, ok := rs.GetProfileStringValue(projectTrait.Profile, "project_id") + projectId, ok := rs.GetProfileStringValue(rs.GetProfile(resource), "project_id") if !ok { return nil, "", nil, fmt.Errorf("error fetching project_id from project profile") } diff --git a/pkg/connector/role.go b/pkg/connector/role.go index f9abc2b1..a35a0203 100644 --- a/pkg/connector/role.go +++ b/pkg/connector/role.go @@ -46,15 +46,14 @@ func roleResource(ctx context.Context, role string, parentResourceID *v2.Resourc "role_id": role, } - roleTraitOptions := []resource.RoleTraitOption{ - resource.WithRoleProfile(profile), - } + roleTraitOptions := []resource.RoleTraitOption{} ret, err := resource.NewRoleResource( roleDisplayName, resourceTypeRole, role, roleTraitOptions, + resource.WithResourceProfile(profile), resource.WithParentResourceID(parentResourceID), ) if err != nil { diff --git a/pkg/connector/team.go b/pkg/connector/team.go index 2ae9903b..0f72216f 100644 --- a/pkg/connector/team.go +++ b/pkg/connector/team.go @@ -18,7 +18,7 @@ import ( ) var ( - _ connectorbuilder.ResourceSyncer = (*teamResourceType)(nil) + _ connectorbuilder.ResourceSyncer = (*teamResourceType)(nil) _ connectorbuilder.ResourceProvisioner = (*teamResourceType)(nil) ) @@ -40,13 +40,14 @@ func teamResource(team *linear.Team, parentResourceID *v2.ResourceId) (*v2.Resou "team_name": team.Name, } - groupTraitOptions := []rs.GroupTraitOption{rs.WithGroupProfile(profile)} + groupTraitOptions := []rs.GroupTraitOption{} ret, err := rs.NewGroupResource( team.Name, resourceTypeTeam, team.ID, groupTraitOptions, + rs.WithResourceProfile(profile), rs.WithParentResourceID(parentResourceID), ) if err != nil { diff --git a/pkg/connector/user.go b/pkg/connector/user.go index 4b74cee4..580e0fd1 100644 --- a/pkg/connector/user.go +++ b/pkg/connector/user.go @@ -16,9 +16,9 @@ import ( ) var ( - _ connectorbuilder.ResourceSyncer = (*userResourceType)(nil) - _ connectorbuilder.AccountManagerLimited = (*userResourceType)(nil) - _ connectorbuilder.ResourceDeleterLimited = (*userResourceType)(nil) + _ connectorbuilder.ResourceSyncer = (*userResourceType)(nil) + _ connectorbuilder.AccountManagerLimited = (*userResourceType)(nil) + _ connectorbuilder.ResourceDeleterLimited = (*userResourceType)(nil) ) const userRoleProfileKey = "user_role" @@ -65,9 +65,7 @@ func userResource(ctx context.Context, user *linear.User, parentResourceID *v2.R } userTraitOptions := []sdkResource.UserTraitOption{ - sdkResource.WithUserProfile(profile), sdkResource.WithEmail(user.Email, true), - sdkResource.WithStatus(v2.UserTrait_Status_STATUS_ENABLED), } ret, err := sdkResource.NewUserResource( @@ -75,6 +73,8 @@ func userResource(ctx context.Context, user *linear.User, parentResourceID *v2.R resourceTypeUser, user.ID, userTraitOptions, + sdkResource.WithResourceProfile(profile), + sdkResource.WithResourceStatus(v2.Status_RESOURCE_STATUS_ENABLED, ""), sdkResource.WithParentResourceID(parentResourceID), ) if err != nil { @@ -125,11 +125,7 @@ func (o *userResourceType) Entitlements(_ context.Context, _ *v2.Resource, _ *pa func (o *userResourceType) Grants(ctx context.Context, resource *v2.Resource, pt *pagination.Token) ([]*v2.Grant, string, annotations.Annotations, error) { var rv []*v2.Grant - userTrait, err := sdkResource.GetUserTrait(resource) - if err != nil { - return nil, "", nil, fmt.Errorf("list-grants: Failed to get user trait from user: %w", err) - } - userProfile := userTrait.GetProfile() + userProfile := sdkResource.GetProfile(resource) userRole, present := sdkResource.GetProfileStringValue(userProfile, userRoleProfileKey) if !present { return nil, "", nil, fmt.Errorf("list-grants: user role was not present on profile")