[feature] Implement Filter API v2 (#2936)

* Use correct entity name

* We support server-side filters now

* Document filter v1 methods that can throw a 409

* Validate v1 filter phrase as filter title

* Always check v1 filter API status codes in tests

* Document keyword minimum requirement on filter API v1

* Make it possible to specify filter keyword update columns per filter keyword

* Implement v2 filter API

* Fix lint and tests

* Update Swagger spec

* Fix filter update test

* Update Swagger spec *correctly*

* Update actual files Swagger spec was generated from

* Remove keywords_attributes and statuses_attributes

* Add test for serialization of empty filter

* More helpful messages when object is owned by wrong account
This commit is contained in:
Vyr Cossont
2024-05-31 03:55:56 -07:00
committed by GitHub
parent 4db596b8b9
commit 61a8d36255
66 changed files with 5601 additions and 55 deletions

View File

@@ -1053,7 +1053,7 @@ definitions:
type: string
x-go-name: Keyword
whole_word:
description: Should the filter consider word boundaries?
description: Should the filter keyword consider word boundaries?
example: true
type: boolean
x-go-name: WholeWord
@@ -5971,6 +5971,7 @@ paths:
Sample: fnord
in: formData
maxLength: 40
minLength: 1
name: phrase
required: true
type: string
@@ -6031,6 +6032,8 @@ paths:
description: not found
"406":
description: not acceptable
"409":
description: conflict (duplicate keyword)
"422":
description: unprocessable content
"500":
@@ -6045,7 +6048,7 @@ paths:
delete:
operationId: filterV1Delete
parameters:
- description: ID of the list
- description: ID of the filter
in: path
name: id
required: true
@@ -6120,6 +6123,7 @@ paths:
Sample: fnord
in: formData
maxLength: 40
minLength: 1
name: phrase
required: true
type: string
@@ -6180,6 +6184,8 @@ paths:
description: not found
"406":
description: not acceptable
"409":
description: conflict (duplicate keyword)
"422":
description: unprocessable content
"500":
@@ -8759,6 +8765,547 @@ paths:
summary: View + page through known accounts according to given filters.
tags:
- admin
/api/v2/filters:
get:
operationId: filtersV2Get
produces:
- application/json
responses:
"200":
description: Requested filters.
schema:
items:
$ref: '#/definitions/filterV2'
type: array
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"500":
description: internal server error
security:
- OAuth2 Bearer:
- read:filters
summary: Get all filters for the authenticated account.
tags:
- filters
post:
consumes:
- application/json
- application/xml
- application/x-www-form-urlencoded
operationId: filterV2Post
parameters:
- description: |-
The name of the filter.
Sample: illuminati nonsense
in: formData
maxLength: 200
minLength: 1
name: title
required: true
type: string
- collectionFormat: multi
description: |-
The contexts in which the filter should be applied.
Sample: home, public
enum:
- home
- notifications
- public
- thread
- account
in: formData
items:
type: string
minItems: 1
name: context[]
required: true
type: array
uniqueItems: true
- description: |-
Number of seconds from now that the filter should expire. If omitted, filter never expires.
Sample: 86400
in: formData
name: expires_in
type: number
- default: warn
description: |-
The action to be taken when a status matches this filter.
Sample: warn
enum:
- warn
- hide
in: formData
name: filter_action
type: string
produces:
- application/json
responses:
"200":
description: New filter.
schema:
$ref: '#/definitions/filterV2'
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"409":
description: conflict (duplicate title, keyword, or status)
"422":
description: unprocessable content
"500":
description: internal server error
security:
- OAuth2 Bearer:
- write:filters
summary: Create a single filter.
tags:
- filters
/api/v2/filters/{id}:
delete:
operationId: filterV2Delete
parameters:
- description: ID of the filter
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: filter deleted
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"500":
description: internal server error
security:
- OAuth2 Bearer:
- write:filters
summary: Delete a single filter with the given ID.
tags:
- filters
get:
operationId: filterV2Get
parameters:
- description: ID of the filter
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: Requested filter.
schema:
$ref: '#/definitions/filterV2'
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"500":
description: internal server error
security:
- OAuth2 Bearer:
- read:filters
summary: Get a single filter with the given ID.
tags:
- filters
put:
consumes:
- application/json
- application/xml
- application/x-www-form-urlencoded
description: |-
Note that this is actually closer to a PATCH operation:
only provided fields will be updated, and omitted fields will remain set to previous values.
operationId: filterV2Put
parameters:
- description: ID of the filter.
in: path
name: id
required: true
type: string
- description: |-
The name of the filter.
Sample: illuminati nonsense
in: formData
maxLength: 200
minLength: 1
name: title
required: true
type: string
- collectionFormat: multi
description: |-
The contexts in which the filter should be applied.
Sample: home, public
enum:
- home
- notifications
- public
- thread
- account
in: formData
items:
type: string
minItems: 1
name: context[]
required: true
type: array
uniqueItems: true
- description: |-
Number of seconds from now that the filter should expire.
Sample: 86400
in: formData
name: expires_in
type: number
produces:
- application/json
responses:
"200":
description: Updated filter.
schema:
$ref: '#/definitions/filterV2'
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"409":
description: conflict (duplicate title, keyword, or status)
"422":
description: unprocessable content
"500":
description: internal server error
security:
- OAuth2 Bearer:
- write:filters
summary: Update a single filter with the given ID.
tags:
- filters
/api/v2/filters/{id}/keywords:
get:
operationId: filterKeywordsGet
parameters:
- description: ID of the filter
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: Requested filter keywords.
schema:
items:
$ref: '#/definitions/filterKeyword'
type: array
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"500":
description: internal server error
security:
- OAuth2 Bearer:
- read:filters
summary: Get all filter keywords for a given filter.
tags:
- filters
post:
consumes:
- application/json
- application/xml
- application/x-www-form-urlencoded
operationId: filterKeywordPost
parameters:
- description: ID of the filter to add the filtered status to.
in: path
name: id
required: true
type: string
- description: |-
The text to be filtered
Sample: fnord
in: formData
maxLength: 40
minLength: 1
name: keyword
required: true
type: string
- default: false
description: |-
Should the filter consider word boundaries?
Sample: true
in: formData
name: whole_word
type: boolean
produces:
- application/json
responses:
"200":
description: New filter keyword.
schema:
$ref: '#/definitions/filterKeyword'
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"409":
description: conflict (duplicate keyword)
"422":
description: unprocessable content
"500":
description: internal server error
security:
- OAuth2 Bearer:
- write:filters
summary: Add a filter keyword to an existing filter.
tags:
- filters
/api/v2/filters/{id}/statuses:
get:
operationId: filterStatusesGet
parameters:
- description: ID of the filter
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: Requested filter statuses.
schema:
items:
$ref: '#/definitions/filterStatus'
type: array
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"500":
description: internal server error
security:
- OAuth2 Bearer:
- read:filters
summary: Get all filter statuses for a given filter.
tags:
- filters
post:
consumes:
- application/json
- application/xml
- application/x-www-form-urlencoded
operationId: filterStatusPost
parameters:
- description: ID of the filter to add the filtered status to.
in: path
name: id
required: true
type: string
- description: |-
The ID of the status to filter.
Sample: 01HXA2NE0K8T1C70K90E74GYD0
in: formData
name: status_id
required: true
type: string
produces:
- application/json
responses:
"200":
description: New filter status.
schema:
$ref: '#/definitions/filterStatus'
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"409":
description: conflict (duplicate status)
"422":
description: unprocessable content
"500":
description: internal server error
security:
- OAuth2 Bearer:
- write:filters
summary: Add a filter status to an existing filter.
tags:
- filters
/api/v2/filters/keywords/{id}:
get:
operationId: filterKeywordGet
parameters:
- description: ID of the filter keyword
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: Requested filter keyword.
schema:
$ref: '#/definitions/filterKeyword'
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"500":
description: internal server error
security:
- OAuth2 Bearer:
- read:filters
summary: Get a single filter keyword with the given ID.
tags:
- filters
/api/v2/filters/keywords{id}:
put:
consumes:
- application/json
- application/xml
- application/x-www-form-urlencoded
operationId: filterKeywordPut
parameters:
- description: ID of the filter keyword to update.
in: path
name: id
required: true
type: string
- description: |-
The text to be filtered
Sample: fnord
in: formData
maxLength: 40
minLength: 1
name: keyword
required: true
type: string
- description: |-
Should the filter consider word boundaries?
Sample: true
in: formData
name: whole_word
type: boolean
produces:
- application/json
responses:
"200":
description: Updated filter keyword.
schema:
$ref: '#/definitions/filterKeyword'
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"409":
description: conflict (duplicate keyword)
"422":
description: unprocessable content
"500":
description: internal server error
security:
- OAuth2 Bearer:
- write:filters
summary: Update a single filter keyword with the given ID.
tags:
- filters
/api/v2/filters/statuses/{id}:
get:
operationId: filterStatusGet
parameters:
- description: ID of the filter status
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: Requested filter status.
schema:
$ref: '#/definitions/filterStatus'
"400":
description: bad request
"401":
description: unauthorized
"404":
description: not found
"406":
description: not acceptable
"500":
description: internal server error
security:
- OAuth2 Bearer:
- read:filters
summary: Get a single filter status with the given ID.
tags:
- filters
/api/v2/instance:
get:
operationId: instanceGetV2