( ctx context.Context, filter string, query string, limit, offset *int, )
| 76 | } |
| 77 | |
| 78 | func (s *IssueService) getIssueFind( |
| 79 | ctx context.Context, |
| 80 | filter string, |
| 81 | query string, |
| 82 | limit, |
| 83 | offset *int, |
| 84 | ) (*store.FindIssueMessage, *filterIssueMessage, error) { |
| 85 | issueFind := &store.FindIssueMessage{ |
| 86 | Workspace: common.GetWorkspaceIDFromContext(ctx), |
| 87 | Limit: limit, |
| 88 | Offset: offset, |
| 89 | } |
| 90 | if query != "" { |
| 91 | issueFind.Query = &query |
| 92 | } |
| 93 | if filter == "" { |
| 94 | return issueFind, nil, nil |
| 95 | } |
| 96 | |
| 97 | e, err := cel.NewEnv() |
| 98 | if err != nil { |
| 99 | return nil, nil, connect.NewError(connect.CodeInternal, errors.Errorf("failed to create cel env")) |
| 100 | } |
| 101 | ast, iss := e.Parse(filter) |
| 102 | if iss != nil { |
| 103 | return nil, nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("failed to parse filter %v, error: %v", filter, iss.String())) |
| 104 | } |
| 105 | |
| 106 | filterIssue := &filterIssueMessage{} |
| 107 | |
| 108 | var parseFilter func(expr celast.Expr) (string, error) |
| 109 | parseFilter = func(expr celast.Expr) (string, error) { |
| 110 | switch expr.Kind() { |
| 111 | case celast.CallKind: |
| 112 | functionName := expr.AsCall().FunctionName() |
| 113 | switch functionName { |
| 114 | case celoperators.LogicalAnd: |
| 115 | return getSubConditionFromExpr(expr, parseFilter, "AND") |
| 116 | case celoperators.Equals: |
| 117 | variable, value := getVariableAndValueFromExpr(expr) |
| 118 | switch variable { |
| 119 | case "status": |
| 120 | issueStatus, err := convertToAPIIssueStatus(v1pb.IssueStatus(v1pb.IssueStatus_value[value.(string)])) |
| 121 | if err != nil { |
| 122 | return "", connect.NewError(connect.CodeInvalidArgument, errors.Errorf("failed to convert to issue status, err: %v", err)) |
| 123 | } |
| 124 | issueFind.StatusList = append(issueFind.StatusList, issueStatus) |
| 125 | case "type": |
| 126 | issueType, err := convertToAPIIssueType(v1pb.Issue_Type(v1pb.Issue_Type_value[value.(string)])) |
| 127 | if err != nil { |
| 128 | return "", connect.NewError(connect.CodeInvalidArgument, errors.Errorf("failed to convert to issue type, err: %v", err)) |
| 129 | } |
| 130 | issueFind.Types = &[]storepb.Issue_Type{issueType} |
| 131 | case "labels": |
| 132 | issueFind.LabelList = append(issueFind.LabelList, value.(string)) |
| 133 | case "approval_status": |
| 134 | approvalStatusValue, ok := v1pb.ApprovalStatus_value[value.(string)] |
| 135 | if !ok { |
no test coverage detected