(ctx context.Context, req *adminv1.ListProjectMemberUsersRequest)
| 1036 | } |
| 1037 | |
| 1038 | func (s *Server) ListProjectMemberUsers(ctx context.Context, req *adminv1.ListProjectMemberUsersRequest) (*adminv1.ListProjectMemberUsersResponse, error) { |
| 1039 | observability.AddRequestAttributes(ctx, |
| 1040 | attribute.String("args.org", req.Org), |
| 1041 | attribute.String("args.project", req.Project), |
| 1042 | ) |
| 1043 | |
| 1044 | proj, err := s.admin.DB.FindProjectByName(ctx, req.Org, req.Project) |
| 1045 | if err != nil { |
| 1046 | return nil, err |
| 1047 | } |
| 1048 | |
| 1049 | claims := auth.GetClaims(ctx) |
| 1050 | forceAccess := claims.Superuser(ctx) && req.SuperuserForceAccess |
| 1051 | if !claims.ProjectPermissions(ctx, proj.OrganizationID, proj.ID).ReadProjectMembers && !forceAccess { |
| 1052 | return nil, status.Error(codes.PermissionDenied, "not authorized to read project members") |
| 1053 | } |
| 1054 | |
| 1055 | token, err := unmarshalPageToken(req.PageToken) |
| 1056 | if err != nil { |
| 1057 | return nil, err |
| 1058 | } |
| 1059 | pageSize := validPageSize(req.PageSize) |
| 1060 | |
| 1061 | var roleID string |
| 1062 | if req.Role != "" { |
| 1063 | role, err := s.admin.DB.FindProjectRole(ctx, req.Role) |
| 1064 | if err != nil { |
| 1065 | return nil, err |
| 1066 | } |
| 1067 | roleID = role.ID |
| 1068 | } |
| 1069 | |
| 1070 | members, err := s.admin.DB.FindProjectMemberUsers(ctx, proj.OrganizationID, proj.ID, roleID, token.Val, pageSize) |
| 1071 | if err != nil { |
| 1072 | return nil, err |
| 1073 | } |
| 1074 | |
| 1075 | nextToken := "" |
| 1076 | if len(members) >= pageSize { |
| 1077 | nextToken = marshalPageToken(members[len(members)-1].Email) |
| 1078 | } |
| 1079 | |
| 1080 | dtos := make([]*adminv1.ProjectMemberUser, len(members)) |
| 1081 | for i, member := range members { |
| 1082 | dtos[i] = projMemberUserToPB(member) |
| 1083 | } |
| 1084 | |
| 1085 | return &adminv1.ListProjectMemberUsersResponse{ |
| 1086 | Members: dtos, |
| 1087 | NextPageToken: nextToken, |
| 1088 | }, nil |
| 1089 | } |
| 1090 | |
| 1091 | func (s *Server) ListProjectInvites(ctx context.Context, req *adminv1.ListProjectInvitesRequest) (*adminv1.ListProjectInvitesResponse, error) { |
| 1092 | observability.AddRequestAttributes(ctx, |
nothing calls this directly
no test coverage detected