(ctx context.Context, req *connect.Request[v1pb.SearchIssuesRequest])
| 286 | } |
| 287 | |
| 288 | func (s *IssueService) SearchIssues(ctx context.Context, req *connect.Request[v1pb.SearchIssuesRequest]) (*connect.Response[v1pb.SearchIssuesResponse], error) { |
| 289 | if req.Msg.PageSize < 0 { |
| 290 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("page size must be non-negative: %d", req.Msg.PageSize)) |
| 291 | } |
| 292 | |
| 293 | projectID, err := common.GetProjectID(req.Msg.Parent) |
| 294 | if err != nil { |
| 295 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("%v", err.Error())) |
| 296 | } |
| 297 | |
| 298 | offset, err := parseLimitAndOffset(&pageSize{ |
| 299 | token: req.Msg.PageToken, |
| 300 | limit: int(req.Msg.PageSize), |
| 301 | maximum: 1000, |
| 302 | }) |
| 303 | if err != nil { |
| 304 | return nil, err |
| 305 | } |
| 306 | limitPlusOne := offset.limit + 1 |
| 307 | |
| 308 | issueFind, issueFilter, err := s.getIssueFind(ctx, req.Msg.Filter, req.Msg.Query, &limitPlusOne, &offset.offset) |
| 309 | if err != nil { |
| 310 | return nil, err |
| 311 | } |
| 312 | |
| 313 | orderByKeys, err := store.GetIssueOrders(req.Msg.OrderBy) |
| 314 | if err != nil { |
| 315 | return nil, connect.NewError(connect.CodeInvalidArgument, err) |
| 316 | } |
| 317 | issueFind.OrderByKeys = orderByKeys |
| 318 | |
| 319 | var projectIDs []string |
| 320 | if projectID != "-" { |
| 321 | projectIDs = append(projectIDs, projectID) |
| 322 | } else { |
| 323 | // Cross-project search |
| 324 | user, ok := GetUserFromContext(ctx) |
| 325 | if !ok { |
| 326 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("user not found")) |
| 327 | } |
| 328 | projectIDsFilter, err := getProjectIDsSearchFilter(ctx, user, permission.IssuesGet, s.iamManager, s.store) |
| 329 | if err != nil { |
| 330 | return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to get projectIDs")) |
| 331 | } |
| 332 | if projectIDsFilter != nil { |
| 333 | projectIDs = *projectIDsFilter |
| 334 | } |
| 335 | } |
| 336 | issueFind.ProjectIDs = projectIDs |
| 337 | |
| 338 | issues, err := s.store.ListIssues(ctx, issueFind) |
| 339 | if err != nil { |
| 340 | return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to search issue")) |
| 341 | } |
| 342 | |
| 343 | var nextPageToken string |
| 344 | if len(issues) == limitPlusOne { |
| 345 | if nextPageToken, err = offset.getNextPageToken(); err != nil { |
nothing calls this directly
no test coverage detected