SearchProjects searches all projects on which the user has bb.projects.get permission.
(ctx context.Context, req *connect.Request[v1pb.SearchProjectsRequest])
| 132 | |
| 133 | // SearchProjects searches all projects on which the user has bb.projects.get permission. |
| 134 | func (s *ProjectService) SearchProjects(ctx context.Context, req *connect.Request[v1pb.SearchProjectsRequest]) (*connect.Response[v1pb.SearchProjectsResponse], error) { |
| 135 | user, ok := GetUserFromContext(ctx) |
| 136 | if !ok { |
| 137 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("user not found")) |
| 138 | } |
| 139 | |
| 140 | offset, err := parseLimitAndOffset(&pageSize{ |
| 141 | token: req.Msg.PageToken, |
| 142 | limit: int(req.Msg.PageSize), |
| 143 | maximum: 1000, |
| 144 | }) |
| 145 | if err != nil { |
| 146 | return nil, err |
| 147 | } |
| 148 | limitPlusOne := offset.limit + 1 |
| 149 | |
| 150 | find := &store.FindProjectMessage{ |
| 151 | Workspace: common.GetWorkspaceIDFromContext(ctx), |
| 152 | ShowDeleted: req.Msg.ShowDeleted, |
| 153 | Limit: &limitPlusOne, |
| 154 | Offset: &offset.offset, |
| 155 | } |
| 156 | filterQ, err := store.GetListProjectFilter(common.GetWorkspaceIDFromContext(ctx), req.Msg.Filter) |
| 157 | if err != nil { |
| 158 | return nil, connect.NewError(connect.CodeInvalidArgument, err) |
| 159 | } |
| 160 | find.FilterQ = filterQ |
| 161 | |
| 162 | orderByKeys, err := store.GetProjectOrders(req.Msg.OrderBy) |
| 163 | if err != nil { |
| 164 | return nil, connect.NewError(connect.CodeInvalidArgument, err) |
| 165 | } |
| 166 | find.OrderByKeys = orderByKeys |
| 167 | |
| 168 | projects, err := s.store.ListProjects(ctx, find) |
| 169 | if err != nil { |
| 170 | return nil, connect.NewError(connect.CodeInternal, err) |
| 171 | } |
| 172 | |
| 173 | nextPageToken := "" |
| 174 | if len(projects) == limitPlusOne { |
| 175 | projects = projects[:offset.limit] |
| 176 | if nextPageToken, err = offset.getNextPageToken(); err != nil { |
| 177 | return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to marshal next page token")) |
| 178 | } |
| 179 | } |
| 180 | |
| 181 | ok, err = s.iamManager.CheckPermission(ctx, permission.ProjectsGet, user, common.GetWorkspaceIDFromContext(ctx)) |
| 182 | if err != nil { |
| 183 | return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to check permission")) |
| 184 | } |
| 185 | if !ok { |
| 186 | var ps []*store.ProjectMessage |
| 187 | for _, project := range projects { |
| 188 | ok, err := s.iamManager.CheckPermission(ctx, permission.ProjectsGet, user, common.GetWorkspaceIDFromContext(ctx), project.ResourceID) |
| 189 | if err != nil { |
| 190 | return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to check permission for project %q", project.ResourceID)) |
| 191 | } |
nothing calls this directly
no test coverage detected