(ctx context.Context, req *adminv1.ListProjectsForOrganizationAndUserRequest)
| 99 | } |
| 100 | |
| 101 | func (s *Server) ListProjectsForOrganizationAndUser(ctx context.Context, req *adminv1.ListProjectsForOrganizationAndUserRequest) (*adminv1.ListProjectsForOrganizationAndUserResponse, error) { |
| 102 | observability.AddRequestAttributes(ctx, |
| 103 | attribute.String("args.organization", req.Org), |
| 104 | attribute.String("args.user_id", req.UserId), |
| 105 | ) |
| 106 | |
| 107 | org, err := s.admin.DB.FindOrganizationByName(ctx, req.Org) |
| 108 | if err != nil { |
| 109 | return nil, err |
| 110 | } |
| 111 | |
| 112 | claims := auth.GetClaims(ctx) |
| 113 | if !claims.OrganizationPermissions(ctx, org.ID).ReadOrgMembers { |
| 114 | return nil, status.Error(codes.PermissionDenied, "does not have permission to read org members") |
| 115 | } |
| 116 | |
| 117 | pageToken, err := unmarshalPageToken(req.PageToken) |
| 118 | if err != nil { |
| 119 | return nil, err |
| 120 | } |
| 121 | pageSize := validPageSize(req.PageSize) |
| 122 | |
| 123 | projects, err := s.admin.DB.FindProjectsForOrgAndUser(ctx, org.ID, req.UserId, false, !req.Direct, pageToken.Val, pageSize) |
| 124 | if err != nil { |
| 125 | return nil, err |
| 126 | } |
| 127 | |
| 128 | nextToken := "" |
| 129 | if len(projects) >= pageSize { |
| 130 | nextToken = marshalPageToken(projects[len(projects)-1].Name) |
| 131 | } |
| 132 | |
| 133 | dtos := make([]*adminv1.Project, len(projects)) |
| 134 | for i, p := range projects { |
| 135 | dtos[i] = s.projToDTO(p, org.Name) |
| 136 | } |
| 137 | |
| 138 | var projectRoles map[string]*adminv1.ProjectMemberUser |
| 139 | if req.IncludeRoles && len(projects) > 0 { |
| 140 | ids := make([]string, len(projects)) |
| 141 | for i, p := range projects { |
| 142 | ids[i] = p.ID |
| 143 | } |
| 144 | members, err := s.admin.DB.FindProjectMemberUsersForUserAndProjects(ctx, req.UserId, ids) |
| 145 | if err != nil { |
| 146 | return nil, err |
| 147 | } |
| 148 | projectRoles = make(map[string]*adminv1.ProjectMemberUser, len(members)) |
| 149 | for projectID, m := range members { |
| 150 | projectRoles[projectID] = projMemberUserToPB(m) |
| 151 | } |
| 152 | } |
| 153 | |
| 154 | return &adminv1.ListProjectsForOrganizationAndUserResponse{ |
| 155 | Projects: dtos, |
| 156 | NextPageToken: nextToken, |
| 157 | ProjectRoles: projectRoles, |
| 158 | }, nil |
nothing calls this directly
no test coverage detected