@@ -82,27 +82,39 @@ func (t *CatalogChangesSearchRequest) Validate() error {
8282 }
8383
8484 if ! lo .Contains (allRecursiveOptions , t .Recursive ) {
85- return fmt .Errorf ("'recursive' must be one of %v" , allRecursiveOptions )
85+ if ! t .Lenient {
86+ return fmt .Errorf ("'recursive' must be one of %v" , allRecursiveOptions )
87+ }
88+ t .Recursive = CatalogChangeRecursiveDownstream
8689 }
8790
8891 if t .FromInsertedAt != "" {
8992 if expr , err := datemath .Parse (t .FromInsertedAt ); err != nil {
90- return fmt .Errorf ("invalid 'from_inserted_at' param: %w" , err )
93+ if ! t .Lenient {
94+ return fmt .Errorf ("invalid 'from_inserted_at' param: %w" , err )
95+ }
96+ t .FromInsertedAt = ""
9197 } else {
9298 t .fromInsertedAtParsed = expr .Time ()
9399 }
94100 }
95101
96102 if t .ToInsertedAt != "" {
97103 if expr , err := datemath .Parse (t .ToInsertedAt ); err != nil {
98- return fmt .Errorf ("invalid 'to_inserted_at' param: %w" , err )
104+ if ! t .Lenient {
105+ return fmt .Errorf ("invalid 'to_inserted_at' param: %w" , err )
106+ }
107+ t .ToInsertedAt = ""
99108 } else {
100109 t .toInsertedAtParsed = expr .Time ()
101110 }
102111 }
103112
104113 if ! t .fromInsertedAtParsed .IsZero () && ! t .toInsertedAtParsed .IsZero () && ! t .fromInsertedAtParsed .Before (t .toInsertedAtParsed ) {
105- return fmt .Errorf ("'from_inserted_at' must be before 'to_inserted_at'" )
114+ if ! t .Lenient {
115+ return fmt .Errorf ("'from_inserted_at' must be before 'to_inserted_at'" )
116+ }
117+ t .toInsertedAtParsed = time.Time {}
106118 }
107119
108120 if t .SortBy != "" {
@@ -112,7 +124,10 @@ func (t *CatalogChangesSearchRequest) Validate() error {
112124 }
113125
114126 if ! lo .Contains (allowedConfigChangesSortColumns , t .SortBy ) {
115- return fmt .Errorf ("invalid 'sort_by' param: %s. allowed sort fields are: %s" , t .SortBy , strings .Join (allowedConfigChangesSortColumns , ", " ))
127+ if ! t .Lenient {
128+ return fmt .Errorf ("invalid 'sort_by' param: %s. allowed sort fields are: %s" , t .SortBy , strings .Join (allowedConfigChangesSortColumns , ", " ))
129+ }
130+ t .SortBy = ""
116131 }
117132 }
118133
@@ -166,9 +181,9 @@ func (t *CatalogChangesSearchResponse) Summarize() {
166181 }
167182}
168183
169- func formSeverityQuery (severity string ) string {
184+ func formSeverityQuery (severity string ) ( string , error ) {
170185 if strings .HasPrefix (severity , "!" ) {
171- return severity
186+ return severity , nil
172187 }
173188
174189 severities := []models.Severity {
@@ -180,20 +195,14 @@ func formSeverityQuery(severity string) string {
180195 }
181196
182197 var applicable []string
183- found := false
184198 for _ , s := range severities {
185199 applicable = append (applicable , string (s ))
186200 if string (s ) == severity {
187- found = true
188- break
201+ return strings .Join (applicable , "," ), nil
189202 }
190203 }
191204
192- if ! found {
193- return "__invalid__"
194- }
195-
196- return strings .Join (applicable , "," )
205+ return "" , fmt .Errorf ("unknown severity %q" , severity )
197206}
198207
199208func FindCatalogChanges (ctx context.Context , req CatalogChangesSearchRequest ) (result * CatalogChangesSearchResponse , err error ) {
@@ -209,8 +218,14 @@ func FindCatalogChanges(ctx context.Context, req CatalogChangesSearchRequest) (r
209218 if err != nil {
210219 return nil , err
211220 }
221+ if len (configIDs ) == 0 && req .CatalogID != "" {
222+ return & CatalogChangesSearchResponse {}, nil
223+ }
212224
213- baseClauses , tagsFn := req .ApplyClauses ()
225+ baseClauses , tagsFn , err := req .ApplyClauses ()
226+ if err != nil {
227+ return nil , api .Errorf (api .EINVALID , "bad request: %v" , err )
228+ }
214229 var clauses []clause.Expression
215230 clauses = append (clauses , baseClauses ... )
216231
@@ -220,34 +235,39 @@ func FindCatalogChanges(ctx context.Context, req CatalogChangesSearchRequest) (r
220235 }
221236
222237 if req .ChangeType != "" {
223- if c , parseErr := parseAndBuildFilteringQuery (req .ChangeType , "change_type" , false ); parseErr == nil {
224- clauses = append (clauses , c ... )
225- } else {
238+ if c , parseErr := parseAndBuildFilteringQuery (req .ChangeType , "change_type" , false ); parseErr != nil && ! req .Lenient {
226239 return nil , parseErr
240+ } else if parseErr == nil {
241+ clauses = append (clauses , c ... )
227242 }
228243 }
229244
230245 if req .Severity != "" {
231- if c , parseErr := parseAndBuildFilteringQuery (formSeverityQuery (req .Severity ), "severity" , false ); parseErr == nil {
232- clauses = append (clauses , c ... )
233- } else {
234- return nil , api .Errorf (api .EINVALID , "failed to parse severity: %v" , parseErr )
246+ severityQuery , err := formSeverityQuery (req .Severity )
247+ if err != nil && ! req .Lenient {
248+ return nil , api .Errorf (api .EINVALID , "invalid severity: %v" , err )
249+ } else if err == nil {
250+ if c , parseErr := parseAndBuildFilteringQuery (severityQuery , "severity" , false ); parseErr != nil && ! req .Lenient {
251+ return nil , api .Errorf (api .EINVALID , "failed to parse severity: %v" , parseErr )
252+ } else if parseErr == nil {
253+ clauses = append (clauses , c ... )
254+ }
235255 }
236256 }
237257
238258 if req .Summary != "" {
239- if c , parseErr := parseAndBuildFilteringQuery (req .Summary , "summary" , true ); parseErr == nil {
240- clauses = append (clauses , c ... )
241- } else {
259+ if c , parseErr := parseAndBuildFilteringQuery (req .Summary , "summary" , true ); parseErr != nil && ! req .Lenient {
242260 return nil , api .Errorf (api .EINVALID , "failed to parse summary: %v" , parseErr )
261+ } else if parseErr == nil {
262+ clauses = append (clauses , c ... )
243263 }
244264 }
245265
246266 if req .Source != "" {
247- if c , parseErr := parseAndBuildFilteringQuery (req .Source , "source" , true ); parseErr == nil {
248- clauses = append (clauses , c ... )
249- } else {
267+ if c , parseErr := parseAndBuildFilteringQuery (req .Source , "source" , true ); parseErr != nil && ! req .Lenient {
250268 return nil , api .Errorf (api .EINVALID , "failed to parse source: %v" , parseErr )
269+ } else if parseErr == nil {
270+ clauses = append (clauses , c ... )
251271 }
252272 }
253273
@@ -264,10 +284,10 @@ func FindCatalogChanges(ctx context.Context, req CatalogChangesSearchRequest) (r
264284 }
265285
266286 if req .externalCreatedBy != "" {
267- if c , parseErr := parseAndBuildFilteringQuery (req .externalCreatedBy , "external_created_by" , true ); parseErr == nil {
268- clauses = append (clauses , c ... )
269- } else {
287+ if c , parseErr := parseAndBuildFilteringQuery (req .externalCreatedBy , "external_created_by" , true ); parseErr != nil && ! req .Lenient {
270288 return nil , api .Errorf (api .EINVALID , "failed to parse external createdby: %v" , parseErr )
289+ } else if parseErr == nil {
290+ clauses = append (clauses , c ... )
271291 }
272292 }
273293
0 commit comments