diff options
author | 2024-03-06 09:05:45 -0800 | |
---|---|---|
committer | 2024-03-06 18:05:45 +0100 | |
commit | fc3741365c27f1d703e8a736af95b95ff811cc45 (patch) | |
tree | 929f1d5e20d1469d63a3dfe81d38d89f9a073c5a /internal | |
parent | [chore/bugfix] Little DB fixes (#2726) (diff) | |
download | gotosocial-fc3741365c27f1d703e8a736af95b95ff811cc45.tar.xz |
[bugfix] Fix Swagger spec and add test script (#2698)
* Add Swagger spec test script
* Fix Swagger spec errors not related to statuses with polls
* Add API tests that post a status with a poll
* Fix creating a status with a poll from form params
* Fix Swagger spec errors related to statuses with polls (this is the last error)
* Fix Swagger spec warnings not related to unused definitions
* Suppress a duplicate list update params definition that was somehow causing wrong param names
* Add Swagger test to CI
- updates Drone config
- vendorizes go-swagger
- fixes a file extension issue that caused the test script to generate JSON instead of YAML with the vendorized version
* Put `Sample: ` on its own line everywhere
* Remove unused id param from emojiCategoriesGet
* Add 5 more pairs of profile fields to account update API Swagger
* Remove Swagger prefix from dummy fields
It makes the generated code look weird
* Manually annotate params for statusCreate operation
* Fix all remaining Swagger spec warnings
- Change some models into operation parameters
- Ignore models that already correspond to manually documented operation parameters but can't be trivially changed (those with file fields)
* Documented that creating a status with scheduled_at isn't implemented yet
* sign drone.yml
* Fix filter API Swagger errors
* fixup! Fix filter API Swagger errors
---------
Co-authored-by: tobi <tobi.smethurst@protonmail.com>
Diffstat (limited to 'internal')
34 files changed, 434 insertions, 140 deletions
diff --git a/internal/api/activitypub/users/common.go b/internal/api/activitypub/users/common.go index 2f16c7331..a10b99d95 100644 --- a/internal/api/activitypub/users/common.go +++ b/internal/api/activitypub/users/common.go @@ -72,7 +72,7 @@ type SwaggerFeaturedCollection struct { // example: OrderedCollection Type string `json:"type"` // List of status URIs. - // example: ['https://example.org/users/some_user/statuses/01GSZ0F7Q8SJKNRF777GJD271R', 'https://example.org/users/some_user/statuses/01GSZ0G012CBQ7TEKX689S3QRE'] + // example: ["https://example.org/users/some_user/statuses/01GSZ0F7Q8SJKNRF777GJD271R", "https://example.org/users/some_user/statuses/01GSZ0G012CBQ7TEKX689S3QRE"] Items []string `json:"items"` // Number of items in this collection. // example: 2 diff --git a/internal/api/activitypub/users/featured.go b/internal/api/activitypub/users/featured.go index f256c1e75..b8b4fe681 100644 --- a/internal/api/activitypub/users/featured.go +++ b/internal/api/activitypub/users/featured.go @@ -44,6 +44,14 @@ import ( // produces: // - application/activity+json // +// parameters: +// - +// name: username +// type: string +// description: Account name of the user +// in: path +// required: true +// // responses: // '200': // in: body diff --git a/internal/api/client/accounts/accountupdate.go b/internal/api/client/accounts/accountupdate.go index 41f76adf5..02c0fc5ac 100644 --- a/internal/api/client/accounts/accountupdate.go +++ b/internal/api/client/accounts/accountupdate.go @@ -120,12 +120,67 @@ import ( // description: Enable RSS feed for this account's Public posts at `/[username]/feed.rss` // type: boolean // - -// name: fields_attributes +// name: fields_attributes[0][name] // in: formData -// description: Profile fields to be added to this account's profile -// type: array -// items: -// type: object +// description: Name of 1st profile field to be added to this account's profile. +// (The index may be any string; add more indexes to send more fields.) +// type: string +// - +// name: fields_attributes[0][value] +// in: formData +// description: Value of 1st profile field to be added to this account's profile. +// (The index may be any string; add more indexes to send more fields.) +// type: string +// - +// name: fields_attributes[1][name] +// in: formData +// description: Name of 2nd profile field to be added to this account's profile. +// type: string +// - +// name: fields_attributes[1][value] +// in: formData +// description: Value of 2nd profile field to be added to this account's profile. +// type: string +// - +// name: fields_attributes[2][name] +// in: formData +// description: Name of 3rd profile field to be added to this account's profile. +// type: string +// - +// name: fields_attributes[2][value] +// in: formData +// description: Value of 3rd profile field to be added to this account's profile. +// type: string +// - +// name: fields_attributes[3][name] +// in: formData +// description: Name of 4th profile field to be added to this account's profile. +// type: string +// - +// name: fields_attributes[3][value] +// in: formData +// description: Value of 4th profile field to be added to this account's profile. +// type: string +// - +// name: fields_attributes[4][name] +// in: formData +// description: Name of 5th profile field to be added to this account's profile. +// type: string +// - +// name: fields_attributes[4][value] +// in: formData +// description: Value of 5th profile field to be added to this account's profile. +// type: string +// - +// name: fields_attributes[5][name] +// in: formData +// description: Name of 6th profile field to be added to this account's profile. +// type: string +// - +// name: fields_attributes[5][value] +// in: formData +// description: Value of 6th profile field to be added to this account's profile. +// type: string // // security: // - OAuth2 Bearer: diff --git a/internal/api/client/admin/domainkeysexpire.go b/internal/api/client/admin/domainkeysexpire.go index 10a7597a4..4990d879f 100644 --- a/internal/api/client/admin/domainkeysexpire.go +++ b/internal/api/client/admin/domainkeysexpire.go @@ -61,8 +61,9 @@ import ( // - // name: domain // in: formData -// description: Domain to expire keys for. -// example: example.org +// description: |- +// Domain to expire keys for. +// Sample: example.org // type: string // // security: diff --git a/internal/api/client/admin/emojicategoriesget.go b/internal/api/client/admin/emojicategoriesget.go index 2c097c6df..51eb8fee4 100644 --- a/internal/api/client/admin/emojicategoriesget.go +++ b/internal/api/client/admin/emojicategoriesget.go @@ -38,21 +38,13 @@ import ( // produces: // - application/json // -// parameters: -// - -// name: id -// type: string -// description: The id of the emoji. -// in: path -// required: true -// // responses: // '200': // description: Array of existing emoji categories. // schema: // type: array // items: -// "$ref": "#/definitions/adminEmojiCategory" +// "$ref": "#/definitions/emojiCategory" // '400': // description: bad request // '401': diff --git a/internal/api/client/admin/emojicreate.go b/internal/api/client/admin/emojicreate.go index 5d024f039..9086b27e0 100644 --- a/internal/api/client/admin/emojicreate.go +++ b/internal/api/client/admin/emojicreate.go @@ -67,10 +67,11 @@ import ( // name: category // in: formData // description: >- -// Category in which to place the new emoji. 64 characters or less. +// Category in which to place the new emoji. // If left blank, emoji will be uncategorized. If a category with the // given name doesn't exist yet, it will be created. // type: string +// maximumLength: 64 // required: false // // security: diff --git a/internal/api/client/admin/emojiupdate.go b/internal/api/client/admin/emojiupdate.go index f531f36f9..ffde2d597 100644 --- a/internal/api/client/admin/emojiupdate.go +++ b/internal/api/client/admin/emojiupdate.go @@ -73,6 +73,10 @@ import ( // For REMOTE emojis, `copy` or `disable` are supported. // For LOCAL emojis, only `modify` is supported. // type: string +// enum: +// - copy +// - disable +// - modify // required: true // - // name: shortcode @@ -94,9 +98,10 @@ import ( // name: category // in: formData // description: >- -// Category in which to place the emoji. 64 characters or less. +// Category in which to place the emoji. // If a category with the given name doesn't exist yet, it will be created. // type: string +// maximumLength: 64 // // security: // - OAuth2 Bearer: diff --git a/internal/api/client/admin/reportresolve.go b/internal/api/client/admin/reportresolve.go index 9c1c32afe..2ad979b0b 100644 --- a/internal/api/client/admin/reportresolve.go +++ b/internal/api/client/admin/reportresolve.go @@ -60,8 +60,9 @@ import ( // Useful for providing an explanation about what action was taken (if any) // before the report was marked as resolved. This will be visible to the user // that created the report! +// +// Sample: The reported account was suspended. // type: string -// example: The reported account was suspended. // // security: // - OAuth2 Bearer: diff --git a/internal/api/client/admin/rulecreate.go b/internal/api/client/admin/rulecreate.go index e838bff1e..155c69db0 100644 --- a/internal/api/client/admin/rulecreate.go +++ b/internal/api/client/admin/rulecreate.go @@ -43,15 +43,6 @@ import ( // produces: // - application/json // -// parameters: -// - -// name: text -// in: formData -// description: >- -// Text body for the instance rule, plaintext. -// type: string -// required: true -// // security: // - OAuth2 Bearer: // - admin diff --git a/internal/api/client/admin/ruledelete.go b/internal/api/client/admin/ruledelete.go index dfa84615f..834149978 100644 --- a/internal/api/client/admin/ruledelete.go +++ b/internal/api/client/admin/ruledelete.go @@ -28,7 +28,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/oauth" ) -// RuleDELETEHandler swagger:operation DELETE /api/v1/admin/instance/rules{id} ruleDelete +// RuleDELETEHandler swagger:operation DELETE /api/v1/admin/instance/rules/{id} ruleDelete // // Delete an existing instance rule. // @@ -45,10 +45,10 @@ import ( // parameters: // - // name: id -// in: formData +// in: path // description: >- // The id of the rule to delete. -// type: path +// type: string // required: true // // security: diff --git a/internal/api/client/admin/rulesget.go b/internal/api/client/admin/rulesget.go index 2cc9e0158..e00ff1c07 100644 --- a/internal/api/client/admin/rulesget.go +++ b/internal/api/client/admin/rulesget.go @@ -27,7 +27,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/oauth" ) -// rulesGETHandler swagger:operation GET /api/v1/admin/rules rules +// RulesGETHandler swagger:operation GET /api/v1/admin/rules adminsRuleGet // // View instance rules, with IDs. // diff --git a/internal/api/client/admin/ruleupdate.go b/internal/api/client/admin/ruleupdate.go index eafa3af34..2ba31485e 100644 --- a/internal/api/client/admin/ruleupdate.go +++ b/internal/api/client/admin/ruleupdate.go @@ -29,7 +29,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/oauth" ) -// RulePATCHHandler swagger:operation PATCH /api/v1/admin/instance/rules{id} ruleUpdate +// RulePATCHHandler swagger:operation PATCH /api/v1/admin/instance/rules/{id} ruleUpdate // // Update an existing instance rule. // @@ -43,22 +43,6 @@ import ( // produces: // - application/json // -// parameters: -// - -// name: id -// in: formData -// description: >- -// The id of the rule to update. -// type: path -// required: true -// - -// name: text -// in: formData -// description: >- -// Text body for the updated instance rule, plaintext. -// type: string -// required: true -// // security: // - OAuth2 Bearer: // - admin diff --git a/internal/api/client/filters/v1/filterpost.go b/internal/api/client/filters/v1/filterpost.go index b0a626199..e150e8609 100644 --- a/internal/api/client/filters/v1/filterpost.go +++ b/internal/api/client/filters/v1/filterpost.go @@ -48,49 +48,58 @@ import ( // name: phrase // in: formData // required: true -// description: The text to be filtered. +// description: |- +// The text to be filtered. +// +// Sample: fnord // maxLength: 40 // type: string -// example: "fnord" // - // name: context // in: formData // required: true -// description: The contexts in which the filter should be applied. +// description: |- +// The contexts in which the filter should be applied. +// +// Sample: home, public // enum: // - home // - notifications // - public // - thread // - account -// example: -// - home -// - public -// items: -// $ref: '#/definitions/filterContext' -// minLength: 1 // type: array +// items: +// type: +// string +// minItems: 1 // uniqueItems: true // - // name: expires_in // in: formData -// description: Number of seconds from now that the filter should expire. If omitted, filter never expires. +// description: |- +// Number of seconds from now that the filter should expire. If omitted, filter never expires. +// +// Sample: 86400 // type: number -// example: 86400 // - // name: irreversible // in: formData -// description: Should matching entities be removed from the user's timelines/views, instead of hidden? Not supported yet. +// description: |- +// Should matching entities be removed from the user's timelines/views, instead of hidden? Not supported yet. +// +// Sample: false // type: boolean // default: false -// example: false // - // name: whole_word // in: formData -// description: Should the filter consider word boundaries? +// description: |- +// Should the filter consider word boundaries? +// +// Sample: true // type: boolean // default: false -// example: true // // security: // - OAuth2 Bearer: diff --git a/internal/api/client/filters/v1/filterput.go b/internal/api/client/filters/v1/filterput.go index c686e4515..1822efb6d 100644 --- a/internal/api/client/filters/v1/filterput.go +++ b/internal/api/client/filters/v1/filterput.go @@ -54,49 +54,58 @@ import ( // name: phrase // in: formData // required: true -// description: The text to be filtered. +// description: |- +// The text to be filtered. +// +// Sample: fnord // maxLength: 40 // type: string -// example: "fnord" // - // name: context // in: formData // required: true -// description: The contexts in which the filter should be applied. +// description: |- +// The contexts in which the filter should be applied. +// +// Sample: home, public // enum: // - home // - notifications // - public // - thread // - account -// example: -// - home -// - public -// items: -// $ref: '#/definitions/filterContext' -// minLength: 1 // type: array +// items: +// type: +// string +// minItems: 1 // uniqueItems: true // - // name: expires_in // in: formData -// description: Number of seconds from now that the filter should expire. If omitted, filter never expires. +// description: |- +// Number of seconds from now that the filter should expire. If omitted, filter never expires. +// +// Sample: 86400 // type: number -// example: 86400 // - // name: irreversible // in: formData -// description: Should matching entities be removed from the user's timelines/views, instead of hidden? Not supported yet. +// description: |- +// Should matching entities be removed from the user's timelines/views, instead of hidden? Not supported yet. +// +// Sample: false // type: boolean // default: false -// example: false // - // name: whole_word // in: formData -// description: Should the filter consider word boundaries? +// description: |- +// Should the filter consider word boundaries? +// +// Sample: true // type: boolean // default: false -// example: true // // security: // - OAuth2 Bearer: diff --git a/internal/api/client/instance/instancepatch.go b/internal/api/client/instance/instancepatch.go index 484579cf2..58549a866 100644 --- a/internal/api/client/instance/instancepatch.go +++ b/internal/api/client/instance/instancepatch.go @@ -52,7 +52,7 @@ import ( // in: formData // description: Title to use for the instance. // type: string -// maximum: 40 +// maxLength: 40 // allowEmptyValue: true // - // name: contact_username @@ -73,21 +73,21 @@ import ( // in: formData // description: Short description of the instance. // type: string -// maximum: 500 +// maxLength: 500 // allowEmptyValue: true // - // name: description // in: formData // description: Longer description of the instance. // type: string -// maximum: 5000 +// maxLength: 5000 // allowEmptyValue: true // - // name: terms // in: formData // description: Terms and conditions of the instance. // type: string -// maximum: 5000 +// maxLength: 5000 // allowEmptyValue: true // - // name: thumbnail @@ -113,7 +113,7 @@ import ( // '200': // description: "The newly updated instance." // schema: -// "$ref": "#/definitions/instance" +// "$ref": "#/definitions/instanceV1" // '400': // description: bad request // '401': diff --git a/internal/api/client/lists/listupdate.go b/internal/api/client/lists/listupdate.go index 58a4cf1c4..966de4098 100644 --- a/internal/api/client/lists/listupdate.go +++ b/internal/api/client/lists/listupdate.go @@ -57,9 +57,10 @@ import ( // - // name: title // type: string -// description: Title of this list. +// description: |- +// Title of this list. +// Sample: Cool People // in: formData -// example: Cool People // - // name: replies_policy // type: string @@ -68,8 +69,12 @@ import ( // followed = Show replies to any followed user // list = Show replies to members of the list // none = Show replies to no one +// Sample: list +// enum: +// - followed +// - list +// - none // in: formData -// example: list // // security: // - OAuth2 Bearer: diff --git a/internal/api/client/notifications/notificationget.go b/internal/api/client/notifications/notificationget.go index 551eeca39..66bdefb28 100644 --- a/internal/api/client/notifications/notificationget.go +++ b/internal/api/client/notifications/notificationget.go @@ -38,6 +38,14 @@ import ( // produces: // - application/json // +// parameters: +// - +// name: id +// type: string +// description: The ID of the notification. +// in: path +// required: true +// // security: // - OAuth2 Bearer: // - read:notifications diff --git a/internal/api/client/statuses/statuscreate.go b/internal/api/client/statuses/statuscreate.go index 929adaa6f..efbe79223 100644 --- a/internal/api/client/statuses/statuscreate.go +++ b/internal/api/client/statuses/statuscreate.go @@ -48,6 +48,145 @@ import ( // - application/xml // - application/x-www-form-urlencoded // +// parameters: +// - +// name: status +// x-go-name: Status +// description: |- +// Text content of the status. +// If media_ids is provided, this becomes optional. +// Attaching a poll is optional while status is provided. +// type: string +// in: formData +// - +// name: media_ids +// x-go-name: MediaIDs +// description: |- +// Array of Attachment ids to be attached as media. +// If provided, status becomes optional, and poll cannot be used. +// +// If the status is being submitted as a form, the key is 'media_ids[]', +// but if it's json or xml, the key is 'media_ids'. +// type: array +// items: +// type: string +// in: formData +// - +// name: poll[options][] +// x-go-name: PollOptions +// description: |- +// Array of possible poll answers. +// If provided, media_ids cannot be used, and poll[expires_in] must be provided. +// type: array +// items: +// type: string +// in: formData +// - +// name: poll[expires_in] +// x-go-name: PollExpiresIn +// description: |- +// Duration the poll should be open, in seconds. +// If provided, media_ids cannot be used, and poll[options] must be provided. +// type: integer +// format: int64 +// in: formData +// - +// name: poll[multiple] +// x-go-name: PollMultiple +// description: Allow multiple choices on this poll. +// type: boolean +// default: false +// in: formData +// - +// name: poll[hide_totals] +// x-go-name: PollHideTotals +// description: Hide vote counts until the poll ends. +// type: boolean +// default: true +// in: formData +// - +// name: in_reply_to_id +// x-go-name: InReplyToID +// description: ID of the status being replied to, if status is a reply. +// type: string +// in: formData +// - +// name: sensitive +// x-go-name: Sensitive +// description: Status and attached media should be marked as sensitive. +// type: boolean +// in: formData +// - +// name: spoiler_text +// x-go-name: SpoilerText +// description: |- +// Text to be shown as a warning or subject before the actual content. +// Statuses are generally collapsed behind this field. +// type: string +// in: formData +// - +// name: visibility +// x-go-name: Visibility +// description: Visibility of the posted status. +// type: string +// enum: +// - public +// - unlisted +// - private +// - mutuals_only +// - direct +// in: formData +// - +// name: scheduled_at +// x-go-name: ScheduledAt +// description: |- +// ISO 8601 Datetime at which to schedule a status. +// Providing this parameter will cause ScheduledStatus to be returned instead of Status. +// Must be at least 5 minutes in the future. +// +// This feature isn't implemented yet. +// type: string +// in: formData +// - +// name: language +// x-go-name: Language +// description: ISO 639 language code for this status. +// type: string +// in: formData +// - +// name: content_type +// x-go-name: ContentType +// description: Content type to use when parsing this status. +// type: string +// enum: +// - text/plain +// - text/markdown +// in: formData +// - +// name: federated +// x-go-name: Federated +// description: This status will be federated beyond the local timeline(s). +// in: formData +// type: boolean +// - +// name: boostable +// x-go-name: Boostable +// description: This status can be boosted/reblogged. +// in: formData +// type: boolean +// - +// name: replyable +// x-go-name: Replyable +// description: This status can be replied to. +// in: formData +// type: boolean +// - +// name: likeable +// x-go-name: Likeable +// description: This status can be liked/faved. +// in: formData +// type: boolean +// // produces: // - application/json // diff --git a/internal/api/client/statuses/statuscreate_test.go b/internal/api/client/statuses/statuscreate_test.go index 881943450..ab7c67abf 100644 --- a/internal/api/client/statuses/statuscreate_test.go +++ b/internal/api/client/statuses/statuscreate_test.go @@ -21,10 +21,12 @@ import ( "context" "encoding/json" "fmt" + "io" "io/ioutil" "net/http" "net/http/httptest" "net/url" + "strings" "testing" "github.com/stretchr/testify/suite" @@ -427,6 +429,74 @@ func (suite *StatusCreateTestSuite) TestPostNewStatusWithNoncanonicalLanguageTag suite.Equal("en-US", *statusReply.Language) } +// Post a new status with an attached poll. +func (suite *StatusCreateTestSuite) testPostNewStatusWithPoll(configure func(request *http.Request)) { + t := suite.testTokens["local_account_1"] + oauthToken := oauth.DBTokenToToken(t) + + // setup + recorder := httptest.NewRecorder() + ctx, _ := testrig.CreateGinTestContext(recorder, nil) + ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) + ctx.Set(oauth.SessionAuthorizedToken, oauthToken) + ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) + ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) + ctx.Request = httptest.NewRequest(http.MethodPost, fmt.Sprintf("http://localhost:8080/%s", statuses.BasePath), nil) // the endpoint we're hitting + ctx.Request.Header.Set("accept", "application/json") + configure(ctx.Request) + suite.statusModule.StatusCreatePOSTHandler(ctx) + + suite.EqualValues(http.StatusOK, recorder.Code) + + result := recorder.Result() + defer result.Body.Close() + b, err := ioutil.ReadAll(result.Body) + suite.NoError(err) + + statusReply := &apimodel.Status{} + err = json.Unmarshal(b, statusReply) + suite.NoError(err) + + suite.Equal("<p>this is a status with a poll!</p>", statusReply.Content) + suite.Equal(apimodel.VisibilityPublic, statusReply.Visibility) + if suite.NotNil(statusReply.Poll) { + if suite.Len(statusReply.Poll.Options, 2) { + suite.Equal("first option", statusReply.Poll.Options[0].Title) + suite.Equal("second option", statusReply.Poll.Options[1].Title) + } + suite.NotZero(statusReply.Poll.ExpiresAt) + suite.False(statusReply.Poll.Expired) + suite.True(statusReply.Poll.Multiple) + } +} + +func (suite *StatusCreateTestSuite) TestPostNewStatusWithPollForm() { + suite.testPostNewStatusWithPoll(func(request *http.Request) { + request.Form = url.Values{ + "status": {"this is a status with a poll!"}, + "visibility": {"public"}, + "poll[options][]": {"first option", "second option"}, + "poll[expires_in]": {"3600"}, + "poll[multiple]": {"true"}, + } + }) +} + +func (suite *StatusCreateTestSuite) TestPostNewStatusWithPollJSON() { + suite.testPostNewStatusWithPoll(func(request *http.Request) { + request.Header.Set("content-type", "application/json") + request.Body = io.NopCloser(strings.NewReader(`{ + "status": "this is a status with a poll!", + "visibility": "public", + "poll": { + "options": ["first option", "second option"], + "expires_in": 3600, + "multiple": true + } + }`)) + }) +} + func TestStatusCreateTestSuite(t *testing.T) { suite.Run(t, new(StatusCreateTestSuite)) } diff --git a/internal/api/client/timelines/tag.go b/internal/api/client/timelines/tag.go index 0d95a6c58..e66955a73 100644 --- a/internal/api/client/timelines/tag.go +++ b/internal/api/client/timelines/tag.go @@ -26,7 +26,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/oauth" ) -// HomeTimelineGETHandler swagger:operation GET /api/v1/timelines/tag/{tag_name} tagTimeline +// TagTimelineGETHandler swagger:operation GET /api/v1/timelines/tag/{tag_name} tagTimeline // // See public statuses that use the given hashtag (case insensitive). // @@ -49,6 +49,12 @@ import ( // // parameters: // - +// name: tag_name +// type: string +// description: Name of the tag +// in: path +// required: true +// - // name: max_id // type: string // description: >- diff --git a/internal/api/model/account.go b/internal/api/model/account.go index 46b043f80..7d3fa4b62 100644 --- a/internal/api/model/account.go +++ b/internal/api/model/account.go @@ -170,7 +170,7 @@ type UpdateCredentialsRequest struct { // UpdateSource is to be used specifically in an UpdateCredentialsRequest. // -// swagger:model updateSource +// swagger:ignore type UpdateSource struct { // Default post privacy for authored statuses. Privacy *string `form:"privacy" json:"privacy"` @@ -185,7 +185,7 @@ type UpdateSource struct { // UpdateField is to be used specifically in an UpdateCredentialsRequest. // By default, max 6 fields and 255 characters per property/value. // -// swagger:model updateField +// swagger:ignore type UpdateField struct { // Key this form field was submitted with; // only set if it was submitted as JSON. diff --git a/internal/api/model/announcement.go b/internal/api/model/announcement.go index f2b3b102c..f776ecf92 100644 --- a/internal/api/model/announcement.go +++ b/internal/api/model/announcement.go @@ -19,7 +19,7 @@ package model // Announcement models an admin announcement for the instance. // -// swagger:model announcement +// TODO: swagger:model announcement once announcement API is supported type Announcement struct { // The ID of the announcement. // example: 01FC30T7X4TNCZK0TH90QYF3M4 diff --git a/internal/api/model/announcementreaction.go b/internal/api/model/announcementreaction.go index a77e13bf6..f0a7006e9 100644 --- a/internal/api/model/announcementreaction.go +++ b/internal/api/model/announcementreaction.go @@ -19,7 +19,7 @@ package model // AnnouncementReaction models a user reaction to an announcement. // -// swagger:model announcementReaction +// TODO: swagger:model announcementReaction once announcement API is supported type AnnouncementReaction struct { // The emoji used for the reaction. Either a unicode emoji, or a custom emoji's shortcode. // example: blobcat_uwu diff --git a/internal/api/model/domain.go b/internal/api/model/domain.go index a5e1ddf10..ddc96ef05 100644 --- a/internal/api/model/domain.go +++ b/internal/api/model/domain.go @@ -65,7 +65,7 @@ type DomainPermission struct { // DomainPermissionRequest is the form submitted as a POST to create a new domain permission entry (allow/block). // -// swagger:model domainPermissionCreateRequest +// swagger:ignore type DomainPermissionRequest struct { // A list of domains for which this permission request should apply. // Only used if import=true is specified. @@ -87,9 +87,9 @@ type DomainPermissionRequest struct { PublicComment string `form:"public_comment" json:"public_comment" xml:"public_comment"` } -// DomainBlockCreateRequest is the form submitted as a POST to /api/v1/admin/domain_keys_expire to expire a domain's public keys. +// DomainKeysExpireRequest is the form submitted as a POST to /api/v1/admin/domain_keys_expire to expire a domain's public keys. // -// swagger:model domainKeysExpireRequest +// swagger:parameters domainKeysExpire type DomainKeysExpireRequest struct { // hostname/domain to expire keys for. Domain string `form:"domain" json:"domain" xml:"domain"` diff --git a/internal/api/model/emoji.go b/internal/api/model/emoji.go index acf1f1332..cebc38196 100644 --- a/internal/api/model/emoji.go +++ b/internal/api/model/emoji.go @@ -42,7 +42,7 @@ type Emoji struct { // EmojiCreateRequest represents a request to create a custom emoji made through the admin API. // -// swagger:model emojiCreateRequest +// swagger:ignore type EmojiCreateRequest struct { // Desired shortcode for the emoji, without surrounding colons. This must be unique for the domain. // example: blobcat_uwu @@ -56,7 +56,7 @@ type EmojiCreateRequest struct { // EmojiUpdateRequest represents a request to update a custom emoji, made through the admin API. // -// swagger:model emojiUpdateRequest +// swagger:ignore type EmojiUpdateRequest struct { // Type of action. One of disable, modify, copy. Type EmojiUpdateType `form:"type" json:"type" xml:"type"` diff --git a/internal/api/model/headerfilter.go b/internal/api/model/headerfilter.go index 96ba819f5..0800adeb2 100644 --- a/internal/api/model/headerfilter.go +++ b/internal/api/model/headerfilter.go @@ -18,6 +18,8 @@ package model // HeaderFilter represents a regex value filter applied to one particular HTTP header (allow / block). +// +// swagger:model headerFilter type HeaderFilter struct { // The ID of the header filter. // example: 01FBW21XJA09XYX51KV5JVBW0F @@ -45,11 +47,15 @@ type HeaderFilter struct { // HeaderFilterRequest is the form submitted as a POST to create a new header filter entry (allow / block). // -// swagger:model headerFilterCreateRequest +// swagger:parameters headerFilterAllowCreate headerFilterBlockCreate type HeaderFilterRequest struct { // The HTTP header to match against (e.g. User-Agent). + // required: true + // in: formData Header string `form:"header" json:"header" xml:"header"` // The header value matching regular expression. + // required: true + // in: formData Regex string `form:"regex" json:"regex" xml:"regex"` } diff --git a/internal/api/model/instancev1.go b/internal/api/model/instancev1.go index b402cdefe..03e27619c 100644 --- a/internal/api/model/instancev1.go +++ b/internal/api/model/instancev1.go @@ -60,7 +60,7 @@ type InstanceV1 struct { // example: 0.1.1 cb85f65 Version string `json:"version"` // Primary language of the instance. - // example: en + // example: ["en"] Languages []string `json:"languages"` // New account registrations are enabled on this instance. Registrations bool `json:"registrations"` diff --git a/internal/api/model/list.go b/internal/api/model/list.go index f897bcc88..03ea3420d 100644 --- a/internal/api/model/list.go +++ b/internal/api/model/list.go @@ -37,7 +37,7 @@ type List struct { // swagger:parameters listCreate type ListCreateRequest struct { // Title of this list. - // example: Cool People + // Sample: Cool People // in: formData // required: true Title string `form:"title" json:"title" xml:"title"` @@ -45,28 +45,35 @@ type ListCreateRequest struct { // followed = Show replies to any followed user // list = Show replies to members of the list // none = Show replies to no one - // example: list + // Sample: list // default: list // in: formData + // enum: + // - followed + // - list + // - none RepliesPolicy string `form:"replies_policy" json:"replies_policy" xml:"replies_policy"` } // ListUpdateRequest models list update parameters. // -// swagger:parameters listUpdate +// swagger:ignore type ListUpdateRequest struct { // Title of this list. - // example: Cool People + // Sample: Cool People // in: formData Title *string `form:"title" json:"title" xml:"title"` // RepliesPolicy for this list. // followed = Show replies to any followed user // list = Show replies to members of the list // none = Show replies to no one + // Sample: list // in: formData RepliesPolicy *string `form:"replies_policy" json:"replies_policy" xml:"replies_policy"` } +// ListAccountsChangeRequest is a list of account IDs to add to or remove from a list. +// // swagger:ignore type ListAccountsChangeRequest struct { AccountIDs []string `form:"account_ids[]" json:"account_ids" xml:"account_ids"` diff --git a/internal/api/model/marker.go b/internal/api/model/marker.go index f2d5cb296..d0d5dc67e 100644 --- a/internal/api/model/marker.go +++ b/internal/api/model/marker.go @@ -18,6 +18,8 @@ package model // Marker represents the last read position within a user's timelines. +// +// swagger:model markers type Marker struct { // Information about the user's position in the home timeline. Home *TimelineMarker `json:"home,omitempty"` diff --git a/internal/api/model/multistatus.go b/internal/api/model/multistatus.go index cac8b4f9b..d58ea8eae 100644 --- a/internal/api/model/multistatus.go +++ b/internal/api/model/multistatus.go @@ -22,7 +22,7 @@ package model // 207 MULTI-STATUS to indicate a mixture of responses. // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/207 // -// swagger:model multiStatus +// TODO: swagger:model multiStatus once domain permissions API supports HTTP 207 type MultiStatus struct { Data []MultiStatusEntry `json:"data"` Metadata MultiStatusMetadata `json:"metadata"` @@ -34,7 +34,7 @@ type MultiStatus struct { // the caller, but at minimum it should be expected to be // JSON-serializable. // -// swagger:model multiStatusEntry +// TODO: swagger:model multiStatusEntry once domain permissions API supports HTTP 207 type MultiStatusEntry struct { // The resource/result for this entry. // Value may be any type, check the docs @@ -49,7 +49,7 @@ type MultiStatusEntry struct { // MultiStatusMetadata models an at-a-glance summary of // the data contained in the MultiStatus. // -// swagger:model multiStatusMetadata +// TODO: swagger:model multiStatusMetadata once domain permissions API supports HTTP 207 type MultiStatusMetadata struct { // Success count + failure count. Total int `json:"total"` diff --git a/internal/api/model/poll.go b/internal/api/model/poll.go index 5603ff222..089dfc0f0 100644 --- a/internal/api/model/poll.go +++ b/internal/api/model/poll.go @@ -73,26 +73,26 @@ type PollOption struct { // PollRequest models a request to create a poll. // -// swagger:model pollRequest +// swagger:ignore type PollRequest struct { // Array of possible answers. // If provided, media_ids cannot be used, and poll[expires_in] must be provided. // name: poll[options] - Options []string `form:"options" json:"options" xml:"options"` + Options []string `form:"poll[options][]" json:"options" xml:"options"` // Duration the poll should be open, in seconds. // If provided, media_ids cannot be used, and poll[options] must be provided. - ExpiresIn int `form:"expires_in" xml:"expires_in"` + ExpiresIn int `form:"poll[expires_in]" xml:"expires_in"` // Duration the poll should be open, in seconds. // If provided, media_ids cannot be used, and poll[options] must be provided. ExpiresInI interface{} `json:"expires_in"` // Allow multiple choices on this poll. - Multiple bool `form:"multiple" json:"multiple" xml:"multiple"` + Multiple bool `form:"poll[multiple]" json:"multiple" xml:"multiple"` // Hide vote counts until the poll ends. - HideTotals bool `form:"hide_totals" json:"hide_totals" xml:"hide_totals"` + HideTotals bool `form:"poll[hide_totals]" json:"hide_totals" xml:"hide_totals"` } // PollVoteRequest models a request to vote in a poll. diff --git a/internal/api/model/report.go b/internal/api/model/report.go index b9b8c77d2..175875204 100644 --- a/internal/api/model/report.go +++ b/internal/api/model/report.go @@ -65,31 +65,31 @@ type Report struct { // swagger:parameters reportCreate type ReportCreateRequest struct { // ID of the account to report. - // example: 01GPE75FXSH2EGFBF85NXPH3KP + // Sample: 01GPE75FXSH2EGFBF85NXPH3KP // in: formData // required: true AccountID string `form:"account_id" json:"account_id" xml:"account_id"` // IDs of statuses to attach to the report to provide additional context. - // example: ["01GPE76N4SBVRZ8K24TW51ZZQ4","01GPE76WN9JZE62EPT3Q9FRRD4"] + // Sample: ["01GPE76N4SBVRZ8K24TW51ZZQ4","01GPE76WN9JZE62EPT3Q9FRRD4"] // in: formData StatusIDs []string `form:"status_ids[]" json:"status_ids" xml:"status_ids"` // The reason for the report. Default maximum of 1000 characters. - // example: Anti-Blackness, transphobia. + // Sample: Anti-Blackness, transphobia. // in: formData Comment string `form:"comment" json:"comment" xml:"comment"` // If the account is remote, should the report be forwarded to the remote admin? - // example: true + // Sample: true // default: false // in: formData Forward bool `form:"forward" json:"forward" xml:"forward"` // Specify if the report is due to spam, violation of enumerated instance rules, or some other reason. // Currently only 'other' is supported. - // example: other + // Sample: other // default: other // in: formData Category string `form:"category" json:"category" xml:"category"` // IDs of rules on this instance which have been broken according to the reporter. - // example: ["01GPBN5YDY6JKBWE44H7YQBDCQ","01GPBN65PDWSBPWVDD0SQCFFY3"] + // Sample: ["01GPBN5YDY6JKBWE44H7YQBDCQ","01GPBN65PDWSBPWVDD0SQCFFY3"] // in: formData RuleIDs []string `form:"rule_ids[]" json:"rule_ids" xml:"rule_ids"` } diff --git a/internal/api/model/rule.go b/internal/api/model/rule.go index f4caf7dd0..b94c502c5 100644 --- a/internal/api/model/rule.go +++ b/internal/api/model/rule.go @@ -27,15 +27,24 @@ type InstanceRule struct { // InstanceRuleCreateRequest represents a request to create a new instance rule, made through the admin API. // -// swagger:model instanceRuleCreateRequest +// swagger:parameters ruleCreate type InstanceRuleCreateRequest struct { - Text string `form:"text" validation:"required"` + // Text body for the instance rule, plaintext. + // required: true + // in: formData + Text string `form:"text" json:"text" validation:"required"` } // InstanceRuleUpdateRequest represents a request to update the text of an instance rule, made through the admin API. // -// swagger:model instanceRuleUpdateRequest +// swagger:parameters ruleUpdate type InstanceRuleUpdateRequest struct { - ID string `form:"id"` - Text string `form:"text"` + // The id of the rule to update. + // required: true + // in: path + ID string `form:"id" json:"id"` + // Text body for the updated instance rule, plaintext. + // required: true + // in: formData + Text string `form:"text" json:"text"` } diff --git a/internal/api/model/status.go b/internal/api/model/status.go index 8ca41c767..fed2cdf37 100644 --- a/internal/api/model/status.go +++ b/internal/api/model/status.go @@ -163,47 +163,33 @@ type StatusReblogged struct { // StatusCreateRequest models status creation parameters. // -// swagger:model statusCreateRequest +// swagger:ignore type StatusCreateRequest struct { // Text content of the status. // If media_ids is provided, this becomes optional. // Attaching a poll is optional while status is provided. - // in: formData Status string `form:"status" json:"status" xml:"status"` // Array of Attachment ids to be attached as media. // If provided, status becomes optional, and poll cannot be used. - // - // If the status is being submitted as a form, the key is 'media_ids[]', - // but if it's json or xml, the key is 'media_ids'. - // - // in: formData MediaIDs []string `form:"media_ids[]" json:"media_ids" xml:"media_ids"` // Poll to include with this status. - // in: formData Poll *PollRequest `form:"poll" json:"poll" xml:"poll"` // ID of the status being replied to, if status is a reply. - // in: formData InReplyToID string `form:"in_reply_to_id" json:"in_reply_to_id" xml:"in_reply_to_id"` // Status and attached media should be marked as sensitive. - // in: formData Sensitive bool `form:"sensitive" json:"sensitive" xml:"sensitive"` // Text to be shown as a warning or subject before the actual content. // Statuses are generally collapsed behind this field. - // in: formData SpoilerText string `form:"spoiler_text" json:"spoiler_text" xml:"spoiler_text"` // Visibility of the posted status. - // in: formData Visibility Visibility `form:"visibility" json:"visibility" xml:"visibility"` // ISO 8601 Datetime at which to schedule a status. // Providing this parameter will cause ScheduledStatus to be returned instead of Status. // Must be at least 5 minutes in the future. - // in: formData ScheduledAt string `form:"scheduled_at" json:"scheduled_at" xml:"scheduled_at"` // ISO 639 language code for this status. - // in: formData Language string `form:"language" json:"language" xml:"language"` // Content type to use when parsing this status. - // in: formData ContentType StatusContentType `form:"content_type" json:"content_type" xml:"content_type"` } @@ -229,7 +215,7 @@ const ( // AdvancedStatusCreateForm wraps the mastodon-compatible status create form along with the GTS advanced // visibility settings. // -// swagger:parameters statusCreate +// swagger:ignore type AdvancedStatusCreateForm struct { StatusCreateRequest AdvancedVisibilityFlagsForm @@ -238,7 +224,7 @@ type AdvancedStatusCreateForm struct { // AdvancedVisibilityFlagsForm allows a few more advanced flags to be set on new statuses, in addition // to the standard mastodon-compatible ones. // -// swagger:model advancedVisibilityFlagsForm +// swagger:ignore type AdvancedVisibilityFlagsForm struct { // This status will be federated beyond the local timeline(s). Federated *bool `form:"federated" json:"federated" xml:"federated"` |