diff --git a/app/controlplane/api/controlplane/v1/project.pb.go b/app/controlplane/api/controlplane/v1/project.pb.go index 2f94786a8..09ad7553e 100644 --- a/app/controlplane/api/controlplane/v1/project.pb.go +++ b/app/controlplane/api/controlplane/v1/project.pb.go @@ -174,7 +174,7 @@ type ProjectMember struct { UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` // The ID of latest project version this member is associated with LatestProjectVersionId string `protobuf:"bytes,6,opt,name=latest_project_version_id,json=latestProjectVersionId,proto3" json:"latest_project_version_id,omitempty"` - // Optional parent ID for nested project memberships + // Optional parent resource ID for nested project memberships ParentId *string `protobuf:"bytes,7,opt,name=parent_id,json=parentId,proto3,oneof" json:"parent_id,omitempty"` } diff --git a/app/controlplane/api/controlplane/v1/project.proto b/app/controlplane/api/controlplane/v1/project.proto index 5ef081c27..9badf03d8 100644 --- a/app/controlplane/api/controlplane/v1/project.proto +++ b/app/controlplane/api/controlplane/v1/project.proto @@ -68,7 +68,7 @@ message ProjectMember { google.protobuf.Timestamp updated_at = 5; // The ID of latest project version this member is associated with string latest_project_version_id = 6; - // Optional parent ID for nested project memberships + // Optional parent resource ID for nested project memberships optional string parent_id = 7; } diff --git a/app/controlplane/api/gen/frontend/controlplane/v1/project.ts b/app/controlplane/api/gen/frontend/controlplane/v1/project.ts index 4c3b91745..2d8e217b8 100644 --- a/app/controlplane/api/gen/frontend/controlplane/v1/project.ts +++ b/app/controlplane/api/gen/frontend/controlplane/v1/project.ts @@ -49,7 +49,7 @@ export interface ProjectMember { updatedAt?: Date; /** The ID of latest project version this member is associated with */ latestProjectVersionId: string; - /** Optional parent ID for nested project memberships */ + /** Optional parent resource ID for nested project memberships */ parentId?: string | undefined; } diff --git a/app/controlplane/api/gen/jsonschema/controlplane.v1.ProjectMember.jsonschema.json b/app/controlplane/api/gen/jsonschema/controlplane.v1.ProjectMember.jsonschema.json index e29c075c6..ffb8c2ff6 100644 --- a/app/controlplane/api/gen/jsonschema/controlplane.v1.ProjectMember.jsonschema.json +++ b/app/controlplane/api/gen/jsonschema/controlplane.v1.ProjectMember.jsonschema.json @@ -13,7 +13,7 @@ "type": "string" }, "^(parent_id)$": { - "description": "Optional parent ID for nested project memberships", + "description": "Optional parent resource ID for nested project memberships", "type": "string" }, "^(updated_at)$": { @@ -35,7 +35,7 @@ "type": "string" }, "parentId": { - "description": "Optional parent ID for nested project memberships", + "description": "Optional parent resource ID for nested project memberships", "type": "string" }, "role": { diff --git a/app/controlplane/api/gen/jsonschema/controlplane.v1.ProjectMember.schema.json b/app/controlplane/api/gen/jsonschema/controlplane.v1.ProjectMember.schema.json index 335f6bdba..64094b9a9 100644 --- a/app/controlplane/api/gen/jsonschema/controlplane.v1.ProjectMember.schema.json +++ b/app/controlplane/api/gen/jsonschema/controlplane.v1.ProjectMember.schema.json @@ -13,7 +13,7 @@ "type": "string" }, "^(parentId)$": { - "description": "Optional parent ID for nested project memberships", + "description": "Optional parent resource ID for nested project memberships", "type": "string" }, "^(updatedAt)$": { @@ -35,7 +35,7 @@ "type": "string" }, "parent_id": { - "description": "Optional parent ID for nested project memberships", + "description": "Optional parent resource ID for nested project memberships", "type": "string" }, "role": { diff --git a/app/controlplane/internal/service/project.go b/app/controlplane/internal/service/project.go index 61e621ce0..46db4bbcd 100644 --- a/app/controlplane/internal/service/project.go +++ b/app/controlplane/internal/service/project.go @@ -388,8 +388,8 @@ func bizProjectMembershipToPb(m *biz.ProjectMembership) *pb.ProjectMember { Role: role, } - if m.ParentID != nil { - pbMember.ParentId = biz.ToPtr(m.ParentID.String()) + if m.ParentResourceID != nil { + pbMember.ParentId = biz.ToPtr(m.ParentResourceID.String()) } if m.User != nil { diff --git a/app/controlplane/pkg/biz/project.go b/app/controlplane/pkg/biz/project.go index eb35c3971..a20864754 100644 --- a/app/controlplane/pkg/biz/project.go +++ b/app/controlplane/pkg/biz/project.go @@ -94,8 +94,10 @@ type ProjectMembership struct { CreatedAt *time.Time // UpdatedAt is the timestamp when the membership was last updated. UpdatedAt *time.Time - // ParentID is used for nested memberships, if applicable + // ParentID is the parent membership object used for nested memberships, if applicable ParentID *uuid.UUID + // ParentResourceID identifies the parent resource of this membership, if applicable + ParentResourceID *uuid.UUID } // GroupProjectInfo represents detailed information about a project that a group is a member of diff --git a/app/controlplane/pkg/data/project.go b/app/controlplane/pkg/data/project.go index 2031353a2..c304596d3 100644 --- a/app/controlplane/pkg/data/project.go +++ b/app/controlplane/pkg/data/project.go @@ -128,7 +128,7 @@ func (r *ProjectRepo) ListMembers(ctx context.Context, orgID uuid.UUID, projectI Where( membership.ResourceTypeEQ(authz.ResourceTypeProject), membership.ResourceID(projectID), - ) + ).WithParent() // Get total count before applying pagination totalCount, err := query.Count(ctx) @@ -362,6 +362,11 @@ func entProjectMembershipToBiz(m *ent.Membership, u *ent.User, g *ent.Group) *bi ParentID: m.ParentID, } + // Add the parent resource ID if it exists + if m.Edges.Parent != nil { + mem.ParentResourceID = &m.Edges.Parent.ResourceID + } + if u != nil { mem.User = entUserToBizUser(u) }