| 325 | } |
| 326 | |
| 327 | func Templates(ctx context.Context, db database.Store, actorID uuid.UUID, query string) (database.GetTemplatesWithFilterParams, []codersdk.ValidationError) { |
| 328 | // Always lowercase for all searches. |
| 329 | query = strings.ToLower(query) |
| 330 | values, errors := searchTerms(query, func(term string, values url.Values) error { |
| 331 | // Default to the display name |
| 332 | values.Add("display_name", term) |
| 333 | return nil |
| 334 | }) |
| 335 | if len(errors) > 0 { |
| 336 | return database.GetTemplatesWithFilterParams{}, errors |
| 337 | } |
| 338 | |
| 339 | parser := httpapi.NewQueryParamParser() |
| 340 | filter := database.GetTemplatesWithFilterParams{ |
| 341 | Deleted: parser.Boolean(values, false, "deleted"), |
| 342 | OrganizationID: parseOrganization(ctx, db, parser, values, "organization"), |
| 343 | ExactName: parser.String(values, "", "exact_name"), |
| 344 | ExactDisplayName: parser.String(values, "", "exact_display_name"), |
| 345 | FuzzyName: parser.String(values, "", "name"), |
| 346 | FuzzyDisplayName: parser.String(values, "", "display_name"), |
| 347 | IDs: parser.UUIDs(values, []uuid.UUID{}, "ids"), |
| 348 | Deprecated: parser.NullableBoolean(values, sql.NullBool{}, "deprecated"), |
| 349 | HasAITask: parser.NullableBoolean(values, sql.NullBool{}, "has-ai-task"), |
| 350 | AuthorID: parser.UUID(values, uuid.Nil, "author_id"), |
| 351 | AuthorUsername: parser.String(values, "", "author"), |
| 352 | HasExternalAgent: parser.NullableBoolean(values, sql.NullBool{}, "has_external_agent"), |
| 353 | } |
| 354 | |
| 355 | if filter.AuthorUsername == codersdk.Me { |
| 356 | filter.AuthorID = actorID |
| 357 | filter.AuthorUsername = "" |
| 358 | } |
| 359 | |
| 360 | parser.ErrorExcessParams(values) |
| 361 | return filter, parser.Errors |
| 362 | } |
| 363 | |
| 364 | func AIBridgeInterceptions(ctx context.Context, db database.Store, query string, page codersdk.Pagination, actorID uuid.UUID) (database.ListAIBridgeInterceptionsParams, []codersdk.ValidationError) { |
| 365 | // nolint:exhaustruct // Empty values just means "don't filter by that field". |