[feature] Filters v1 (#2594)

* Implement client-side v1 filters

* Exclude linter false positives

* Update test/envparsing.sh

* Fix minor Swagger, style, and Bun usage issues

* Regenerate Swagger

* De-generify filter keywords

* Remove updating filter statuses

This is an operation that the Mastodon v2 filter API doesn't actually have, because filter statuses, unlike keywords, don't have options: the only info they contain is the status ID to be filtered.

* Add a test for filter statuses specifically

* De-generify filter statuses

* Inline FilterEntry

* Use vertical style for Bun operations consistently

* Add comment on Filter DB interface

* Remove GoLand linter control comments

Our existing linters should catch these, or they don't matter very much

* Reduce memory ratio for filters
This commit is contained in:
Vyr Cossont
2024-03-06 02:15:58 -08:00
committed by GitHub
parent 7bc536d1f7
commit 61a2b91f45
50 changed files with 4672 additions and 52 deletions

View File

@ -44,6 +44,7 @@ const (
maximumProfileFieldLength = 255
maximumProfileFields = 6
maximumListTitleLength = 200
maximumFilterKeywordLength = 40
)
// Password returns a helpful error if the given password
@ -306,3 +307,44 @@ func MarkerName(name string) error {
}
return fmt.Errorf("marker timeline name '%s' was not recognized, valid options are '%s', '%s'", name, apimodel.MarkerNameHome, apimodel.MarkerNameNotifications)
}
// FilterKeyword validates the title of a new or updated List.
func FilterKeyword(keyword string) error {
if keyword == "" {
return fmt.Errorf("filter keyword must be provided, and must be no more than %d chars", maximumFilterKeywordLength)
}
if length := len([]rune(keyword)); length > maximumFilterKeywordLength {
return fmt.Errorf("filter keyword length must be no more than %d chars, provided keyword was %d chars", maximumFilterKeywordLength, length)
}
return nil
}
// FilterContexts validates the context of a new or updated filter.
func FilterContexts(contexts []apimodel.FilterContext) error {
if len(contexts) == 0 {
return fmt.Errorf("at least one filter context is required")
}
for _, context := range contexts {
switch context {
case apimodel.FilterContextHome,
apimodel.FilterContextNotifications,
apimodel.FilterContextPublic,
apimodel.FilterContextThread,
apimodel.FilterContextAccount:
continue
default:
return fmt.Errorf(
"filter context '%s' was not recognized, valid options are '%s', '%s', '%s', '%s', '%s'",
context,
apimodel.FilterContextHome,
apimodel.FilterContextNotifications,
apimodel.FilterContextPublic,
apimodel.FilterContextThread,
apimodel.FilterContextAccount,
)
}
}
return nil
}