MCPcopy Create free account
hub / github.com/chainloop-dev/chainloop / ListProjectsByGroup

Method ListProjectsByGroup

app/controlplane/pkg/data/group.go:690–793  ·  view source on GitHub ↗

ListProjectsByGroup retrieves a list of projects that a group is a member of with pagination.

(ctx context.Context, orgID uuid.UUID, groupID uuid.UUID, visibleProjectIDs []uuid.UUID, paginationOpts *pagination.OffsetPaginationOpts)

Source from the content-addressed store, hash-verified

688
689// ListProjectsByGroup retrieves a list of projects that a group is a member of with pagination.
690func (g GroupRepo) ListProjectsByGroup(ctx context.Context, orgID uuid.UUID, groupID uuid.UUID, visibleProjectIDs []uuid.UUID, paginationOpts *pagination.OffsetPaginationOpts) ([]*biz.GroupProjectInfo, int, error) {
691 ctx, span := otelx.Start(ctx, groupRepoTracer, "GroupRepo.ListProjectsByGroup")
692 defer span.End()
693
694 if paginationOpts == nil {
695 paginationOpts = pagination.NewDefaultOffsetPaginationOpts()
696 }
697
698 // Get all memberships where this group is a member and the resource type is a project
699 membershipQuery := g.data.DB.Membership.Query().
700 Where(
701 membership.MemberIDEQ(groupID),
702 membership.MembershipTypeEQ(authz.MembershipTypeGroup),
703 membership.ResourceTypeEQ(authz.ResourceTypeProject),
704 membership.HasOrganizationWith(organization.IDEQ(orgID)),
705 )
706
707 // If visibleProjectIDs is provided, filter memberships to include only those projects
708 if visibleProjectIDs != nil {
709 membershipQuery = membershipQuery.Where(membership.ResourceIDIn(visibleProjectIDs...))
710 }
711
712 // Get total count first (after applying visibility filters)
713 count, err := membershipQuery.Count(ctx)
714 if err != nil {
715 return nil, 0, fmt.Errorf("failed to count project memberships: %w", err)
716 }
717
718 // Apply pagination to the memberships query
719 memberships, err := membershipQuery.
720 Order(ent.Desc(membership.FieldCreatedAt)).
721 Offset(paginationOpts.Offset()).
722 Limit(paginationOpts.Limit()).
723 All(ctx)
724 if err != nil {
725 return nil, 0, fmt.Errorf("failed to query memberships: %w", err)
726 }
727
728 // If no memberships found, return empty result
729 if len(memberships) == 0 {
730 return []*biz.GroupProjectInfo{}, count, nil
731 }
732
733 // Extract project IDs from memberships
734 projectIDs := make([]uuid.UUID, 0, len(memberships))
735 for _, m := range memberships {
736 projectIDs = append(projectIDs, m.ResourceID)
737 }
738
739 // Query the projects
740 entProjects, err := g.data.DB.Project.Query().
741 Where(
742 project.IDIn(projectIDs...),
743 project.OrganizationID(orgID),
744 project.DeletedAtIsNil(),
745 ).
746 WithVersions(func(query *ent.ProjectVersionQuery) {
747 query.Where(projectversion.Latest(true), projectversion.DeletedAtIsNil()).Select(projectversion.FieldID)

Callers

nothing calls this directly

Implementers 1

GroupRepoapp/controlplane/pkg/data/group.go

Calls 15

StartFunction · 0.92
MemberIDEQFunction · 0.92
MembershipTypeEQFunction · 0.92
ResourceTypeEQFunction · 0.92
HasOrganizationWithFunction · 0.92
IDEQFunction · 0.92
ResourceIDInFunction · 0.92
DescFunction · 0.92
IDInFunction · 0.92
OrganizationIDFunction · 0.92
DeletedAtIsNilFunction · 0.92

Tested by

no test coverage detected