(ctx context.Context, req *connect.Request[v1pb.ListIssuesRequest])
| 231 | } |
| 232 | |
| 233 | func (s *IssueService) ListIssues(ctx context.Context, req *connect.Request[v1pb.ListIssuesRequest]) (*connect.Response[v1pb.ListIssuesResponse], error) { |
| 234 | if req.Msg.PageSize < 0 { |
| 235 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("page size must be non-negative: %d", req.Msg.PageSize)) |
| 236 | } |
| 237 | |
| 238 | projectID, err := common.GetProjectID(req.Msg.Parent) |
| 239 | if err != nil { |
| 240 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("%v", err.Error())) |
| 241 | } |
| 242 | |
| 243 | offset, err := parseLimitAndOffset(&pageSize{ |
| 244 | token: req.Msg.PageToken, |
| 245 | limit: int(req.Msg.PageSize), |
| 246 | maximum: 1000, |
| 247 | }) |
| 248 | if err != nil { |
| 249 | return nil, err |
| 250 | } |
| 251 | limitPlusOne := offset.limit + 1 |
| 252 | |
| 253 | issueFind, issueFilter, err := s.getIssueFind(ctx, req.Msg.Filter, req.Msg.Query, &limitPlusOne, &offset.offset) |
| 254 | if err != nil { |
| 255 | return nil, err |
| 256 | } |
| 257 | issueFind.ProjectIDs = []string{projectID} |
| 258 | |
| 259 | orderByKeys, err := store.GetIssueOrders(req.Msg.OrderBy) |
| 260 | if err != nil { |
| 261 | return nil, connect.NewError(connect.CodeInvalidArgument, err) |
| 262 | } |
| 263 | issueFind.OrderByKeys = orderByKeys |
| 264 | |
| 265 | issues, err := s.store.ListIssues(ctx, issueFind) |
| 266 | if err != nil { |
| 267 | return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to search issue")) |
| 268 | } |
| 269 | |
| 270 | var nextPageToken string |
| 271 | if len(issues) == limitPlusOne { |
| 272 | if nextPageToken, err = offset.getNextPageToken(); err != nil { |
| 273 | return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to get next page token")) |
| 274 | } |
| 275 | issues = issues[:offset.limit] |
| 276 | } |
| 277 | |
| 278 | converted, err := s.convertToIssues(ctx, issues, issueFilter) |
| 279 | if err != nil { |
| 280 | return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to convert to issue")) |
| 281 | } |
| 282 | return connect.NewResponse(&v1pb.ListIssuesResponse{ |
| 283 | Issues: converted, |
| 284 | NextPageToken: nextPageToken, |
| 285 | }), nil |
| 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 { |
nothing calls this directly
no test coverage detected