From c435d16ba696e3121040bf3bc03a7816e9e611ff Mon Sep 17 00:00:00 2001 From: Bryan Frimin Date: Mon, 22 Dec 2025 12:11:23 +0100 Subject: [PATCH] Add shortcut for only id selection Signed-off-by: Bryan Frimin --- pkg/server/api/connect/v1/types/membership.go | 3 ++ pkg/server/api/connect/v1/v1_resolver.go | 30 ++++++++++++++++++ pkg/server/gqlutils/query.go | 31 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 pkg/server/gqlutils/query.go diff --git a/pkg/server/api/connect/v1/types/membership.go b/pkg/server/api/connect/v1/types/membership.go index cd2e58973..4a195082d 100644 --- a/pkg/server/api/connect/v1/types/membership.go +++ b/pkg/server/api/connect/v1/types/membership.go @@ -69,6 +69,9 @@ func NewMembership(membership *coredata.Membership) *Membership { Organization: &Organization{ ID: membership.OrganizationID, }, + Profile: &MembershipProfile{ + ID: membership.ID, + }, // Permissions: membership.Permissions, // ProvisionedBy: membership.ProvisionedBy, // Active: membership.Active, diff --git a/pkg/server/api/connect/v1/v1_resolver.go b/pkg/server/api/connect/v1/v1_resolver.go index 2b705e0e9..5cb8907ff 100644 --- a/pkg/server/api/connect/v1/v1_resolver.go +++ b/pkg/server/api/connect/v1/v1_resolver.go @@ -110,6 +110,12 @@ func (r *identityResolver) PersonalAPIKeys(ctx context.Context, obj *types.Ident // Organization is the resolver for the organization field. func (r *invitationResolver) Organization(ctx context.Context, obj *types.Invitation) (*types.Organization, error) { + if gqlutils.OnlyIDSelected(ctx) { + return &types.Organization{ + ID: obj.Organization.ID, + }, nil + } + organization, err := r.iam.OrganizationService.GetOrganizationForInvitation(ctx, obj.ID) if err != nil { r.logger.ErrorCtx(ctx, "cannot get organization for invitation", log.Error(err)) @@ -145,6 +151,12 @@ func (r *invitationConnectionResolver) TotalCount(ctx context.Context, obj *type // Identity is the resolver for the identity field. func (r *membershipResolver) Identity(ctx context.Context, obj *types.Membership) (*types.Identity, error) { + if gqlutils.OnlyIDSelected(ctx) { + return &types.Identity{ + ID: obj.Identity.ID, + }, nil + } + identity, err := r.iam.AccountService.GetIdentityForMembership(ctx, obj.ID) if err != nil { r.logger.ErrorCtx(ctx, "cannot get identity for membership", log.Error(err)) @@ -156,6 +168,12 @@ func (r *membershipResolver) Identity(ctx context.Context, obj *types.Membership // Profile is the resolver for the profile field. func (r *membershipResolver) Profile(ctx context.Context, obj *types.Membership) (*types.MembershipProfile, error) { + if gqlutils.OnlyIDSelected(ctx) { + return &types.MembershipProfile{ + ID: obj.Profile.ID, + }, nil + } + profile, err := r.iam.AccountService.GetProfileForMembership(ctx, obj.ID) if err != nil { var errProfileNotFound *iam.ErrProfileNotFound @@ -172,6 +190,12 @@ func (r *membershipResolver) Profile(ctx context.Context, obj *types.Membership) // Organization is the resolver for the organization field. func (r *membershipResolver) Organization(ctx context.Context, obj *types.Membership) (*types.Organization, error) { + if gqlutils.OnlyIDSelected(ctx) { + return &types.Organization{ + ID: obj.Organization.ID, + }, nil + } + organization, err := r.iam.OrganizationService.GetOrganizationForMembership(ctx, obj.ID) if err != nil { r.logger.ErrorCtx(ctx, "cannot get organization for membership", log.Error(err)) @@ -1122,6 +1146,12 @@ func (r *sAMLConfigurationConnectionResolver) TotalCount(ctx context.Context, ob // Identity is the resolver for the identity field. func (r *sessionResolver) Identity(ctx context.Context, obj *types.Session) (*types.Identity, error) { + if gqlutils.OnlyIDSelected(ctx) { + return &types.Identity{ + ID: obj.Identity.ID, + }, nil + } + identity, err := r.iam.AccountService.GetIdentity(ctx, obj.Identity.ID) if err != nil { r.logger.ErrorCtx(ctx, "cannot get identity for session", log.Error(err)) diff --git a/pkg/server/gqlutils/query.go b/pkg/server/gqlutils/query.go new file mode 100644 index 000000000..b34c8fc59 --- /dev/null +++ b/pkg/server/gqlutils/query.go @@ -0,0 +1,31 @@ +// Copyright (c) 2025 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package gqlutils + +import ( + "context" + + "github.com/99designs/gqlgen/graphql" +) + +func OnlyIDSelected(ctx context.Context) bool { + fields := graphql.CollectFieldsCtx(ctx, nil) + + if len(fields) != 1 { + return false + } + + return fields[0].Name == "id" +}